Eu quero calcular uma média móvel do último, digamos 20, números de uma coluna. Um problema é que algumas das células da coluna podem estar vazias, elas devem ser ignoradas. Exemplo: uma média móvel dos últimos três seria (155167201) 3. Eu tentei implementar isso usando média, offset, índice, mas eu simplesmente não sei como. Estou um pouco familiarizado com as macros, então essa solução funcionaria bem: MovingAverage (A13) Obrigado por quaisquer dicas ou soluções solicitadas 12 de março 11 às 15:36 Digite isso com controlshiftenter para torná-lo uma fórmula de matriz. Isto irá encontrar os últimos três valores. Se quiser mais ou menos, mude as duas instâncias de 3 na fórmula para o que quiser. Esta parte retorna o 4º número de linha mais alta de todas as células que possuem um valor ou 5 no seu exemplo porque as linhas 6, 8 e 9 são as linhas 1 a 3 maiores com um valor. Esta parte retorna 9 TRUEs ou FALSEs com base em se o número da linha é maior do que o 4º maior. Isso multiplica os valores em A1: A9 por esses 9 TRUEs ou FALSEs. TRUEs são convertidos para 1 e FALSEs para zero. Isso deixa uma função SUM como esta, porque todos os valores acima de 155 não satisfazem o critério do número da linha, o aumento multiplicado por zero. Escrevi um pequeno script no VBA. Espero que faça o que quiser. Aqui você está: 1) Eu estabeleci o limite para 360 células. Isso significa que o script não procurará mais do que 360 células. Se você deseja alterá-lo, mude o valor inicial do contador. 2) O script retorna a média não arredondada. Altere a última linha para MovingAverage Round (CDbl (tmp i), 2) 3) O uso é exatamente como você queria, então digite MovingAverage (a13) na célula. Todos os comentários são bem-vindos. Tabela Média Reduzida Abaixo, examinaremos um programa no Excel VBA que cria uma tabela média móvel. Coloque um botão de comando em sua planilha e adicione a seguinte linha de código: Range (quotB3quot).Value WorksheetFunction. RandBetween (0, 100) Esta linha de código insere um número aleatório entre 0 e 100 na célula B3. Queremos que o Excel VBA tire o novo valor de estoque e coloque-o na primeira posição da tabela de média móvel. Todos os outros valores devem mover para baixo um local e o último valor deve ser excluído. Crie um evento de alteração de planilha. O código adicionado ao Evento de Mudança da Planilha será executado pelo Excel VBA quando você alterar uma célula em uma planilha. 2. Clique duas vezes em Sheet1 (Sheet1) no Project Explorer. 3. Escolha a Planilha na lista suspensa à esquerda. Escolha Alterar na lista suspensa direita. Adicione as seguintes linhas de código ao Evento de Mudança da Planilha: 4. Declare uma variável chamada newvalue do tipo Inteiro e dois intervalos (firstfourvalues e lastfourvalues). Dim newvalue As Integer. Firstfourvalues As Range, lastfourvalues As Range 5. O Evento de Mudança de Planilha escuta todas as alterações na Sheet1. Só queremos que o Excel VBA faça algo se algo mudar na célula B3. Para conseguir isso, adicione a seguinte linha de código: Se Target. Address quotB3quot Then 6. Inicializamos o newvalue com o valor da célula B3, firstfourvalues com Range (quotD3: D6quot) e lastfourvalues com Range (quotD4: D7quot). Newvalue Range (quotB3quot).Value Set firstfourvalues Range (quotD3: D6quot) Defina lastfourvalues Range (quotD4: D7quot) 7. Agora vem o truque simples. Queremos atualizar a tabela de média móvel. Você pode conseguir isso substituindo os últimos quatro valores pelos primeiros quatro valores da tabela e colocando o novo valor de estoque na primeira posição. Lastfourvalues. Value firstfourvalues. Value Range (quotD3quot).Value newvalue 8. Não esqueça de fechar a instrução if. 9. Finalmente, digite a fórmula MÉDIA (D3: D7) na célula D8. 10. Teste o programa clicando no botão de comando. Sempre usei referências de intervalo em planilhas para cálculos, mas agora estou começando a usar arrays para trabalhar com dados, por quanto eles podem ser mais rápidos. Eu vou lidar com bilhões de cálculos, então eu preciso fazer o máximo possível na memória. No trecho de código fornecido, estou tentando obter SMAMINArray para calcular uma média móvel de 50 períodos dos 50 valores anteriores da matriz chamada vArray. Alguém sabe como consegui-lo. Aqui está o que eu tenho até agora, e não consigo fazer isso funcionar. A Soma (vArray (j, j49) 50) é o culpado. Eu sei que não está certo, mas eu precisava colocar uma ideia para alguém com uma experiência muito maior do que eu para interpretar o que eu realmente quero. Eu simplesmente não sei como traduzir isso em somar os itens 1 a 50 e dividir o total em 50. E o segundo elemento do SMAMINArray calcularia então a média dos elementos 2 a 51, etc. Qualquer idéia Aqui está um trecho de algum código Que eu tentei: (Se você mora em Dallas, vou comprar uma bebida de sua escolha para obter ajuda sobre este problema) perguntou 18 de março 15 às 3:41 A macro abaixo mostra como alcançar o resultado que eu acredito que você procura. Eu configurei a célula A1 da planilha MoveAvg para Rand () 1000. Arrastei isso para a célula A1500. Eu fiz um Paste Special of Values apenas para esse intervalo para que os valores aleatórios fossem corrigidos. Eu ajuste Cell C50 para a média de Cells A1: 50. Arrastei isso para baixo. Eu corri a macro abaixo que cria uma matriz contendo as médias móveis. Esta matriz é escrita na coluna E a partir da linha 50. A imagem abaixo mostra que os valores calculados pelo Excel correspondem aos calculados pela macro. No entanto, o VBA não é o idioma a ser usado, você está executando bilhões de cálculos. Respondi a uma pergunta recente que envolveu o cálculo de 8.063 milhões de valores e a sua escrita no disco com 1 milhão de valores por arquivo. Cálculo e economia de 50 milhões de valores com VBA levou 13 minutos, 15 segundos. A multiplicação sugere um tempo total para todos os 8,063 milhões de valores de quase 14 dias, 20 horas. Com o VB. Net, calcular e armazenar todos os 8,063 milhões de valores demorou 51 minutos. Ler e escrever em um livro do Excel com o VB. Net é mais lento que com o VBA. Mas uma vez que os dados estão dentro dos arrays VB. Net, os cálculos são milhares de vezes mais rápidos. O VB. Net é uma atualização do VBA para que a curva de aprendizado não seja íngreme. A versão Express do VB. Net é gratuita e você pode distribuir qualquer programa que você escreva se você se registrar. Eu deixo você para pensar sobre isso.
No comments:
Post a Comment