Frage

Ich muß einfach alle Zellen in einer Excel-Tabelle durchlaufen und die Werte in den Zellen überprüfen. Die Zellen können Text, Zahlen oder leer sein. Ich bin nicht sehr vertraut / komfortabel mit dem Konzept des ‚Bereichs‘ arbeiten. Daher würde jede Probe Codes sehr geschätzt. (Ich habe versucht, es zu googeln, aber der Code-Schnipsel fand ich nicht ganz tun, was ich brauchte)

Danke.

War es hilfreich?

Lösung

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

Wir haben dieses Snippet auf http: // www. java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Es scheint ziemlich nützlich zu sein als eine Funktion, die Mittel zu veranschaulichen Werte in Zellen in einer geordneten Art und Weise zu überprüfen.

Stellen Sie sich nur als eine 2D-Array von Art zu sein und die gleiche Logik einer Schleife durch Zellen anwenden.

Andere Tipps

Wenn Sie nur an den Zellen zu suchen, die in Gebrauch sind, können Sie verwenden:

sub IterateCells()

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

End Sub

, die alles im Bereich von A1 bis zur letzten Zelle mit Daten (die untere am weitesten rechts stehende Zelle) treffen werden

Wenn Sie nur bei Werten von Zellen suchen, können Sie speichern die Werte in einem Array von Variant-Typ. Es scheint, dass in einem Array den Wert eines Elements immer viel schneller sein kann als mit Excel interagieren, so können Sie einen Unterschied in der Leistung unter Verwendung einer Anordnung aller Zellenwerte im Vergleich zu wiederholt immer einzelne Zellen sehen.

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

Dann können Sie einen Zellwert bekommen nur durch Überprüfung valarray (Zeile, Spalte)

Sie können eine für jede Verwendung durch alle Zellen in einem definierten Bereich zu durchlaufen.

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

Für einen VB oder C # app, ein Weg, dies zu tun ist durch die Office-Interop verwenden. Dies hängt davon ab, welche Version von Excel Sie arbeiten mit.

Für Excel 2003, der MSDN-Artikel ist ein guter Anfang. das Excel-Objektmodell aus einem Visual Studio 2005 Developer-Perspektive zu verstehen

Sie werden im Grunde müssen folgendes tun:

  • Starten Sie die Excel-Anwendung.
  • Öffnen Sie die Excel-Arbeitsmappe.
  • Rufen Sie das Arbeitsblatt aus der Arbeitsmappe nach Name oder Index.
  • Iteration durch alle Zellen in dem Arbeitsblatt, das als Bereich abgerufen wurden.
  • Die Probe (ungetestet) Code Ausschnitt unten für den letzten Schritt.

    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.
        }
    }

Für Excel 2007 versuchen diese MSDN Referenz .

Es gibt mehrere Methoden, um dies zu erreichen, von denen jede Vor- und Nachteile; In erster, Sie gehen zu müssen, in erster Linie eine Instanz eines Worksheet-Objekt haben, arbeitet Application.ActiveSheet, wenn der Benutzer betrachtet.

nur das eine wollen

Das Arbeitsblatt-Objekt hat drei Eigenschaften, die verwendet werden können, um Zellendaten (Zellen, Zeilen, Spalten) und ein Verfahren zuzugreifen, das verwendet werden kann, um einen Block von Zellendaten zu erhalten, (get_Range).

Bereiche können verkleinert und so werden, aber Sie können die oben genannten Eigenschaften verwenden müssen, um herauszufinden, wo die Grenzen Ihrer Daten sind. Der Vorteil zu einem Bereich wird deutlich, wenn Sie mit großen Datenmengen arbeiten, weil VSTO Add-In sind außerhalb der Grenzen der Excel-Anwendung gehostet selbst, so dass alle Anrufe an Excel haben mit Overhead durch eine Schicht übergeben werden; einen Bereich zu erhalten können Sie alle Daten, die Sie in einem Aufruf wollen die enorme Leistungsvorteile haben können, aber es erfordert, dass Sie explizite Details zu verwenden, anstatt Iteration durch jeden Eintrag erhalten / einstellen.

Diese MSDN Forum posten a zeigt VB.Net Entwickler eine Frage zu bekommen, die Ergebnisse eines Range als Array fragt

Sie können im Grunde Schleife über einen Bereich

Hier finden Sie eine Folie

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

Holen Sie sich den Bereich den Sie interessieren Wenn Sie wirklich jede Zelle Verwendung von Excel Grenzen überprüfen mögen

  

Die Excel 2007 "Big Grid" erhöht   Die maximale Anzahl der Zeilen pro   Arbeitsblatt von 65.536 auf über 1   Millionen und die Anzahl der Spalten   von 256 (IV) bis 16.384 (XFD).   von hier http://msdn.microsoft.com/en-us/ Bibliothek / aa730921.aspx # Office2007excelPerf_BigGridIncreasedLimitsExcel

und dann die Schleife über den Bereich

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

        string myValue;

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

In Excel VBA, wird diese Funktion geben Sie den Inhalt jeder Zelle in jedem Arbeitsblatt.

Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
    getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function

Wenn Sie also den Wert der Zellen überprüfen möchten, setzen Sie einfach die Funktion in einer Schleife, geben sie den Verweis auf das Arbeitsblatt, das Sie und der Zeilenindex und Spaltenindex der Zelle soll. Zeilenindex und Spaltenindex starten beide von 1, was bedeutet, dass die Zelle A1 ws.Cells sein wird (1,1) und so weiter.

Meine VBA Fähigkeiten sind ein wenig rostig, aber dies ist die allgemeine Vorstellung von dem, was ich tun würde.
Der einfachste Weg, dies zu tun, wäre für jede Spalte durch eine Schleife zu durchlaufen:

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

Es scheint, dass die Farbe Syntax-Hervorhebung nicht vba nicht mag, aber dies wird hoffentlich etwas helfen (zumindest gibt Ihnen einen Ausgangspunkt aus arbeiten).

  • Brisketeer
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top