web-dev-qa-db-fra.com

Itération dans toutes les cellules d'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 vides. Je ne suis pas très familier/à l'aise avec le concept de "gamme". Par conséquent, tout exemple de code serait grandement apprécié. (J'ai essayé de le rechercher sur Google, mais les extraits de code que j'ai trouvés ne faisaient pas tout à fait ce dont j'avais besoin)

Je vous remercie.

23
Ryan Liang
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 pour illustrer les moyens de vérifier les valeurs dans les cellules de manière ordonnée.

Imaginez-le simplement comme un tableau 2D et appliquez la même logique pour parcourir les cellules.

7
betelgeuce

Si vous avez seulement besoin de regarder les cellules en cours d'utilisation, vous pouvez utiliser:

sub IterateCells()

   For Each Cell in ActiveSheet.UsedRange.Cells
      'do some stuff
   Next

End Sub

qui frappera tout dans la plage de A1 à la dernière cellule avec des données (la cellule en bas à droite)

56
cori

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 puisse être beaucoup plus rapide que l'interaction avec Excel, vous pouvez donc voir une différence de performances en utilisant un tableau de toutes les valeurs de cellule 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 (ligne, colonne)

5
Jon Fournier

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
theo

Pour une application VB ou C #, une façon de procéder consiste à 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 effectuer les opérations suivantes:

  • Démarrez l'application Excel.
  • Ouvrez le classeur Excel.
  • Récupérez la feuille de calcul du classeur par nom ou index.
  • Parcourez toutes les cellules de la feuille de calcul qui ont été récupérées en tant que plage.
  • Exemple 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
Cory Engebretson

Vous pouvez essentiellement boucler sur une plage

Obtenez 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" d'Excel 2007 fait passer le nombre maximal de lignes par feuille de calcul de 65 536 à plus d'un million et le nombre de colonnes de 256 (IV) à 16 384 (XFD). d'ici http://msdn.Microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

puis en boucle sur la plage

        Range myBigRange = myWs.get_Range("A1", "A256");

        string myValue;

        foreach(Range myCell in myBigRange )
        {
            myValue = myCell.Value2.ToString();
        }
1
w4ik

Il existe plusieurs méthodes pour y parvenir, chacune ayant ses avantages et ses inconvénients; Tout d'abord, vous aurez besoin d'avoir une instance d'un objet Worksheet, Application.ActiveSheet fonctionne si vous voulez juste celui que l'utilisateur regarde.

L'objet Worksheet a 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 et autres, mais vous devrez peut-être utiliser les propriétés mentionnées ci-dessus pour savoir où se trouvent 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 via une couche avec surcharge; l'obtention d'une plage vous permet d'obtenir/définir toutes les données que vous souhaitez en un seul appel, ce qui peut avoir d'énormes avantages en termes de performances, mais cela vous oblige à utiliser des détails explicites plutôt que d'itérer à travers chaque entrée.

Ce message sur le forum MSDN montre un développeur VB.Net posant une question sur l'obtention des résultats d'une plage sous forme de tableau

1
TheXenocide

Mes compétences 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 procéder consiste à parcourir 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 mise en évidence de la syntaxe des couleurs n'aime pas vba, mais j'espère que cela vous aidera quelque peu (au moins vous donnera un point de départ à partir duquel travailler).

  • Brisketeer
0
Brisketeer

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, mettez simplement la fonction dans une boucle, donnez-lui 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.Cells (1,1) et ainsi de suite.

0
Martin08