web-dev-qa-db-fra.com

Itération de lignes remplies dans Excel à l'aide de VBA

J'essaie donc de parcourir une feuille de calcul dans une feuille de calcul Excel à l'aide de VBA. Je souhaite parcourir chaque ligne, puis chaque colonne et malgré le fait de googler, je ne trouve pas de façon intuitive de le faire.

Je suppose que la première cellule d'une ligne doit être remplie, sinon ce doit être la fin. Je peux appliquer cela

Mon approche actuelle consiste à parcourir les lignes, puis à essayer d'obtenir la valeur de la première cellule, mais je n'arrive pas à le comprendre. J'ai rencontré quelques questions ici et ailleurs qui utilisent des plages et autres, mais rien qui ne m'aide à écrire du code.

L'approche actuelle est la suivante:

Set sh = ActiveSheet
RowCount = 0
For Each rw In sh.Rows
    'If Row.Cells(1, 1).Value = "" Then Exit For
    RowCount = RowCount + 1
Next rw
MsgBox (RowCount)

Maintenant, lorsque je lance ceci, j'obtiens un nombre énorme, ce qui est faux car la table ne contient qu'environ 25 lignes. J'ai commenté la première ligne car elle ne fonctionnait pas.

Que puis-je changer dans la première ligne de la boucle For pour qu'elle se brise correctement lorsqu'elle trouve une ligne où la première cellule est vide?

38
user764357

Il semble que vous veniez de coder en dur la ligne et la colonne; sinon, quelques petites modifications, et je pense que vous êtes là:

Dim sh As Worksheet
Dim rw As Range
Dim RowCount As Integer

RowCount = 0

Set sh = ActiveSheet
For Each rw In sh.Rows

  If sh.Cells(rw.Row, 1).Value = "" Then
    Exit For
  End If

  RowCount = RowCount + 1

Next rw

MsgBox (RowCount)
60
Hambone

Pour le bénéfice de ceux qui recherchent un produit similaire, voir la fiche de travail .UsedRange,
par exemple. ? ActiveSheet.UsedRange.Rows.Count
et des boucles telles que
For Each loopRow in Sheets(1).UsedRange.Rows: Print loopRow.Row: Next

60
AjV Jsy

Je vais faire quelques hypothèses dans ma réponse. Je suppose que vos données commencent en A1 et qu'il n'y a pas de cellules vides dans la première colonne de chaque ligne contenant des données.

Ce code va:

  1. Trouver la dernière ligne de la colonne A contenant des données
  2. Boucle à chaque rangée
  3. Trouver la dernière colonne de la ligne en cours avec des données
  4. Parcourez chaque cellule de la ligne actuelle jusqu'à la dernière colonne trouvée.

Ce n'est pas une méthode rapide, mais itérera à travers chacun individuellement, comme vous l'avez suggéré.


Sub iterateThroughAll()
    ScreenUpdating = False
    Dim wks As Worksheet
    Set wks = ActiveSheet

    Dim rowRange As Range
    Dim colRange As Range

    Dim LastCol As Long
    Dim LastRow As Long
    LastRow = wks.Cells(wks.Rows.Count, "A").End(xlUp).Row

    Set rowRange = wks.Range("A1:A" & LastRow)

    'Loop through each row
    For Each rrow In rowRange
        'Find Last column in current row
        LastCol = wks.Cells(rrow, wks.Columns.Count).End(xlToLeft).Column
        Set colRange = wks.Range(wks.Cells(rrow, 1), wks.Cells(rrow, LastCol))

        'Loop through all cells in row up to last col
        For Each cell In colRange
            'Do something to each cell
            Debug.Print (cell.Value)
        Next cell
    Next rrow
    ScreenUpdating = True
End Sub
18
Portland Runner