Scorrere tutte le celle in Excel VBA o VSTO 2005
Domanda
Ho bisogno semplicemente di passare attraverso tutte le celle in un Foglio di calcolo di Excel e controllare i valori nelle celle.Le celle possono contenere testo, numeri o essere vuoto.Io non sono molto familiare / agio a lavorare con il concetto di "Campo".Pertanto, qualsiasi codici di esempio sarebbe molto apprezzato.(Ho provato a cercare su google, ma i frammenti di codice che ho trovato non riusciva a fare quello che mi serviva)
Grazie.
Soluzione
Sub CheckValues1()
Dim rwIndex As Integer
Dim colIndex As Integer
For rwIndex = 1 To 10
For colIndex = 1 To 5
If Cells(rwIndex, colIndex).Value <> 0 Then _
Cells(rwIndex, colIndex).Value = 0
Next colIndex
Next rwIndex
End Sub
Trovato questo snippet http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Sembra essere molto utile come funzione di illustrare i mezzi per controllare i valori nelle celle in un insieme ordinato di moda.
Basta immaginare come una Matrice 2d di sorta e applicare la stessa logica a loop attraverso le cellule.
Altri suggerimenti
Se avete solo bisogno di guardare le celle che sono in uso, è possibile utilizzare:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
che ha colpito tutto il range da A1 fino all'ultima cella dati (in basso a destra della cella)
Se sei solo alla ricerca dei valori delle celle è possibile memorizzare i valori in un array di tipo variant.Sembra che ottenere il valore di un elemento di un array può essere molto più veloce di interagire con Excel, in modo che si può vedere una certa differenza in termini di prestazioni, utilizzando una matrice di tutti i valori della cella rispetto ripetutamente di ottenere cellule singole.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
Poi si può ottenere il valore di una cella solo controllando ValArray( riga , colonna )
È possibile utilizzare una Per Ogni per scorrere tutte le celle in un intervallo definito.
Public Sub IterateThroughRange()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range
Set wb = Application.Workbooks(1)
Set ws = wb.Sheets(1)
Set rng = ws.Range("A1", "C3")
For Each cell In rng.Cells
cell.Value = cell.Address
Next cell
End Sub
Per il VB o C# app, un modo per farlo è tramite l'Ufficio di Interoperabilità.Questo dipende dalla versione di Excel che si sta lavorando con.
Per Excel 2003, questo articolo di MSDN è un buon posto per iniziare.Comprendere il Modello a Oggetti di Excel da Visual Studio 2005 di vista dello Sviluppatore
In pratica dovrai fare le seguenti cose:
- Avviare l'applicazione Excel.
- Aprire la cartella di lavoro di Excel.
- Recuperare il foglio di lavoro della cartella di lavoro per nome o di un indice.
- Scorrere tutte le Celle del foglio di lavoro che sono stati recuperati come un intervallo.
- Esempio (non testato) estratto di codice qui di seguito per l'ultimo passo.
Excel.Range allCellsRng;
string lowerRightCell = "IV65536";
allCellsRng = ws.get_Range("A1", lowerRightCell).Cells;
foreach (Range cell in allCellsRng)
{
if (null == cell.Value2 || isBlank(cell.Value2))
{
// Do something.
}
else if (isText(cell.Value2))
{
// Do something.
}
else if (isNumeric(cell.Value2))
{
// Do something.
}
}
Per Excel 2007, tenta questo riferimento MSDN.
Ci sono diversi metodi per fare questo, ciascuno dei quali presenta vantaggi e svantaggi;In primo luogo, si sta andando ad avere bisogno di avere un'istanza di un oggetto Foglio di lavoro di Applicazione.ActiveSheet funziona se si desidera solo quello che l'utente sta guardando.
L'oggetto Foglio di lavoro ha tre proprietà che può essere utilizzato per accedere a cella dati (Celle, Righe, Colonne) e un metodo che può essere utilizzato per ottenere un blocco di cella dati (get_Range).
Gli intervalli possono essere ridimensionate e tale, ma potrebbe essere necessario utilizzare la proprietà di cui sopra per scoprire dove i confini dei tuoi dati sono.Il vantaggio di una Gamma diventa evidente quando si lavora con grandi quantità di dati, poiché i componenti aggiuntivi VSTO sono ospitati al di fuori dei confini di Excel applicazione stessa, in modo che tutte le chiamate di Excel deve essere superato attraverso un livello con in testa;ottenere una Gamma consente di ottenere o impostare tutti i dati che si desidera in una sola chiamata, che può avere enormi vantaggi di prestazioni, ma richiede l'uso di dettagli espliciti anziché scorrere ogni voce.
Questo post del forum MSDN mostra un VB.Net sviluppatore chiede una domanda su come ottenere i risultati di una serie come un array
Si può, in pratica, loop su una Gamma
Prendi un foglio
myWs = (Worksheet)MyWb.Worksheets[1];
Ottenere la Gamma siete interessati dentro Se si vuole veramente a controllare ogni cella utilizzare Excel limiti
Excel 2007 "Grande Griglia" aumenta il numero massimo di righe per foglio di lavoro da 65.536 a oltre 1 milioni di, e il numero di colonne da 256 (IV) a 16.384 (XDA).da qui http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel
e poi un ciclo su tutta la gamma
Range myBigRange = myWs.get_Range("A1", "A256");
string myValue;
foreach(Range myCell in myBigRange )
{
myValue = myCell.Value2.ToString();
}
In VBA di Excel, questa funzione vi darà il contenuto di una cella qualsiasi del foglio di lavoro.
Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function
Quindi, se si desidera controllare il valore di celle, basta inserire la funzione in un ciclo, di dare il riferimento al foglio di lavoro che si desidera e l'indice di riga e di colonna indice della cella.L'indice di riga e di colonna indice di entrambe partono da 1, il che significa che la cella A1 sarà ws.Cells(1,1) e così via.
La mia VBA abilità sono un po ' arrugginito, ma questa è l'idea generale di ciò che mi piacerebbe fare.
Il modo più semplice per farlo sarebbe quello di scorrere un anello per ogni colonna:
public sub CellProcessing()
on error goto errHandler
dim MAX_ROW as Integer 'how many rows in the spreadsheet
dim i as Integer
dim cols as String
for i = 1 to MAX_ROW
'perform checks on the cell here
'access the cell with Range("A" & i) to get cell A1 where i = 1
next i
exitHandler:
exit sub
errHandler:
msgbox "Error " & err.Number & ": " & err.Description
resume exitHandler
end sub
sembra che il colore di evidenziazione della sintassi non come vba, ma speriamo che questo vi aiuterà un po ' (almeno dare un punto di partenza per lavorare da).
- Brisketeer