Sunday, 1 January 2017

Moving Average Excel Vba Code

Ce message contient des liens vers deux exemples de fichiers xls qui affichent à la fois des calculs basés sur VBA et sur la formule pour l'indicateur MACD ou la Divergence de Convergence Moyenne Mouvante. Les deux fichiers contiennent exactement le même ensemble de données Open High Low Close. La version basée sur la formule est plus facile à comprendre et sert comme un moyen de vérifier que le code VBA que j'ai écrit est correct. Les deux méthodes donnent le même résultat. L'avantage majeur de l'utilisation de VBA est que les paramètres MACD peuvent être facilement modifiés à partir des zones d'entrée. En outre, la méthode VBA ne montre que le résultat final plutôt que de prendre cinq colonnes. La version basée sur VBA peut être téléchargée ici. La version de la formule peut être téléchargée ici. Ci-dessous est le code de la version basée sur VBA. Sub ETmacd () écrit par Exceltrader exceltrader. net Dim EMAslow As Double. EMAf As t As Double. Ws comme feuille de calcul, LR As Integer Dim eMaF () comme double. EMaS () comme double. EMAdif (), emaPer () comme double. MacDper comme double. COUNT As Integer Dim DataRange Comme Range Dim ExPSlowWeight As Double Dim ExPFastWeight As Double Dim PerWeight As Double 160160The ci-dessous trois lignes sont le MACD de 160160The les valeurs peuvent soit être modifiés ici ou décommentez les lignes de InputBox soient invités. EMAslow 13 InputBox (Invite: Entrée Macd Paramètres rapides., Titre: MACD Fast, Par défaut: 5) MacDper 6 InputBox (Invite: Enter Macd Paramètres de période., Titre: Période MACD, Par défaut: 6) ExPSlowWeight 2 (EMAslow 1) PerWeight 2 (MacDper 1) ExPFastWeight 2 (EMAfAst 1) Définissez ws ThisWorkbook. Worksheets (VBA) ou utilisez le nom exact de la feuille par exemple ThisWorkbook. worksheet ( Sheet1) slow 160160160160 Avec ws 160160160160LR. Cells (Rows. coUnt, A).End (xlUp).Row 160160160160160160160160 Pour chaque DataRange Dans ws. Range (.Cells (2, A). Cellules (LR, A)) 160160160160160160160160coUnt DataRange. rangée 1 160160160160160160160160 remplir Array lente EMA 160160160160160160160160 ReDim Preserve EMAS (1 à COUNT) 160160160160160160160160160160160160160160160160 Si count EMAslow 1 Ensuite 160160160160160160160160160160160160160160160160160160160160 obtenir la première valeur qui est la moyenne mobile simple 160160160160160160160160160160160160160160160160160160160160 EMAS (COUNT) Application. Average (ws. Range (.Cells ( 2, E). Les cellules (COUNT, E))) 160160160160160160160160160160160160160160160160 ElseIf COUNT EMAslow Puis 160160160160160160160160160160160160160160160160160160160160eMaS (COUNT) (.Cells (COUNT, E) ExPSlowWeight) (EMAS (COUNT - 1) (1 - ExPSlowWeight)) 160160160160160160160160160160160160160160160160 End If 160160160160160160160160 Suivant DataRange rapide 160160160160160160160160 Pour chaque DataRange Dans ws. Range (.Cells (2, A). les cellules (LR, A)) 160160160160160160160160coUnt DataRange. Row 1 160160160160160160160160 remplir le tableau lente 160160160160160160160160 ReDim Preserve EMA EMAF (1 à COUNT) 160160160160160160160160160160160160160160160160 Si count EMAfAst 1 Ensuite 160160160160160160160160160160160160160160160160160160160160 obtenir le première valeur qui est la moyenne mobile simple 160160160160160160160160160160160160160160160160160160160160 EMAF (COUNT) Application. Average (ws. Range (.Cells (2, E). les cellules (COUNT, E))) 160160160160160160160160160160160160160160160160 ElseIf COUNT EMAfAst Puis 160160160160160160160160160160160160160160160160160160160160eMaF (COUNT) (.Cells ( COUNT, E) ExPFastWeight) (EMAF (COUNT - 1) (1 - ExPFastWeight)) 160160160160160160160160160160160160160160160160 End If 160160160160160160160160 Suivant DataRange 160160160160160160160160 ReDim Preserve EMAdif (EM Seulement Pour UBound (EMAF)) 160160160160160160160160160160160160 Pour COUNT EM Seulement 1 Pour UBound (EMAF ) 160160160160160160160160160160160160160160160160EMAdif (coUnt) eMaF (coUnt) - eMaS (coUnt) 160160160160160160160160160160160160 Prochaine session MacD Période 160160160160160160160160 Dim x As Integer. Y En entier. Z Entier. Avee As Double 160160160160160160160160y EMAslow MacDper - 1 160160160160160160160160160160160160 Pour xy Pour UBound (EMAdif) - 2 160160160160160160160160160160160160160160160160 obtenir le SMA pour la première valeur 160160160160160160160160160160160160160160160160 Si xy Ensuite 160160160160160160160160160160160160160160160160160160160160160160160160 Pour z EMAslow 1 Pour EMAslow MacDper160160 (EMAslow MacDper - 1) 160160160160160160160160160160160160160160160160160160160160160160160160Ave Ave EMAdif (z) 160160160160160160160160160160160160160160160160160160160160160160160160 z Suivant 160160160160160160160160160160160160160160160160160160160160160160160160 ReDim emaPer (x Pour LR) 160160160160160160160160160160160160160160160160160160160160160160160160emaPer (x) Ave MacDper 160160160160160160160160160160160160160160160160 ElseIf xy Puis 160160160160160160160160160160160160160160160160emaPer (x) (EMAdif (x 1) PerWeight) (emaPer (x - 1) (1 - PerWeight)) 160160160160160160160160160160160160160160160160 Fin Si 160160160160160160160160160160160160 Suivant X 160160x Vider: z Vide 160160x LBound (emaPer) 160160y UBound (emaPer) 160160 Pour zx To y - 1 160160.Cells (z 1, J) EMAdif (z 1) - emaPer (z) 160160 Suivant z End With End Sub écrit par Exceltrader exceltrader. net Kebaya Mwamba dit: itjockey, Cette version VBA montrera le MACD, la ligne de signal et l'histogramme. La version à base de formule montre également ces valeurs. Le code modifié est l'addition de la 7ème et 8ème ligne en dessous 160160x Vide: y Vide: z Vide 160160x LBound (emaPer) 160160y UBound (emaPer) 160160.Cellules (x, L) MACD Histogramme. Cellules (x, K) Ligne de signal. Cellules (x, J) MACD 160160 Pour zx To y - 1 160160.Cellules (z 1, L) EMAdif (z 1) - emaPer (z) 160160.Cellules (z 1, K) emaPer (z) 160160.Cells Z 1, J) EMAdif (z 1) 160160 Suivant z End With End Sub écrit par Exceltrader exceltrader. net Bonjour, J'essaie de changer de EMAslow 13 InputBox (Invite: Entrée Macd Lente., Titre: MACD SLOW, Par défaut: 13 ) Entrée MacDper 6 InputBox (Invite: Entrez les paramètres de la période Macd., Titre: Période MACD, Par défaut: 6 à SlowMa InputBox (Invite: Saisissez le Slow Moving MA.) FastMa InputBox (Invite: Entrez le MA de déplacement rapide). Entrée MACDtime (Invite: Entrez la période MACD totale.) Avec 13. 5, 6 entrée alors la sortie apparaît énormément différente de la précédente. Vous pouvez contrôler les paramètres MACD en entrant vos paramètres dans les boîtes de saisie en modifiant le code comme suit: EMAslow InputBox (Invite: Entrez Macd Paramètres lents., Titre: MACD SLOW, Par défaut: 13) EMAfAst InputBox (Invite: Entrez Macd Paramètres rapides., Titre: MACD Fast, Par défaut: 5) MacDper InputBox (Invite: Entrez Macd Période paramètres., Titre: MACD Période, Par défaut: 6) Je continue à voir des exemples où les données sont statique. Que diriez-vous où les données continuent à changer tous les 5 min par exemple et c'est seulement une cellule unique qui continue à changer. Vous devez alors toujours copier la valeur de cette cellule à différentes cellules afin que vous puissiez effectuer les calculs pour déterminer les valeurs macd. Je veux tout faire en vba. Je ne veux pas copier des valeurs à d'autres cellules dans une feuille de calcul. Est-ce possible, je voudrais savoir si une erreur sur les codes suivants ou non. Avez-vous des suggestions Merci à l'avance pour toute suggestion Erreur. EMpPer (x) (EMAdif (x 1) PerWeight) (emaPer (x - 1) (1 - PerWeight)) Correct. Si je tente d 'utiliser votre macba vba et de changer (.Cells (count, E) par exemple en (.Cells (count, E) M) ligne est vide et sera rempli par le début du programme VBA donne l'erreur non-stop où je vais mal dans ce que cela peut être résolu en quelque sorte Formule en Excel (Quelque chose que je ne connaissais jusqu'à hier) Publié Janvier 28, 2010 3:28 UTC UTC Ajay Table formules ont été quelque chose que j'ai découvert récemment. Notre lecteur mb a commenté qu'il préfère convertir une gamme à une table et ensuite employer des formules de table au lieu de gammes nommées. Ce qui m'a obtenu assez curieux pour les explorer plus loin et here8217s ce que j'ai appris. Un tableau dans Excel Un tableau est une fonctionnalité d'Excel qui facilite le formatage et l'analyse d'un ensemble de points de données dans une feuille de calcul. Les tables ont été introduites dans Excel 2007 comme une extension de la fonction 8216Lists8217 dans les versions antérieures. , Vous pouvez également utiliser les formules de table pour extraire des données d'une table. Comment créer une table Dans Excel 2007 et versions ultérieures, tout ce que vous avez à faire pour convertir une plage donnée à une table est de simplement sélectionner la plage, puis cliquez sur le bouton 8216Table8217 sous l'onglet 8216Insert8217 sur le ruban. Mieux encore, comme notre lecteur Sam l'a souligné, utilisez la touche de raccourci CTRL T. Alors qu'est-ce que la table est bonne pour le formatage: modifiez complètement l'aspect et la convivialité de vos données en quelques clics de souris Résumez en ajoutant la ligne pour Total: Activez simplement la case à cocher pour 8216Total Row8217 et vous avez une nouvelle ligne insérée juste en dessous des données Avec les totaux. Exportez et partagez: Exportez et partagez la table avec d'autres utilisateurs à l'aide de SharePoint Fournissez un nom à la table: Vous pouvez donner un nom spécifique à la table (par exemple 8216SalesData8217) et l'utiliser plus tard dans vos formules. Pour donner un nouveau nom à la table, ouvrez le 8216Name Manager8217 sous l'onglet 8216Formulas8217 puis modifiez le nom de la table. Formules de table dans Excel 8220Flaming Bisons. Vous m'avez fait lire tout cela juste pour montrer ce qu'est une table Excel ressemble 8230 Je sais déjà ce qu'il est donc pourquoi don8217t vous venez directement au point 8221 Oh C'était grossier. Personne ne vous a jamais dit que la patience est une vertu royale Table Formules vous permettent d'accéder à la table d'une manière facile et intuitive. Commençons par convertir une plage en table. Lorsque vous créez une nouvelle table, Excel fournira un nom par défaut, dire quelque chose comme 8216Table18217. Cela peut ne pas être le plus intuitif des noms et vous voudrez peut-être le renommer à quelque chose d'autre qui est plus facile à retenir et à comprendre pour les autres. Ouvrez l'onglet 8216Design8217 et remplacer le texte dans la zone 8216Table Name8217 à quelque chose comme 8216sales8217. L'ouverture d'une toute nouvelle boîte de chocolats. Vous pouvez maintenant consulter et utiliser la table entière, les colonnes individuelles, les lignes, la plage de données, les en-têtes ou les totaux dans vos formules. Utilisation d'une colonne spécifique de la table dans une formule Dites que vous vouliez connaître la moyenne de tous les éléments de la colonne 8216Revenue8217. Entrez quelque chose comme AVERAGE (salesRevenue) dans une cellule et sourire. La formule est si intuitive qu'elle n'a guère besoin d'être expliquée. Quoi qu'il en soit, je suis moi-même. La chaîne 8216salesRevenue8217 renvoie les points de données dans la colonne 8216Revenue8217 de la table des ventes. 8216salesTarget8217 aurait fait référence à la colonne 8216Target8217 de la même table. Nous pouvons maintenant utiliser ceci comme n'importe quelle autre gamme dans n'importe quelle formule excel. So MAX (salesRevenue), LARGE (salesRevenue, 5) et COUNT (salesRevenue) sont toutes des formules valides. Utilisation d'une ligne spécifique de la table dans une formule What8217s bon pour une colonne est bon pour la ligne. Format, cependant différent. Pour faire référence à une ligne dans une table, nous utilisons le symbole. Donc, si vous voulez vous référer à la ligne 10e dans le tableau, écrire des ventes dans une cellule dans la 10e rangée. Donc, quelque chose comme countif (sales, 8221ltgt8221) vous donnerait le nombre de cellules non vierges dans la ligne particulière de la table. Si vous copiez la même formule dans la cellule immédiatement inférieure, les valeurs correspondantes de la ligne suivante seront renvoyées 8211 même si la formule n'a pas été modifiée. Utilisation de la table entière dans une formule What8217s bonne pour une colonne et une ligne doit être bonne pour la table Pour se référer à la table entière, utilisez. SalesAll Pour se référer uniquement aux données de la table, utilisez. SalesData Pour se référer aux en-têtes, utilisez. SalesHeaders Utilisation de la formule SUBTOTAL avec la table Une autre caractéristique intéressante de la table est l'utilisation de la fonction SUBTOTAL. La formule SUBTOTAL comporte deux parties 8211, la première indique la formule à utiliser pour l'agrégation et la seconde contient la plage à utiliser. So SUBTOTAL (9, A1: A10) donnerait la somme de la gamme de A1: A10 tandis que SUBTOTAL (1, A1: A10) fournirait la moyenne pour la même plage. En revenant le tableau Excel, vous pouvez agréger sur la table entière (ou une partie de celui-ci) les valeurs en utilisant la formule SUBTOTAL et en lui fournissant la référence à une ligne, une colonne ou la table entière. Comme dans l'exemple ci-dessus, vous pouvez obtenir la moyenne de la colonne 8216Revenue8217 en utilisant SUBTOTAL (1, salesRevenue). Si vous avez remarqué, lorsque nous avons activé l'option 8216Total Row8217, une nouvelle ligne avec le total des colonnes a été ajoutée à la table. Nous pouvons maintenant aller de l'avant et modifier les formules en utilisant l'une des options de formule ci-dessus. Utiliser les totaux pour une colonne particulière dans une formule Pour se référer au total d'une colonne dans le tableau, dites Revenue (Revenus) , Nous pouvons maintenant écrire quelque chose de similaire à salesTotals, Revenue. Notez que la valeur 8216total8217 renvoyée peut ne pas être le total (SUM) mais est déterminée par le paramètre de fonction SUBTOTAL utilisé pour agréger la colonne. Les exemples illustrent cela avec un exemple. Si la formule SUBTOTAL dans la colonne 8216Total Row8217 pour la colonne 8216Revenue8217 contenait un paramètre de fonction d'agrégation avec une valeur de 4, le total aurait retourné la valeur maximale de la colonne. Maintenant, quand quelqu'un veut se référer à ce total en utilisant salesTotals, Revenue, le 8220total8221 retourné ne serait pas une somme de valeurs de colonne, mais le maximum. J'ai le sentiment qu'il y a plus que cela peut être fait avec des formules de table. Avez-vous essayé de les utiliser Soin de partager 29 Commentaires Le Subtotal Fuction acceps aussi 101,1028230109..111 comme paramètres. Cela fonctionne avec les lignes filtrées ainsi que les lignes cachées Les noms de tables sont dynamic8230 mais pas vraiment. Gardez quelques lignes en blanc et ajoutez des données. Supprimez les lignes blanches et la table n'évolue pas sam 8211 Touchez. En effet 101 correspond à 1, 102 à 2 et ainsi de suite. Alors que le premier ignorera les valeurs cachées, le dernier les inclura dans le calcul du sous-total. Écriture utile d'une fonction sous-utilisée. Notez que vous pouvez remplacer les formules de totaux avec ce que vous voulez, vous n'êtes pas coincé avec juste SUBTOTAL. Des choses comme COUNTIFS et SUMIFS peuvent être particulièrement utiles. Vous pouvez toujours vous référer à eux à l'aide de la syntaxe habituelle TableNameTotals, ColumnName et votre formule totale personnalisée survit à la ligne totale étant désactivé et en arrière sur. PCBabe 8211 sur le ruban TableDesign, utiliser 8220convert à range8221, ou juste un clic droit gt table gt convertir en gamme je suis tombé en amour (une exagération) avec la formule de table référencement, puis rapidement eu un divorce en raison de l'incapacité à faire absolu Le référencement de cellules, de lignes ou de colonnes (c'est-à-dire l'équivalent de a1). Comment cela n'a jamais été considéré comme un cas d'utilisation, je ne le sais pas, mais cela a rendu trop ennuyeux à utiliser, donc je devais désactiver ce style de référencement. Comment puis-je absolu une formule de table. Lorsque je glisser une formule de table dans une autre colonne, la formule change. Nom de la table: tblSales stock de vente 2-30 2-33 la formule est. Sum (tblsalessales) après avoir copié ou déplacé horizontalement cette formule, elle est changée en: sum (tblSalesStock) J'ai essayé d'utiliser cette fonction de table en format conditionnel. Le problème est que parfois il accepte, mais ne produit aucun résultat. D'autres fois il donne une erreur. L'absence de documentation adéquate signifie que nous n'avons aucun moyen de revenir sur ou de nous référer. Cette formule était: IF (AND (Table1Cette ligne, Qté AvailableltTable1Cette ligne, Reorder Level, Table1Cette ligne, Qté sur Order0), TRUE, FALSE) Lorsque j'ai mentionné ce problème sur les forums de Microsoft, un MVP m'a demandé de supprimer le IF Clause: quot En supposant que votre syntaxe de table est correcte, (je n'utilise jamais ce référencement structuré), se débarrasser de la fonction IF: ET (Table1This Row, Qty AvailableltTable1This Row, Reorder Level, Table1This Row, Qty On Order0) Si cela doesn039t work then I039d utiliser des références de cellules A1 normales. Je ne peux pas comprendre pourquoi les gens utilisent ce qui précède par rapport à: 8221 Si une fonctionnalité est introduite, pourquoi ne pas élaborer Avez-vous des idées que j'ai essayé d'utiliser la 8220Evaluate formule feature8221, mais même cela montre l'erreur à chaque étape. Je pense que tout le monde en profitera si nous pouvons faire avancer la discussion. Quoi qu'il en soit, merci pour les contributions. Magnifique post de blog Ajay. Je n'avais aucune idée que cela pourrait être fait dans Excel 2007. Je suppose que maintenant que je sais cela, il est temps d'évoluer après l'ancienne méthode de sélection des gammes de cellules tout en créant des formules. Cela rend beaucoup plus sence et ouvre de nouvelles portes. Merci de fournir


No comments:

Post a Comment