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.
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
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
.
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
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
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.
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
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.
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