2008-09-16 9 views
22

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/confortable avec le concept de 'Range'. Par conséquent, tous les codes d'échantillons seraient grandement appréciés. (J'ai essayé de google, mais les extraits de code que j'ai trouvés n'ont pas vraiment fait ce que j'avais besoin)Comment parcourir toutes les cellules dans Excel VBA ou VSTO 2005

Merci.

Répondre

7
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 

à cet extrait sur http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Il semble être très utile en fonction pour illustrer les moyens de vérifier les valeurs dans les cellules de façon ordonnée. Imaginez simplement qu'il s'agit d'un tableau 2d et appliquez la même logique pour faire une boucle dans les cellules.

+4

code qui boucle à travers toutes les cellules dans une gamme est extrêmement inefficace. Lisez la plage dans un tableau, effectuez vos vérifications/modifications dans le tableau, puis réécrivez le tableau dans la plage. Convenons d'arrêter d'utiliser ce code et peut-être qu'il s'en ira. – JimmyPena

0

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, donnez-lui la référence à la feuille de calcul et l'index de la ligne et l'indice colonne de la cellule. L'index de ligne et l'index de colonne commencent tous les deux à partir de 1, ce qui signifie que la cellule A1 sera ws.Cells (1,1) et ainsi de suite.

3

Vous pouvez utiliser un pour chaque pour parcourir toutes les cellules dans 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 
52

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 frappera tout dans la gamme de A1 à la dernière cellule avec des données (en bas à droite -most cell)

+2

Wow ... beaucoup mieux que worksheet.cells qui a écrasé mon système mort! –

+0

ouais, c'est tout un tas de cellules à parcourir. – cori

1

Il existe plusieurs méthodes pour accomplir cela, chacune ayant des avantages et des 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, par exemple, mais vous devrez peut-être utiliser les propriétés mentionnées ci-dessus pour déterminer les limites de vos données. L'avantage d'une plage devient apparent 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 passer par une couche avec surcharge; L'obtention d'une plage vous permet d'obtenir/de définir toutes les données souhaitées en un seul appel, ce qui peut avoir d'énormes avantages en termes de performances, mais cela nécessite d'utiliser des détails explicites plutôt que de parcourir chaque entrée.

This MSDN forum post montre un VB.développeur net poser une question sur l'obtention des résultats d'une série comme un tableau

1

Vous pouvez mettre en boucle essentiellement sur une plage

Obtenez une feuille

myWs = (Worksheet)MyWb.Worksheets[1]; 

Obtenez la chaîne qui vous intéresse Si vous vraiment envie de vérifier chaque utilisation des cellules des limites d'Excel

les « Big Grid » Excel 2007 augmente le nombre maximum de lignes par workshe et de 65 536 à plus de 1 millions, 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 boucle sur la plage

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

     string myValue; 

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

Mes compétences VBA sont un peu rouillé, mais cela est l'idée générale de ce que je ferais.
La meilleure façon de le faire serait de 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 coloration syntaxique n'aime pas vba, mais nous espérons que cela aidera un peu (au moins vous donner un point de départ pour travailler à partir de).

  • Brisketeer
2

Pour VB ou C# application, une façon de le faire est par l'utilisation d'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. Understanding the Excel Object Model from a Visual Studio 2005 Developer's Perspective

Vous essentiellement besoin de faire ce qui suit:

  • Démarrez l'application Excel.
  • Ouvrez le classeur Excel.
  • Récupérez la feuille de calcul du classeur par nom ou index.
  • Effectuez une itération sur 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 this MSDN reference.

5

Si vous examinez uniquement les valeurs de 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 qu'interagir avec Excel, de sorte que vous pouvez voir une différence de performance en utilisant un tableau de toutes les valeurs de cellules par rapport à l'obtention répétée de cellules individuelles.

Dim ValArray as Variant 
ValArray = Range("A1:IV" & Rows.Count).Value 

Ensuite, vous pouvez obtenir une valeur de la cellule juste en vérifiant valarray (ligne, colonne)

+1

Tout à fait d'accord! J'ai juste essayé ma première descente, pour seulement quelques milliers de cellules, ça a pris plus de 30 secondes ce qui est du bizzard! –

Questions connexes