Ich arbeite gerade an einem Datensatz, der als Tabelle mit Kopfzeilen formatiert ist. Ich muss alle Zellen in einer bestimmten Spalte durchlaufen und den Inhalt ändern. Durch Recherchen auf MSDN habe ich folgende for-Schleife gefunden
for i = 1 to NumRows
Cells(i,23).Value = "PHEV"
next i
Dies würde also alle Zellen in Spalte 23 ändern, um "PHEV" zu lesen. Ich erstelle jedoch nicht die Tabelle, mit der ich selbst arbeite. Daher kann ich nicht garantieren, dass die Spalte, für die ich mich interessiere, Spalte 23 ist.
Ich möchte etwas Ähnliches wie das Folgende implementieren:
for i = 1 to NumRows
Cells(i,[@[columnHeader]]).Value = "PHEV"
next i
Natürlich weiß ich, dass diese Syntax falsch ist, aber hoffentlich verdeutlicht sie mein Ziel ausreichend.
Sie können vor den Zuordnungen nach Spalten suchen:
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
Wenn es sich tatsächlich um eine ListObject
-Tabelle handelt (Tabelle aus dem Ribbon einfügen), können Sie das .DataBodyRange
-Objekt der Tabelle verwenden, um die Anzahl der Zeilen und Spalten zu ermitteln. Dies ignoriert die Kopfzeile.
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
Wenn Sie die Kopfzeile verwenden müssen, verwenden Sie statt tbl.DataBodyRange
einfach tbl.Range
.
Wenn Sie davon ausgehen, dass Ihre Tabelle 'Table1' heißt und die benötigte Spalte 'Column' ist, können Sie Folgendes versuchen:
for i = 1 to Range("Table1").Rows.Count
Range("Table1[Column]")(i)="PHEV"
next i
Wenn Sie den Namen der Überschrift kennen, können Sie die Spalte basierend darauf finden:
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
Ich bin auf das gleiche Problem gestoßen, aber kein Forum konnte mir helfen, nach einigen Minuten kam ich auf eine Idee:
match(ColumnHeader,Table1[#Headers],0)
Dies gibt Ihnen die Nummer zurück.
Da mir keine der obigen Antworten bei meinem Problem geholfen hat, hier meine Lösung, um eine bestimmte (benannte) Spalte aus jeder Zeile zu extrahieren.
I Konvertieren einer Tabelle in Text mithilfe der Werte einiger benannter Spalten (Yes
, No
, Maybe
) innerhalb der benannten Excel-Tabelle myTable
auf der Registerkarte mySheet
mit dem folgenden (Excel-) VBA-Snippet:
Function Table2text()
Dim NumRows, i As Integer
Dim rngTab As Range
Set rngTab = ThisWorkbook.Worksheets("mySheet").Range("myTable")
' For each row, convert the named columns into an enumeration
For i = 1 To rngTab.Rows.Count
Table2text= Table2text & "- Yes:" & Range("myTable[Yes]")(i).Value & Chr(10)
Table2text= Table2text & "- No: " & Range("myTable[No]")(i).Value & Chr(10)
Table2text= Table2text & "- Maybe: "& Range("myTable[Maybe]")(i).Value & Chr(10) & Chr(10)
Next i
' Finalize return value
Table2text = Table2text & Chr(10)
End Function
Wir definieren einen Bereich rngTab
, über den wir eine Schleife durchführen. Der Trick besteht darin, Range("myTable[col]")(i)
zu verwenden, um den Eintrag der Spalte col
in der Zeile i
zu extrahieren.
Angenommen, Ihre Tabelle heißt "Table1" und Ihre Spalte heißt "Column1".
For i = 1 To ListObjects("Table1").ListRows.Count
ListObjects("Table1").ListColumns("Column1").DataBodyRange(i) = "PHEV"
Next i
Sie können die Zellen einer beliebigen Spalte in einer Tabelle durchlaufen, indem Sie nur den Namen und nicht die Position kennen. Wenn sich die Tabelle in Tabelle1 der Arbeitsmappe befindet:
Dim rngCol as Range
Dim cl as Range
Set rngCol = Sheet1.Range("TableName[ColumnName]")
For Each cl in rngCol
cl.Value = "PHEV"
Next cl
Der obige Code führt nur die Datenwerte durch, ausgenommen die Kopfzeile und die Summenzeile. Es ist nicht erforderlich, die Anzahl der Zeilen in der Tabelle anzugeben.
Verwenden Sie diese Option, um die Position einer Spalte in einer Tabelle anhand ihres Spaltennamens zu ermitteln:
Dim colNum as Long
colNum = Range("TableName[Column name to search for]").Column
Dies gibt die numerische Position einer Spalte in der Tabelle zurück.
Sie können die letzte Spalte der Tabelle finden und dann die Zelle füllen, indem Sie durchlaufen.
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