2013-07-10 33 views
6

Attualmente sto lavorando su un set di dati che è formattato come tabella, con le intestazioni. Quello che devo fare è scorrere tutte le celle in una colonna specifica e modificare i contenuti. Attraverso la ricerca su MSDN mi si avvicinò con il seguente ciclo forIn loop su tutte le righe in una colonna di tabella, Excel-VBA

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

Quindi questo cambierebbe tutte le celle nella colonna 23 per leggere "PHEV". Tuttavia, non costruisco il tavolo con cui sto lavorando, quindi non posso garantire che la colonna a cui sono interessato sarà la colonna 23.

Vorrei implementare qualcosa di simile al seguente:

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

Naturalmente, so che che la sintassi non è corretta, ma si spera che illustra a sufficienza il mio obiettivo.

risposta

8

È possibile cercare colonna prima assegnazioni:

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 
+1

Riga 3, si dispone di una virgola anziché di un punto per accedere al valore della cella. – esylvestre

+2

Buona risposta. Vorrei che Excel fosse più semantico ... perché non posso semplicemente fare riferimento alla colonna come tabella ["nome colonna"] come un dizionario in python o JSON? Funziona in un certo modo con altre operazioni di tabella, ad es. facendo riferimento ad altri valori di colonna nella stessa riga. – grisaitis

0

È possibile trovare l'ultima colonna della tabella e quindi riempire la cella eseguendola in sequenza.

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 
14

Se questo è in realtà una tabella ListObject (Inserisci tabella dal nastro), allora si può usare .DataBodyRange oggetto della tabella per ottenere il numero di righe e colonne. Questo ignora la riga di intestazione.

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 

Se è necessario utilizzare la riga di intestazione, invece di usare tbl.DataBodyRange basta usare tbl.Range.

+0

dovrebbe essere simile: tCols = .Columns.Count ... più pulito soluzione a mio parere – JoeFox

+0

@JoeFox buona cattura, errore di battitura da parte mia. Saluti. –

+0

Qual è il modo appropriato di eseguire il ciclo e fare riferimento alle celle della tabella con questo codice? –

2

Se si conosce il nome di intestazione, è possibile trovare la colonna in base a quanto segue:

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

+1. Se stai impostando tutte le celle di una colonna su un valore, non c'è assolutamente alcun motivo per scorrere l'intervallo per farlo. Basta impostare l'intervallo sul valore desiderato, come fa @ joseph4th qui. Vorrei anche dichiarare un oggetto del foglio di lavoro in modo che non sia necessario utilizzare ActiveSheet. –

+1

@HeadofCatering idem sull'annotazione ActiveSheet –

1

mi sono imbattuto lo stesso problema, ma nessun forum potrebbe aiutarmi, dopo alcuni minuti sono uscito con un'idea:

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

Questo ti restituirà il numero.

5

Supponendo che la tabella si chiama 'Tabella 1' e la colonna che vi serve è 'Colonna' si può provare questo:

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

Grazie! soluzione molto semplice ed elegante al problema, mi ha salvato un sacco di codice con altre soluzioni più complesse. – Angel

0

È possibile scorrere le celle di ogni colonna di una tabella conoscendo solo il suo nome e non la sua posizione. Se la tabella è in Sheet1 del lavoro:

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

Il codice precedente ciclo volontà attraverso i valori dei dati unici, escludendo la riga di intestazione e la riga totali. Non è necessario specificare il numero di righe nella tabella.

Utilizzare questo per trovare la posizione di qualsiasi colonna di una tabella con il suo nome di colonna:

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

Questo restituisce la posizione numerica di una colonna della tabella.

0

Assumendo che il tavolo si chiama "Table1" e la colonna si chiama "Colonna1" quindi:

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