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.

22
demandé sur braX 2008-09-16 19:47:16

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.

7
répondu betelgeuce 2008-09-16 15:57:50

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)

54
répondu cori 2012-05-17 13:17:02

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)

5
répondu Jon Fournier 2012-06-13 01:14:18

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
3
répondu theo 2008-09-16 15:58:17

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 .

2
répondu Cory Engebretson 2008-09-16 16:24:12

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

1
répondu TheXenocide 2008-09-16 16:01:26

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();
        }
1
répondu w4ik 2008-09-16 16:06:30

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.

0
répondu Martin08 2008-09-16 15:57:06

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
0
répondu 2008-09-16 16:06:57