web-dev-qa-db-fra.com

Parcourant toutes les lignes d'une colonne de tableau, Excel-VBA

Je travaille actuellement sur un ensemble de données qui est formaté sous forme de tableau, avec des en-têtes. Ce que je dois faire est de parcourir toutes les cellules d’une colonne donnée et d’en modifier le contenu. Grâce à la recherche sur MSDN, je suis arrivé à ce qui suit pour la boucle

for i = 1 to NumRows
    Cells(i,23).Value = "PHEV"
next i

Cela changerait donc toutes les cellules de la colonne 23 en "PHEV". Cependant, je ne construis pas la table sur laquelle je travaille moi-même, je ne peux donc pas garantir que la colonne qui m'intéresse sera la colonne 23.

J'aimerais mettre en œuvre quelque chose de similaire à ce qui suit:

for i = 1 to NumRows
    Cells(i,[@[columnHeader]]).Value = "PHEV"
next i

Bien sûr, je sais que cette syntaxe est incorrecte, mais j'espère que cela illustre suffisamment mon objectif.

8
detroitwilly

Vous pouvez rechercher une colonne avant les affectations:

Dim col_n as long
for i = 1 to NumCols
    if Cells(1, i).Value = "column header you are looking for" Then col_n = i
next

for i = 1 to NumRows
    Cells(i, col_n).Value = "PHEV"
next i
10
LS_ᴅᴇᴠ

S'il s'agit en fait d'une table ListObject (Insérer une table à partir du ruban), vous pouvez utiliser l'objet .DataBodyRange de la table pour obtenir le nombre de lignes et de colonnes. Cela ignore la ligne d'en-tête.

Sub TableTest()

Dim tbl As ListObject
Dim tRows As Long
Dim tCols As Long

Set tbl = ActiveSheet.ListObjects("Table1")  '## modify to your table name.

With tbl.DataBodyRange
    tRows = .Rows.Count
    tCols = .Columns.Count
End With

MsgBox tbl.Name & " contains " & tRows & " rows and " & tCols & " columns.", vbInformation

End Sub

Si vous devez utiliser la ligne d'en-tête, au lieu d'utiliser tbl.DataBodyRange, utilisez simplement tbl.Range.

20
David Zemens

En supposant que votre table s'appelle 'Table1' et que la colonne dont vous avez besoin est 'Colonne', vous pouvez essayer ceci:

for i = 1 to Range("Table1").Rows.Count
   Range("Table1[Column]")(i)="PHEV"
next i
12
George

Si vous connaissez le nom de l'en-tête, vous pouvez trouver la colonne en fonction de cela:

Option Explicit

Public Sub changeData()
    Application.ScreenUpdating = False ' faster for modifying values on sheet

    Dim header As String
    Dim numRows As Long
    Dim col As Long
    Dim c As Excel.Range

    header = "this one" ' header name to find

    Set c = ActiveSheet.Range("1:1").Find(header, LookIn:=xlValues)
    If Not c Is Nothing Then
        col = c.Column
    Else
        ' can't work with it
        Exit Sub
    End If

    numRows = 50 ' (whatever this is in your code)

    With ActiveSheet
        .Range(.Cells(2, col), .Cells(numRows, col)).Value = "PHEV"
    End With

    Application.ScreenUpdating = True ' reset
End Sub
2
Joseph

Je suis tombé sur le même problème mais aucun forum ne pouvait m'aider. Après quelques minutes, j'ai eu une idée:

match(ColumnHeader,Table1[#Headers],0)

Cela vous retournera le numéro.

1
Javier

En supposant que votre table s'appelle "Table1" et que votre colonne s'appelle "Column1", alors:

For i = 1 To ListObjects("Table1").ListRows.Count
    ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
Next i
0
SnitkaSirk

Vous pouvez parcourir les cellules de n’importe quelle colonne d’un tableau en connaissant uniquement son nom et non sa position. Si la table est dans la feuille 1 du classeur:

Dim rngCol as Range
Dim cl as Range
Set rngCol = Sheet1.Range("TableName[ColumnName]")
For Each cl in rngCol
    cl.Value = "PHEV"
Next cl

Le code ci-dessus parcourt uniquement les valeurs de données, à l'exclusion de la ligne d'en-tête et de la ligne de total. Il n'est pas nécessaire de spécifier le nombre de lignes dans la table.

Utilisez cette option pour rechercher l'emplacement d'une colonne dans une table par son nom de colonne:

Dim colNum as Long
colNum = Range("TableName[Column name to search for]").Column

Cela retourne la position numérique d'une colonne dans la table.

0
The Dude

Vous pouvez trouver la dernière colonne du tableau, puis remplir la cellule en boucle.

Sub test()
    Dim lastCol As Long, i As Integer
    lastCol = Range("AZ1").End(xlToLeft).Column
        For i = 1 To lastCol
            Cells(1, i).Value = "PHEV"
        Next
End Sub
0
Santosh