[VBA] Hoe maak ik een multidimensionale array?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Beschouw de volgende directory:
code:
1
2
3
4
5
6
EX0008-001.tif
EX0091-001.tif
EX0091-002.tif
EX0091-003.tif
EX0777-001.tif
EX0777-002.tif

Ik probeer in VBA een script te schrijven dat een inputfile genereert voor een softwarepakket. De eerste stap hier is dat ik de plaatjes (single page tif waarde het getal voor het streepje het documentnummer is en het getal achter het streepje het paginanummer) in een multidimensionale array krijg, als volgt:
code:
1
2
3
4
5
Array(
  [EX0008] = Array (001)
  [EX0091] = Array (001, 002, 003)
  [EX0777] = Array (001, 002)
)

Tenminste, op deze manier zou php het displayen (ik heb voornamelijk ervaring met php maar dat is in dit geval geen optie):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Set objShell = CreateObject("WScript.Shell")
currentDirectory = objShell.CurrentDirectory

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder(currentDirectory)

Set TifCollection = CreateObject("System.Collections.ArrayList")

For each objFile in objFolder.Files
  If objFso.GetExtensionName (objFile.Path) = "tif" Then
    fileNumber = Split(objFile.Name, "-")(0)
    pageNumber = Split(objFile.Name, "-")(1)

    If Not TifCollection(fileNumber).Exists Then
        Set TifCollection.Item(fileNumber) = CreateObject("System.Collections.ArrayList")
    End If

    TifCollection.Item(fileNumber).Add pageNumber
  End If
Next

Ook na lang zoeken ben ik geen eenvoudig voorbeeld tegen gekomen dat uitlegt hoe ik een array als deze kan opbouwen. Ik krijg nu de foutmelding "Class doesn't support Automation: TifCollection" en weet niet hoe dit op te lossen (TifCollection is imho een Array en geen Class?)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 23:06

MueR

Admin Tweakers Discord

is niet lief

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:10

Janoz

Moderator Devschuur®

!litemod

Je php kennis zit je in de weg. Wat php een 'array' noemt is helemaal geen array, maar een Map of Dictionary. Daarnaast is System.Collections.ArrayList wel degelijk gewoon een class (welke een array representeert)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik denk dat je Collection zoekt, het standaard vba object dat het meeste op een php array lijkt. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
OK, thanks. Ik ben weer wat verder gekomen, zie onderstaande code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
'Setup required variables
Set objShell = CreateObject("WScript.Shell")
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder(objShell.CurrentDirectory)
Set TifCollection = CreateObject("Scripting.Dictionary")
Set Loadfile = CreateObject("Scripting.Dictionary")

'Compile 2-dimensional array listing all documents with their pages
For Each objFile In objFolder.Files
  If objFso.GetExtensionName (objFile.Path) = "tif" Then
    file = Split(objFile.Name, "-")(0)
    page = Split(objFile.Name, "-")(1)
    If Not TifCollection.Exists(file) Then
        TifCollection.Add file, CreateObject("Scripting.Dictionary")
    End If
    TifCollection.Item(file).Add page, ""
  End If
Next

'Loop through the array to compile the loadfile
For Each file In TifCollection.Keys
  For Each page In TifCollection(file) 
    If (page = "001.tif") Then 
      Loadfile.Item.Add file & "," & page & ",Y,,," & TifCollection(file).Count, CreateObject("Scripting.Dictionary")
    Else 
      Loadfile.Item.Add file & "," & page & ",,,", CreateObject("Scripting.Dictionary")
    End If
  Next
Next

'Expected output from loop above (in array):
'EX0008,001.tif,Y,,,1
'EX0091,001.tif,Y,,,3
'EX0091,002.tif,,,
'EX0091,003.tif,,,
'EX0777,001.tif,Y,,,2
'EX0777,002.tif,,,

'Write loadfile to the filesystem
'1. Implode Loadfile with newlines
'2. Write to filesystem with name Loadfile.txt

Ik krijg een error in regel 24: "Wrong number of arguments or invalid property assignment: Loadfile.Item". Ik snap deze error niet, want in regel 14 voeg ik aan een andere array ook een item te, en dat gaat wel goed. Graag feedback. De verwachte output van de loop tussen regel 21 en 29 staat eronder.

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 13:47

