Itération à travers toutes les cellules dans Excel VBA ou VSTO 2005
Je dois simplement parcourir toutes les cellules d'une feuille de calcul Excel et vérifier les valeurs dans les cellules. Les cellules peuvent contenir du texte, des chiffres ou être vide. Je ne suis pas très familier / à l'aise de travailler avec le concept de "gamme". Par conséquent, tous les codes d'échantillon seraient grandement appréciés. (J'ai essayé de le google, mais les extraits de code que j'ai trouvés n'ont pas tout à fait fait ce dont j'avais besoin)
Je vous Remercie.
9 réponses
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
Trouvé cet extrait sur http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm il semble être très utile en tant que fonction d'illustrer les moyens de vérifier les valeurs dans les cellules d'une manière ordonnée.
Imaginez-le comme un tableau 2d et appliquez la même logique pour boucler les cellules.
Si vous avez seulement besoin de regarder les cellules qui sont en cours d'utilisation, vous pouvez utiliser:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
Qui va frapper tout dans la plage de A1 à la dernière cellule avec des données (la cellule en bas à droite)
Si vous regardez simplement les valeurs des cellules, vous pouvez stocker les valeurs dans un tableau de type variant. Il semble que l'obtention de la valeur d'un élément dans un tableau peut être beaucoup plus rapide que l'interaction avec Excel, de sorte que vous pouvez voir une certaine différence de performance en utilisant un tableau de toutes les valeurs de cellules par rapport à l'obtention répétée de cellules uniques.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
Ensuite, vous pouvez obtenir une valeur de cellule simplement en vérifiant ValArray (row , column)
Vous pouvez utiliser un For Each pour parcourir toutes les cellules d'une plage définie.
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
Pour une application VB ou c#, une façon de le faire est d'utiliser Office Interop. Cela dépend de la version D'Excel avec laquelle vous travaillez.
Pour Excel 2003, cet article MSDN est un bon point de départ. comprendre le modèle D'objet Excel du point de vue D'un développeur Visual Studio 2005
Vous devrez essentiellement faire ce qui suit:
- démarrez L'application Excel.
- Ouvrez le classeur Excel.
- récupère la feuille de calcul du classeur en nom ou d'un index.
- parcourir toutes les cellules de la feuille de calcul qui ont été récupérées en tant que Plage.
- Exemple d'extrait de code (non testé) ci-dessous pour la dernière étape.
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.
}
}
Pour Excel 2007, essayez cette référence MSDN .
Il existe plusieurs méthodes pour y parvenir, chacune ayant des avantages et des inconvénients; tout d'abord, vous devrez avoir une instance d'un objet de feuille de calcul, Application.ActiveSheet fonctionne si vous voulez juste celui que l'utilisateur regarde.
L'objet feuille de calcul possède trois propriétés qui peuvent être utilisées pour accéder aux données de cellule (cellules, lignes, colonnes) et une méthode qui peut être utilisée pour obtenir un bloc de données de cellule (get_Range).
Les plages peuvent être redimensionnées, mais vous pouvez avoir besoin d'utiliser les propriétés mentionnées ci-dessus pour savoir où sont les limites de vos données. L'avantage d'une plage devient évident lorsque vous travaillez avec de grandes quantités de données, car les compléments VSTO sont hébergés en dehors des limites de L'application Excel elle-même, de sorte que tous les appels à Excel doivent être passés à travers une couche avec surcharge; obtenir une plage vous permet d'obtenir / définir toutes les données que vous voulez détails explicites plutôt que d'itérer à travers chaque entrée.
Ce message du forum MSDN montre un VB.Net développeur posant une question sur l'obtention des résultats d'une plage en tant que Tableau
Vous pouvez essentiellement faire une boucle sur une plage
Obtenir une feuille
myWs = (Worksheet)MyWb.Worksheets[1];
Obtenez la plage qui vous intéresse Si vous voulez vraiment vérifier chaque cellule utilisez les limites D'Excel
La "Grande Grille" Excel 2007 augmente le nombre maximal de lignes par feuille de travail de 65 536 à plus de 1 millions de dollars, et le nombre de colonnes de 256 (IV) à 16 384 (XFD). à partir d'ici http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel
Puis boucle sur la plage
Range myBigRange = myWs.get_Range("A1", "A256");
string myValue;
foreach(Range myCell in myBigRange )
{
myValue = myCell.Value2.ToString();
}
Dans Excel VBA, cette fonction vous donnera le contenu de n'importe quelle cellule dans n'importe quelle feuille de calcul.
Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function
Donc, si vous voulez vérifier la valeur des cellules, il suffit de mettre la fonction dans une boucle, lui donner la référence à la feuille de calcul que vous voulez et l'index de ligne et l'index de colonne de la cellule. L'index de ligne et l'index de colonne commencent tous deux à partir de 1, ce qui signifie que la cellule A1 sera ws.Cellules(1,1) et ainsi de suite.
Mes compétences en VBA sont un peu rouillées, mais c'est l'idée générale de ce que je ferais.
La façon la plus simple de le faire serait d'itérer à travers une boucle pour chaque colonne:
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
Il semble que la coloration syntaxique des couleurs n'aime pas vba, mais j'espère que cela aidera un peu (au moins vous donner un point de départ pour travailler).
- Brisketeer