Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VBA] For Each ...Next met multidimensionele array

Pagina: 1
Acties:

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Ik heb enige tijd geleden een Powershell-scriptje gemaakt waar wat VBA bij te zien komt omdat er een Excelbestand aangemaakt wordt. Nu wordt me gevraagd nieuwe functionaliteit toe te voegen en duik ik weer in VBA, een taal waar ik niet vertrouwd mee ben. Momenteel bijt ik even mijn tanden stuk op het volgende.

Gegeven de volgende range:
K
L
M
N
O
P
Q
R
1Microsoft Office 201029/08/2012SalesPC254doejohnDoeJohnJohnDoe@acme.com
2Microsoft Office 201014/03/2012ITPC150doejaneDoeJaneJaneDoe@acme.com
3Autodesk AutoCad16/07/2012ManagementPC320doejuniorDoeJuniorJuniorDoe@acme.com


Ik maak een array op de volgende manier:

Visual Basic .NET:
1
2
3
intLastRow = Worksheets(10).UsedRange.SpecialCells(11).Row
Range = "$K$1" & ":$R$" & intLastRow
arrUserData = ActiveSheet.Range(Range).Value


In deze array zit inderdaad de informatie die ik wil.

code:
1
2
3
4
5
arrUserData(0,0)
Microsoft Office 2010

arrUserData(2,5)
Junior


Waar ik vast zit is bij mijn loop:
Visual Basic .NET:
1
2
3
For Each objUserData In arrUserData
        Debug.Print objUserData
Next


Op deze manier krijg ik de data terug als volgt

code:
1
2
3
4
5
6
7
8
1. Microsoft Office 2010
2. Microsoft Office 2010
3. Autodesk AutoCad
4. 29/08/2012
5. 14/03/2012
6. 16/07/2012   
7. IT
(etc)


Dat is niet wat ik wil natuurlijk. Wat ik voor ogen had is een equivalent als de ForEach in Powershell

C#:
1
2
3
4
ForEach ($objUserData in $arrUserData)
    {
    Write-Host $objUserData
    }


Waarbij het resultaat zou zijn
code:
1
2
1. Microsoft Office 2010    29/08/2012  Sales   PC254   doejohn Doe John    JohnDoe@acme.com
2. Microsoft Office 2010    14/03/2012  IT  PC150   doejane Doe Jane    JaneDoe@acme.com


Natuurlijk, in PoSh is dat een mooi object met properties dat ik terug krijg. Dat zou ik eigenlijk ook voor mekaar willen krijgen in VBA, zodat ik de aparte properties kan opvragen. Mijn bedoeling is om een If in die loop te steken als filter, maar eerst moet ik uitvinden hoe om te gaan met mijn data natuurlijk.

Tips en oplossingen zijn welgekomen.





Ik heb zelf al een oplossing gevonden, nl. op onderstaande manier:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
intEndCounter = intLastRow
For intCounter = 1 To intEndCounter
    If arrUserData(intCounter, 1) = Application Then
            Debug.Print arrUserData(intCounter, 2)
            Debug.Print arrUserData(intCounter, 3)
            Debug.Print arrUserData(intCounter, 4)
            Debug.Print arrUserData(intCounter, 5)
            Debug.Print arrUserData(intCounter, 6)
            Debug.Print arrUserData(intCounter, 7)
            Debug.Print arrUserData(intCounter, 8)
    End If
Next

[ Voor 10% gewijzigd door YellowOnline op 30-08-2012 15:39 ]


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Inderdaad. Kan overigens zonder 'lelijke' EOlns met Debug.Print arrUserData(intCounter, 2); Spc(1); Debug.Print arrUserData(intCounter, 3); Spc(1); etc

Of natuurlijk een geneste loop maken 2-8. Eigenlijk is de array ook niet nodig aangezien je immers direct de cellen kunt uitlezen: dus geen array maken maar direct
Visual Basic:
1
2
3
4
5
For i = startRij To maxRij
   For j = startKolom To maxKolom
       'doe je ding met bijv Cells(i,j)
   Next j
Next i


En inderdaad, PS doet dat makkelijker :P

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
F_J_K schreef op donderdag 30 augustus 2012 @ 14:04:
Inderdaad. Kan overigens zonder 'lelijke' EOlns met Debug.Print arrUserData(intCounter, 2); Spc(1); Debug.Print arrUserData(intCounter, 3); Spc(1); etc

Of natuurlijk een geneste loop maken 2-8. Eigenlijk is de array ook niet nodig aangezien je immers direct de cellen kunt uitlezen: dus geen array maken maar direct
Visual Basic:
1
2
3
4
5
For i = startRij To maxRij
   For j = startKolom To maxKolom
       'doe je ding met bijv Cells(i,j)
   Next j
Next i


En inderdaad, PS doet dat makkelijker :P
Oh, die Debug.Print (die ik via jou heb leren kennen als ik me niet vergis) gebruik ik enkel om in de VBA-editor te knoeien. In de finale code wordt dat naar cellen weggeschreven natuurlijk.

Wat betreft je alternatief: zou er een performanceverschil tussen beiden zijn?

[ Voor 4% gewijzigd door YellowOnline op 30-08-2012 14:16 ]


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Ach wel ja, geef mij maar de schuld :+ ;)

Als je genoeg geheugen hebt, zou een array inderdaad misschien wat sneller kunnen zijn. Maar IMHO wil je toch al geen Excel meer gebruiken als het over hoeveelheden gaat dat je dat kunt merken. Verschil is in ieder geval "inhoudelijk": de array kan achter de feiten aanlopen als de spreadsheet verandert. Daarom zou ik, behalve als er functionele voordelen zijn, direct vanuit de brontabel werken.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
F_J_K schreef op donderdag 30 augustus 2012 @ 14:56:
Ach wel ja, geef mij maar de schuld :+ ;)

Als je genoeg geheugen hebt, zou een array inderdaad misschien wat sneller kunnen zijn. Maar IMHO wil je toch al geen Excel meer gebruiken als het over hoeveelheden gaat dat je dat kunt merken. Verschil is in ieder geval "inhoudelijk": de array kan achter de feiten aanlopen als de spreadsheet verandert. Daarom zou ik, behalve als er functionele voordelen zijn, direct vanuit de brontabel werken.
Ik denk dat het in mijn geval dan niets uitmaakt: het Excel-bestand wordt door een powershell script (dat een verbinding met de DB maakt) maandelijks gegenereerd en de data is daardoor statisch in de XLSM zelf.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

F_J_K schreef op donderdag 30 augustus 2012 @ 14:04:
En inderdaad, PS doet dat makkelijker :P
Dit doet toch precies hetzelfde?
code:
1
2
3
4
Dim c as range
for each c in [range]
debug.print c.value
next c

Waarbij hij bij mij keurig ook eerst de rijen afwerkt en dan pas kolommen. Zo niet heb je altijd nog:
code:
1
2
3
4
for each r in range.rows
 for each c in r
next c
next r

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1