Itera gjennom alle cellene i Excel VBA eller VSTO 2005

stemmer
22

Jeg må rett og slett gå gjennom alle cellene i et Excel-regneark og sjekke verdiene i cellene. Cellene kan inneholde tekst, tall eller være tom. Jeg er ikke veldig kjent / komfortabel å jobbe med begrepet 'område'. Derfor ville enhver sample koder bli verdsatt. (Jeg fikk prøve å google det, men kodebitene jeg fant ikke helt gjøre det jeg trengte)

Takk skal du ha.

Publisert på 16/09/2008 klokken 13:47
kilden bruker
På andre språk...                            


9 svar

stemmer
0

I Excel VBA, vil denne funksjonen gi deg innholdet i en celle i en hvilken som helst regneark.

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

Så hvis du ønsker å sjekke verdien av celler, bare sette funksjonen i en loop, gi den referansen til regnearket du vil og rad indeksen og kolonneindeksen til cellen. Radindeks og kolonneindeksen begge starte fra 1, noe som betyr at A1-cellen vil være ws.Cells (1,1) og så videre.

Svarte 16/09/2008 kl. 13:57
kilden bruker

stemmer
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

Fant denne tekstutdrag på http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Det synes å være ganske nyttig som en funksjon for å illustrere midler til å sjekke verdiene i cellene i en ordnet mote.

Tenk deg det som en 2d Array av sorterer og bruke den samme logikken til sløyfe gjennom cellene.

Svarte 16/09/2008 kl. 13:57
kilden bruker

stemmer
3

Du kan bruke en for hver enkelt å iterere gjennom alle cellene i et definert område.

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
Svarte 16/09/2008 kl. 13:58
kilden bruker

stemmer
53

Hvis du trenger bare å se på de cellene som er i bruk kan du bruke:

sub IterateCells()

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

End Sub

som vil treffe alt i området fra A1 til siste celle med data (nederst til høyre mest celle)

Svarte 16/09/2008 kl. 13:58
kilden bruker

stemmer
1

Det finnes flere metoder for å oppnå dette, som hver har fordeler og ulemper; Først og fremst, du kommer til å trenge å ha en forekomst av et regneark objekt, fungerer Application.ActiveSheet hvis du bare vil ha en brukeren ser på.

Arbeidsskjemaet objektet har tre egenskaper som kan brukes for å få tilgang til celledata (Cells, rader, kolonner) og en metode som kan anvendes for å oppnå en blokk av celledata, (get_Range).

Områder kan bli endret og slikt, men du må kanskje bruke egenskapene som er nevnt ovenfor for å finne ut hvor grensene dine data er. Fordelen til en Range blir tydelig når du arbeider med store mengder data, fordi VSTO-tillegg arrangeres utenfor grensene for selve Excel-programmet, slik at alle samtaler til Excel må føres gjennom et lag med overhead; få en Range kan du få / sett alle data du ønsker i en samtale som kan ha store ytelsesfordeler, men det krever at du bruker eksplisitte detaljer i stedet for gjentakelse gjennom en hver oppføring.

Dette MSDN forum innlegg viser en VB.Net utbygger stille et spørsmål om å få resultatene av en Range som en matrise

Svarte 16/09/2008 kl. 14:01
kilden bruker

stemmer
1

Du kan i utgangspunktet sløyfe over en Range

Få et ark

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

Få Range du er interessert i Hvis du virkelig ønsker å sjekke hver eneste celle bruk Excel grenser

Excel 2007 "Big Grid" øker det maksimale antallet rader per regneark fra 65 536 til over 1 million, og antall kolonner fra 256 (IV) til 16384 (XFD). herfra http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

og deretter sløyfe over området

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

        string myValue;

        foreach(Range myCell in myBigRange )
        {
            myValue = myCell.Value2.ToString();
        }
Svarte 16/09/2008 kl. 14:06
kilden bruker

stemmer
0

Mine VBA ferdigheter er litt rusten, men dette er den generelle ideen om hva jeg ville gjøre.
Den enkleste måten å gjøre dette ville være å iterere gjennom en løkke for hver kolonne:

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

det virker som om fargen syntaks utheving ikke liker VBA, men forhåpentligvis vil dette hjelpe noe (i det minste gi deg et utgangspunkt å jobbe fra).

  • Brisketeer
Svarte 16/09/2008 kl. 14:06
kilden bruker

stemmer
2

For en VB eller C # app, en måte å gjøre dette på er ved å bruke Office Interop. Dette avhenger av hvilken versjon av Excel du jobber med.

For Excel 2003, er dette MSDN artikkelen et godt sted å begynne. Forstå Excel Object Model fra et Visual Studio 2005 Developer perspektiv

Du vil i utgangspunktet trenger å gjøre følgende:

  • Start Excel-programmet.
  • Åpne Excel-arbeidsbok.
  • Hent regnearket fra arbeidsboken etter navn eller indeks.
  • Gjenta for alle cellene i regnearket som ble hentet som et område.
  • Prøve (utestet) kode utdrag under for det siste trinnet.

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

For Excel 2007, kan du prøve denne MSDN referansen .

Svarte 16/09/2008 kl. 14:24
kilden bruker

stemmer
5

Hvis du bare ser på verdiene av celler du kan lagre verdiene i en rekke variant type. Det virker som får verdien av et element i en matrise kan være mye raskere enn samspill med Excel, slik at du kan se noen forskjell i ytelse med en rekke alle celleverdier i forhold til gjentatte ganger å få enkeltceller.

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

Da kan du få en celleverdi bare ved å sjekke ValArray (rad, kolonne)

Svarte 17/09/2008 kl. 18:55
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more