Wednesday 20 December 2017

Moving average excel vba code


Média móvel Este exemplo ensina como calcular a média móvel de uma série temporal no Excel. Um avanço em movimento é usado para suavizar irregularidades (picos e vales) para reconhecer facilmente as tendências. 1. Primeiro, vamos dar uma olhada em nossa série de tempo. 2. No separador Dados, clique em Análise de dados. Observação: não é possível encontrar o botão Análise de dados Clique aqui para carregar o suplemento do Analysis ToolPak. 3. Selecione Média móvel e clique em OK. 4. Clique na caixa Input Range e selecione o intervalo B2: M2. 5. Clique na caixa Intervalo e escreva 6. 6. Clique na caixa Output Range e seleccione a célula B3. 8. Faça um gráfico destes valores. Explicação: porque definimos o intervalo como 6, a média móvel é a média dos 5 pontos de dados anteriores eo ponto de dados atual. Como resultado, os picos e vales são suavizados. O gráfico mostra uma tendência crescente. O Excel não consegue calcular a média móvel para os primeiros 5 pontos de dados porque não existem pontos de dados anteriores suficientes. 9. Repita os passos 2 a 8 para intervalo 2 e intervalo 4. Conclusão: Quanto maior o intervalo, mais os picos e vales são suavizados. Quanto menor o intervalo, mais próximas as médias móveis são para os pontos de dados reais. Tabela média de rolamento Abaixo vamos olhar para um programa no Excel VBA que cria uma tabela média móvel. Coloque um botão de comando na folha de cálculo e adicione a seguinte linha de código: Range (quotB3quot).Value WorksheetFunction. RandBetween (0, 100) Esta linha de código introduz um número aleatório entre 0 e 100 na célula B3. Queremos que o Excel VBA adote o novo valor de estoque e o coloque na primeira posição da tabela de média móvel. Todos os outros valores devem mover para baixo um lugar eo último valor deve ser excluído. Criar um evento de alteração de planilha. Código adicionado ao evento de alteração de planilha será executado pelo Excel VBA quando alterar uma célula de uma folha de cálculo. 2. Faça duplo clique em Folha1 (Folha1) no Project Explorer. 3. Escolha Planilha na lista suspensa à esquerda. Escolha Alterar na lista suspensa direita. Adicione as seguintes linhas de código ao evento de alteração de planilha: 4. Declare uma variável chamada newvalue do tipo Integer 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 Planilha1. Só queremos que o Excel VBA faça algo se algo mudar na célula B3. Para isso, adicione a seguinte linha de código: If Target. Address quotB3quot Then 6. Inicializamos 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 ​​Intervalo (quotD3: D6quot) Definir lastfourvalues ​​Intervalo (quotD4: D7quot) 7. Agora vem o simples truque. Queremos atualizar a tabela de média móvel. Você pode conseguir isso substituindo os quatro últimos 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 se 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. Mover Cálculo Médio Cálculo de Cálculo Móvel Cálculo de Custo Médio Móvel Estou tentando calcular uma média móvel para uma série de dados. Eu quero gerar a média móvel para cada ponto dentro dos dados, para mostrar em um gráfico. Enfim, abaixo é um exemplo do MS Support. Tenho seguido à carta, mas a minha não dá uma média móvel. Ele repete o mesmo ponto de dados uma e outra vez (o primeiro ponto de dados). Então, eu não acredito que a função está encontrando o startdate na linha MyRST. Seek, portanto, apenas retornando o primeiro ponto de dados. Finalmente (talvez vai fazer isso realmente fácil) Estou confuso sobre como os índices de trabalho. Eu pensei que você poderia ter apenas uma chave primária, mas aparentemente você pode criar várias restrições de campo. Eu tentei fazer isso com a seguinte consulta de definição de dados: ALTER TABLE Tabela1 ADD CONSTRAINT NoDupes ÚNICO (CurrencyType, TransactionDate) Desculpe sobre o comprimento desta postagem. Eu aprecio sua ajuda. A função de exemplo a seguir calcula as médias móveis com base em uma tabela com uma chave primária de vários campos. Os valores semanais de moedas estrangeiras são usados ​​para este exemplo. Para criar a função de exemplo, execute estas etapas: Crie a tabela a seguir e salve-a como Table1: Table: Table1 --------------------------- -------------- Nome do Campo: CurrencyType Tipo de Dados da Chave Primária: Tamanho do Campo de Texto: 25 Nome do Campo: TransactionDate Chave Primária Tipo de Dados: Date / Time Formato: Short Date Nome do Campo: Rate Data Type : Currency Decimal Places: 4 Ver a tabela no modo folha de dados e introduza os seguintes valores: CurrencyType TransactionDate Rate ----------------------------- --------------- Yen 8/6/93 0,0079 Yen 8/13/93 0,0082 Yen 8/20/93 0,0085 Yen 8/27/93 0,0088 Yen 9/3/93 0,0091 Mark 8/6/93 0.5600 Mark 8/13/93 0.5700 Mark 8/20/93 0.5800 Mark 8/27/93 0.5900 Mark 9/3/93 0.6000 Abra um novo módulo e digite as seguintes funções: Function MAvgs (Periods As Inteiro, StartDate, TypeName) Dim MyDB como DATABASE, MyRST Como Recordset, MySum como Dim Duplo i, x Set MyDB CurrentDb () Set MyRB MyDB. OpenRecordset (Table1) Em erro Retomar Next MyRST. Index PrimaryKey x Períodos - 1 ReDim Store X) MySum 0 For i 0 To x MyRST. MoveFirst MyRST. Seek, TypeName, StartDate Essas duas variáveis ​​devem estar na mesma ordem que os campos de chave primária em sua tabela. Store (i) MyRSTRate Se eu lt x Em seguida, StartDate StartDate - 7 O 7 aqui assume dados semanais 1 para dados diários. Se StartDate lt 8/6/93 MAvgs Null: Exit Function 8/6/93 for substituído pela data mais antiga dos dados na tabela. MySum Store (i) MySum Próxima i MAvgs MySum / Períodos MyRST. Close End Function Crie a seguinte consulta com base na tabela Table1: Query: Query1 -------------------- ----------------------------------- Campo: CurrencyType Campo: TransactionDate Campo: Rate Campo: Expr1: MAvgs ( 3, TransactionDate, CurrencyType) NOTA: Esta consulta irá gerar uma média móvel de três semanas dos dados da taxa. Para calcular uma média móvel mais longa ou mais curta, altere o número 3 na coluna de consultas Expr1 para o valor que deseja calcular. Execute a consulta. Observe que você vê a média móvel de três semanas seguinte para cada moeda. Um valor Nulo indica que não havia valores anteriores suficientes para calcular essa média de semanas. CurrencyType TransactionDate Taxa Expr1 Marca 08/06/93 0,5600 Marca 08/13/93 0,5700 Marca 08/20/93 0,5800 0,57 Marca 08/27/93 0,5900 0,58 Marca 09/03/93 0,6000 0,59 Yen 08/06/93 0,0079 Yen 08/13/93 0,0082 Yen 08/20/93 0,0085 0,0082 Yen 08/27/93 0,0088 0,0085 Yen 09/03/93 0,0091 0,0088 RE: Moving Average Cálculo dhookom (Programador) 28 Jun 10 21:15 Quantos anos tem esse código Ele não usa explicitamente DAO e não menciona que isso não funcionará com tabelas vinculadas. Dim MyDB como DAO. Database, MyRST como DAO. Recordset. Eu usaria uma subconsulta em vez de um conjunto de registros. Ele pode parecer algo como: SELECT CurrencyType, TransactionDate, Rate, (SELECT Avg (Taxa) FROM Tabela1 B WHERE A. CurrencyType B. CurrencyType E A. TransactionDate ENTRE B. TransactionDate - 14 E B. TransactionDate) FROM Tabela1 A RE: Moving Cálculo médio Isso é realmente perfeito. Eu realmente aprecio sua ajuda. No entanto, o código que você deu é calcular a média móvel de 14 dias para a frente (colocando a média móvel no registro para o dia 1 da média, onde eu queria que ela fosse uma média para trás, colocada no registro 14). Eu mudei apenas ligeiramente para o seguinte e ele parece estar trabalhando SELECT A. CurrencyType, A. TransactionDate, A. Rate, (SELECT Avg (Rate) FROM Tabela1 B WHERE A. CurrencyType B. CurrencyType E B. TransactionDate ENTRE A. TransactionDate - 14 AND A. TransactionDate) AS Expr1 FROM Table1 AS A Você pode ver, tudo o que fiz foi trocar A por B na cláusula where. Esta é uma ajuda muito grande para mim e eu realmente aprecio isso. Eu não vi codificação como esta antes, e honestamente, eu realmente não entendo. Eu não sei como o SQL entende o que B e A são. Estou assumindo que eles estão criando algum tipo de referência alternativa para Table1. Se você pode dar qualquer orientação eu realmente aprecio isso. Além disso, talvez alguma referência ao material que eu poderia olhar Estou sempre muito animado para aprender algo novo sobre VBA / SQL, e eu realmente aprecio a sua ajuda RE: Moving Average Cálculo PHV (MIS) 29 Jun 10 12:22 compreende o que B E A são eles são alias es RE: Cálculo de Moving Average Obrigado, PHV. É fazer sentido melhor já RE: Moving Average Cálculo joshery420 (TechnicalUser) 6 Jul 10 15:06 Uau, nunca olhou SQL vista antes. Extremamente útil. Estou tentando obter este código para funcionar no meu próprio conjunto de dados e Im preso em um problema específico. Pd2004, não tenho certeza se o novo código de subconsulta funcionou o mesmo que o seu antigo código VBA ou não, mas com os meus dados ainda mostra a média de rolamento, mesmo se não houver dias suficientes para criar esse comprimento de uma média. por exemplo. Se Im executando uma média de rolamento de 7 dias, o dia 1 mostra os mesmos dados na coluna 7DayAvg como na coluna de dados diários. Dia 2 mostraria a média dos dias 1 e 2, etc. Qualquer um de vocês sabe como corrigir isso por acaso Também, obrigado pela grande dica de código PHV. RE: Moving Average Cálculo joshery420 (TechnicalUser) 6 Jul 10 15:08 Woops, significava agradecer dhookom para a dica de código, não PHV. Mas hey, obrigado a ambos. XD RE: Moving Average Calculation Vou deixar as melhores soluções para os profissionais aqui, mas você pode ver no meu post original como o exemplo da Ajuda da Microsoft tenta lidar com isso. Aqui está o código: Se StartDate lt 8/6/93 MAvgs Null: Exit Function 8/6/93 é substituído pela data mais antiga dos dados na tabela. Eles estão apenas saindo da função se a data não caber os critérios. Eu não sei se você poderia incorporar algo assim no código de aliases fornecido pelo dhookem. Eu não gosto da sua maneira de lidar com isso, e eu suspeito que dhookem irá fornecer uma solução muito mais elegante. Para meus propósitos a questão que você está descrevendo não é uma preocupação, mas eu estarei interessado em ver quaisquer soluções. RE: Moving Average Cálculo dhookom (Programmer) 6 Jul 10 17:05 Você pode tentar usar IIf () para testar uma contagem do número de registros. Cuidado: código de bloco de notas não testado segue: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF ((SELECT Contagem (Taxa) FROM Table1 C WHERE A. CurrencyType C. CurrencyType E C. TransactionDate ENTRE A. TransactionDate - 14 AND A. TransactionDate) 7, (SELECT Avg (Taxa) FROM Table1 B WHERE A. CurrencyType B. CurrencyType E B. TransactionDate ENTRE A. TransactionDate - 14 AND A. TransactionDate), Null) AS Expr1 FROM Tabela1 como A RE: Moving Average Cálculo

No comments:

Post a Comment