web-dev-qa-db-fra.com

comment parcourir des colonnes de lignes dans une macro Excel VBA

Bonjour, j'essaie de créer une macro comportant une boucle qui copie une fonction dans la colonne 1 (VOL) et une autre dans la colonne 2 (CAPACITY) pour chaque station. C'est ce que j'ai jusqu'à présent:

Sub TieOut()
    Dim i  As Integer
    Dim j As Integer

    For i = 1 To 3
        For j = 1 To 3
            Worksheets("TieOut").Cells(i, j).Value = "'=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A9,"m/dd/yyyy"),'ZaiNet Data'!$C$1:$C$39038,0), 4)"
        Next j
    Next i

End Sub

L'image de ce que je veux est ci-dessous: Vous pouvez voir que j'ai copié et collé manuellement mes deux fonctions dans chaque colonne. J'ai juste besoin d'une macro qui puisse la parcourir en boucle.

alt text http://i26.tinypic.com/nz4lfn.jpg

La fonction que je veux lire en boucle dans la colonne VOL pour chaque station est:

=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C$1:$C$39038,0), 4)

La fonction que je veux lire en boucle dans la colonne CAPACITY pour chaque station est:

=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C$1:$C$39038,0), 5)

Quelqu'un pourrait-il s'il vous plaît aider? Je vous remercie!

METTRE À JOUR

**** Comment faire en sorte que la boucle s'exécute automatiquement sans avoir à entrer manuellement la formule dans les deux premières cellules et à cliquer sur macro?
De plus, comment puis-je faire en sorte que la boucle parcourt toutes les colonnes/lignes? (horizontalement) ****

J'ai inclus deux captures d'écran pour montrer ce que je veux dire. Vous trouverez ci-dessous le code actuel . texte alt. Http://i26.tinypic.com/i3gw9g.jpgtexte alt. Http://i29.tinypic.com/8izl.jpg Merci!

    Sub Loop3()
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(-1, 1).Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, -1).Select

    Dim i  As Integer
    Dim j As Integer
        With Worksheets("Loop")
            i = 1
            Do Until .Cells(10, i).Value = "blank"
                For j = 1 To 10
                    .Cells(j, i).Formula = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!E$7&TEXT(Loop!$A9,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)"
                    .Cells(j, i + 1).Formula = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!E$7&TEXT(Loop!$A9,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"
                Next j
                i = i + 2
            Loop
    End With

    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(-1, 1).Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, -1).Select

End Sub
9
Techgirl09

Voici ma suggestion:

Dim i As integer, j as integer

With Worksheets("TimeOut")
    i = 26
    Do Until .Cells(8, i).Value = ""
        For j = 9 to 100 ' I do not know how many rows you will need it.'
            .Cells(j, i).Formula = "YourVolFormulaHere"
            .Cells(j, i + 1).Formula = "YourCapFormulaHere"
        Next j

        i = i + 2
    Loop
 End With
6
Wilhelm

Essaye ça:

Créez une macro avec la chose suivante à l'intérieur:

Selection.Copy
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
ActiveCell.Offset(-1, 1).Select
Selection.Copy
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
ActiveCell.Offset(0, -1).Select

Cette macro particulière copiera la cellule actuelle (placez votre curseur dans la cellule VOL que vous souhaitez copier) sur une ligne, puis copiez également la cellule CAP.

Il ne s’agit que d’une boucle unique. Vous pouvez donc automatiser la copie de VOL et CAP de l’emplacement de votre cellule active actuelle (où se trouve votre curseur) vers le bas d’une ligne.

Il suffit de le placer dans une instruction de boucle For pour le faire x nombre de fois ..__ comme:

For i = 1 to 100 'Do this 100 times
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(-1, 1).Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, -1).Select
Next i
1
Jimmy Chandra

Celui-ci est similaire à la solution de @ Wilhelm. La boucle s'automatise en fonction d'une plage créée en évaluant la colonne de date renseignée. Cela a été giflé ensemble strictement sur la base de la conversation et des captures d'écran.

Remarque: ceci suppose que les en-têtes seront toujours sur la même ligne (ligne 8). Si vous modifiez la première ligne de données (en déplaçant l'en-tête vers le haut ou le bas), l'automatisation de la plage sera interrompue à moins que vous ne modifiiez le bloc de la plage pour qu'il prenne la ligne d'en-tête de manière dynamique. D'autres hypothèses incluent que les en-têtes de colonne des formules VOL et CAPACITY sont respectivement nommés "Vol" et "Cap".

Sub Loop3()

Dim dtCnt As Long
Dim rng As Range
Dim frmlas() As String

Application.ScreenUpdating = False

'The following code block sets up the formula output range
dtCnt = Sheets("Loop").Range("A1048576").End(xlUp).Row              'lowest date column populated
endHead = Sheets("Loop").Range("XFD8").End(xlToLeft).Column         'right most header populated
Set rng = Sheets("Loop").Range(Cells(9, 2), Cells(dtCnt, endHead))  'assigns range for automation

ReDim frmlas(1)      'array assigned to formula strings
    'VOL column formula
frmlas(0) = "VOL FORMULA"
    'CAPACITY column formula
frmlas(1) = "CAP FORMULA"

For i = 1 To rng.Columns.count
If rng(0, i).Value = "Vol" Then         'checks for volume formula column
    For j = 1 To rng.Rows.count
        rng(j, i).Formula= frmlas(0)    'inserts volume formula
    Next j
ElseIf rng(0, i).Value = "Cap" Then     'checks for capacity formula column
    For j = 1 To rng.Rows.count
        rng(j, i).Formula = frmlas(1)   'inserts capacity formula
    Next j
End If
Next i

Application.ScreenUpdating = True

End Sub
1
Jomtung

Je recommanderais la méthode AutoFillde l'objet Range pour cela:

rngSource.AutoFill Destination:=rngDest

Spécifiez la plage source contenant les valeurs ou les formules que vous souhaitez renseigner, ainsi que la plage Destination en tant que plage complète dans laquelle vous souhaitez que les cellules soient remplies. La plage de destination doit inclure la plage source. Vous pouvez remplir aussi bien que vers le bas.

Cela fonctionne exactement de la même manière que si vous "glissiez" manuellement les cellules du coin avec la souris; Les formules absolues et relatives fonctionnent comme prévu.

Voici un exemple:

'Set some example values'
Range("A1").Value = "1"
Range("B1").Formula = "=NOW()"
Range("C1").Formula = "=B1+A1"

'AutoFill the values / formulas to row 20'
Range("A1:C1").AutoFill Destination:=Range("A1:C20")

J'espère que cela t'aides.

0
Nossidge