wake-up-neo.com

Durchlaufen aller Zeilen in einer Tabellenspalte, Excel-VBA

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.

8
detroitwilly

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
10
LS_ᴅᴇᴠ

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.

20
David Zemens

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
12
George

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
2
Joseph

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.

1
Javier

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.

0
B--rian

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
0
SnitkaSirk

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.

0
The Dude

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
0
Santosh