edeboeck

mie noow noooothing ...

Heb je al geprobeerd met Items.Add?
(ofwel met Item, maar dan wel het gewenste item doorgeven tussen de haakjes)

[ Voor 44% gewijzigd door edeboeck op 31-10-2013 10:58 . Reden: tweede suggestie ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
edeboeck schreef op donderdag 31 oktober 2013 @ 10:58:
Heb je al geprobeerd met Items.Add?
(ofwel met Item, maar dan wel het gewenste item doorgeven tussen de haakjes)
Loadfile.Items.Add? Dit geeft de error "Object required: Loadfile.Items"? Of begrijp ik je nu verkeerd?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Coca-Cola
  • Registratie: Maart 2001
  • Laatst online: 23:13
offtopic:
Concordance load file aan het maken? Oude meuk ;)

[ Voor 8% gewijzigd door Coca-Cola op 31-10-2013 11:27 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Item is een functie/default property op basis van een key; de constructie .Item. kan dus nooit. Je bedoelt dus direct Loadfile.Add denk ik.

Een mogelijk probleem van een Dictionary gebruiken ipv een Collection is dat in theorie een Dictionary geen ordering heeft, en een Collection wel. In de praktijk lijkt de huidige implementatie van een Dictionary wel FIFO te zijn, maar dit is niet gedocumenteerd.

Ik zou persoonlijk dus Collection en zo'n soort functie gebruiken, omdat Collection helaas geen .Exists() heeft:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Function GetOrInitiateCollection(c As Collection, key As String) As Collection
    On Error GoTo err
    Set GetOrInitiateCollection = c(key)
    Exit Function
err:
    If err.Number = 5 Then
        Set GetOrInitiateCollection = New Collection
        c.Add GetOrInitiateCollection, key
    Else
        On Error GoTo 0
        Resume
    End If
End Function

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Bedankt voor alle reakties. (idd concordance loadfile ;)) De reaktie van pedorus snap ik (nog) niet helemaal dus misschien maak ik dezelfde fout hieronder weer. In ieder geval heb ik nu het volgende:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Set objShell = CreateObject("WScript.Shell")
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder(objShell.CurrentDirectory)
Set objLoadfile = objFso.CreateTextFile(objFolder & "\loadfile.opt",True)
Set objLines = CreateObject("Scripting.Dictionary")
Set TifCollection = CreateObject("Scripting.Dictionary")

'Compile 2-dimensional array listing all documents with their pages
For Each objFile In objFolder.Files
  If objFso.GetExtensionName (objFile.Path) = "tif" Then
    file = Split(objFile.Name, "-")(0)
    page = Split(objFile.Name, "-")(1)
    If Not TifCollection.Exists(file) Then
        TifCollection.Add file, CreateObject("Scripting.Dictionary")
    End If
    TifCollection.Item(file).Add page, ""
  End If
Next

'Loop through the array to compile the loadfile
For Each file In TifCollection.Keys
  For Each page In TifCollection(file)
    If (page = "001.tif") Then 
      ObjLines.Add file & "," & page & ",Y,,," & TifCollection(file).Count, ""
    Else 
      ObjLines.Add strLine & file & "," & page & ",,,", ""
    End If
  Next
Next

'Write loadfile to filesystem
objLoadfile.Write(Join(objLines, Chr(10)))

Ik voeg in de loop van line 25 volgens mij regels van de loadfile toe aan de objLines array. In regel 36 wil ik die lines imploden (php jargon ;)) met een newline. Ik krijg alleen een error: "Wrong number of arguments or invalid property assignment"?

Ook niet onbelangrijk: waarop moet ik Googlen als ik nog meer vragen heb hierover? Als ik google op "vba" krijg ik ook allerlei Excel examples. Googlen op vbscript geeft allerlei ASP voorbeelden. En VB is het ook niet want dit is geen visual basic...

[ Voor 7% gewijzigd door Reveller op 31-10-2013 12:23 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
objLines kun je niet joinen, want dat is niet gedefinieerd voor een Dictionary, objLines.Keys of objLines.Items wel. Of je kunt de resultaten gewoon per regel schrijven op de vba manier ([google=vba file open]).

Googelen op VBA lijkt mij prima, eventueel in combinatie met het vba-programma wat kennelijk niet excel is.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1