Avatar billede snowball Novice
11. april 2005 - 15:14 Der er 16 kommentarer og
1 løsning

VBA: Resize dynamisk 2-dimensionalt array

Hej.

Jeg har lidt problemer med at få ændret størrelsen på et 2-dimensionalt array. Jeg har en helt masse linier som skal læses ind i et array, men jeg ved på forhånd ikke hvor mange linier der er, da der skal manipuleres med linierne.

Jeg opretter array'et som følgende:

Dim myArray() As Variant

Det går fint nok første gang jeg vil sætte størrelsen:

ReDim Preserve myArray(1, 9)

Men derefter kan jeg ikke så lov til at ændre størrelsen på den første dimension til f.eks. 2 i stedet for 1. Jeg kan sagtens ændre størrelsen på den anden dimension.

Hvordan kan jeg ændre størrelsen på den første dimension?

På forhånd tak.
Avatar billede kabbak Professor
11. april 2005 - 15:27 #2
Only the upper bound of the last dimension in a multidimensional array can be changed when you use the Preserve keyword; if you change any of the other dimensions, or the lower bound of the last dimension, a run-time error occurs. Thus, you can use code like this:

ReDim Preserve Matrix(10, UBound(Matrix, 2) + 1)
But you cannot use this code:

ReDim Preserve Matrix(UBound(Matrix, 1) + 1, 10)
Avatar billede snowball Novice
11. april 2005 - 16:10 #3
Det var da ikke ret smart lavet ;|

Nå, men det er der ikke noget at gøre ved. Bare træls at skulle til at flytte data over i et nyt array op til flere tusinde gange, så den metode er heller ikke så holdbar.

Har du et forslag til en anden måde man kan gemme data midlertidigt på? De data jeg skal gemme er x antal rækker med hver 9 værdier. Kunne selvfølgelig gemme data i et nyt midlertidigt ark.
Avatar billede kabbak Professor
11. april 2005 - 17:00 #4
hvis jeg kan se din kode, hvor du læser ind i Arrayet, er der måske en anden løsning.
Avatar billede bak Forsker
11. april 2005 - 19:49 #5
Avatar billede snowball Novice
12. april 2005 - 07:31 #6
kabbak: Der er ikke så meget hokus pokus i det. Åbner en tekstfil ind i Excel, og gennemløber så blot hver linie og gemmer det i array'et.

    iMaxRow = ActiveSheet.UsedRange.Rows.Count
    iSAPCount = 1
    ReDim Preserve SAPImportArray(1, 9) 'Første gang, så ingen problemer!
    For iRow = 1 To iMaxRow
      SAPImportArray(iSAPCount, 1) = Cells(iRow, 5).Value
      SAPImportArray(iSAPCount, 2) = Cells(iRow, 6).Value
      SAPImportArray(iSAPCount, 3) = Cells(iRow, 8).Value
      SAPImportArray(iSAPCount, 4) = Cells(iRow, 9).Value
      SAPImportArray(iSAPCount, 5) = Cells(iRow, 11).Value
      SAPImportArray(iSAPCount, 6) = Cells(iRow, 15).Value
      SAPImportArray(iSAPCount, 7) = Cells(iRow, 3).Value
      SAPImportArray(iSAPCount, 8) = Cells(iRow, 4).Value
   
      strStartPos = Cells(iRow, 14).Value
      strCompDesc = ""
     
      Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos
     
      SAPImportArray(iSAPCount, 9) = strCompDesc
      iSAPCount = iSAPCount + 1
      ReDim Preserve SAPImportArray(iSAPCount, 9) 'Her går det så galt!
    Next
Avatar billede snowball Novice
12. april 2005 - 08:48 #7
Lavede det om sådan så jeg kun gemmer 1 linie ad gangen, og så indsætter jeg de data med det samme i stedet for at løbe hele tekstfilen igennem med det samme. Det giver godt nok en masse skift mellem de 2 filer, men det er der jo ikke så meget at gøre ved.

Lav et svar hvis du vil have lidt point ;)
Avatar billede kabbak Professor
12. april 2005 - 08:56 #8
her er jeg gået en lille omvej, det er nok ikke en måde du er vant til.


iMaxRow = ActiveSheet.UsedRange.Rows.Count
    iSAPCount = 1
    Dim SAPImport()
    Dim SAPImportArray(1, 9) 'Første gang, så ingen problemer!
    For iRow = 1 To iMaxRow
      SAPImportArray(iSAPCount, 1) = Cells(iRow, 5).Value
      SAPImportArray(iSAPCount, 2) = Cells(iRow, 6).Value
      SAPImportArray(iSAPCount, 3) = Cells(iRow, 8).Value
      SAPImportArray(iSAPCount, 4) = Cells(iRow, 9).Value
      SAPImportArray(iSAPCount, 5) = Cells(iRow, 11).Value
      SAPImportArray(iSAPCount, 6) = Cells(iRow, 15).Value
      SAPImportArray(iSAPCount, 7) = Cells(iRow, 3).Value
      SAPImportArray(iSAPCount, 8) = Cells(iRow, 4).Value
   
      strStartPos = Cells(iRow, 14).Value
      strCompDesc = ""
     
      Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos
     
      SAPImportArray(iSAPCount, 9) = strCompDesc
    ReDim Preserve SAPImport(iSAPCount)
    SAPImport(iSAPCount) = SAPImportArray 'Her går det så galt!
      iSAPCount = iSAPCount + 1
     
    Next

Dine variabler ligger nu i  SAPImport(1)(1,1) og fremefter, den sidste i første linie er SAPImport(1)(1,9)

næste linie starter i SAPImport(2)(1,1) o. s. v.
Avatar billede kabbak Professor
12. april 2005 - 09:16 #9
en rettelse

iMaxRow = ActiveSheet.UsedRange.Rows.Count
    iSAPCount = 1
    Dim SAPImport()
    Dim SAPImportArray(1, 9)
    For iRow = 1 To iMaxRow
      SAPImportArray(1, 1) = Cells(iRow, 5).Value
      SAPImportArray(1, 2) = Cells(iRow, 6).Value
      SAPImportArray(1, 3) = Cells(iRow, 8).Value
      SAPImportArray(1, 4) = Cells(iRow, 9).Value
      SAPImportArray(1, 5) = Cells(iRow, 11).Value
      SAPImportArray(1, 6) = Cells(iRow, 15).Value
      SAPImportArray(1, 7) = Cells(iRow, 3).Value
      SAPImportArray(1, 8) = Cells(iRow, 4).Value
   
      strStartPos = Cells(iRow, 14).Value
      strCompDesc = ""
     
      Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos
     
      SAPImportArray(1, 9) = strCompDesc
    ReDim Preserve SAPImport(iSAPCount)
    SAPImport(iSAPCount) = SAPImportArray ' smider arrayet SAPImportArray ind i SAPImport(iSAPCount)
      iSAPCount = iSAPCount + 1
     
    Next
Avatar billede snowball Novice
12. april 2005 - 09:17 #10
OK. Det er også en mulighed ;)

Ved du hvordan jeg kan få fjernet det sidste linieskift (Chr(10) - Chr(13) kom med ved en fejl) i min strCompDesc streng? At fjerne det sidste tegn i strengen har ingen effekt, og kan jo ikke lave en replace på hele strengen eftersom det jo kun er det sidste linieskift jeg vil fjerne :)
Avatar billede kabbak Professor
12. april 2005 - 09:20 #11
en lidt nemmere

iMaxRow = ActiveSheet.UsedRange.Rows.Count
    iSAPCount = 1
    Dim SAPImport()
    Dim SAPImportArray(9)
    For iRow = 1 To iMaxRow
      SAPImportArray(1) = Cells(iRow, 5).Value
      SAPImportArray(2) = Cells(iRow, 6).Value
      SAPImportArray(3) = Cells(iRow, 8).Value
      SAPImportArray(4) = Cells(iRow, 9).Value
      SAPImportArray(5) = Cells(iRow, 11).Value
      SAPImportArray(6) = Cells(iRow, 15).Value
      SAPImportArray(7) = Cells(iRow, 3).Value
      SAPImportArray(8) = Cells(iRow, 4).Value
   
      strStartPos = Cells(iRow, 14).Value
      strCompDesc = ""
     
      Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos
     
      SAPImportArray(9) = strCompDesc
    ReDim Preserve SAPImport(iSAPCount)
    SAPImport(iSAPCount) = SAPImportArray ' smider arrayet SAPImportArray ind i SAPImport(iSAPCount)
      iSAPCount = iSAPCount + 1
     
    Next

Dine variabler ligger nu i  SAPImport(1)(1) og fremefter, den sidste i første linie er SAPImport(1)(9)

næste linie starter i SAPImport(2)(1) o. s. v.
Avatar billede kabbak Professor
12. april 2005 - 09:22 #12
er det fra tekstfilen du får fejl, hvordan ser koden ud der. ?
Avatar billede kabbak Professor
12. april 2005 - 09:33 #13
Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos
      strCompDesc = left(strCompDesc,len(strCompDesc)-2)

kan det ikke gøre det
Avatar billede snowball Novice
12. april 2005 - 09:47 #14
Nej, det hjælper som sagt ikke noget at fjerne de sidste par tegn. Om jeg skriver minus 1, 2, eller 5 ændrer ikke på strengen.
Avatar billede kabbak Professor
12. april 2005 - 12:15 #15
så vidt jeg kan se, virker det her

iMaxRow = ActiveSheet.UsedRange.Rows.Count
    iSAPCount = 1
    Dim SAPImport()
    Dim SAPImportArray(9)
    For iRow = 1 To iMaxRow
      SAPImportArray(1) = Cells(iRow, 5).Value
      SAPImportArray(2) = Cells(iRow, 6).Value
      SAPImportArray(3) = Cells(iRow, 8).Value
      SAPImportArray(4) = Cells(iRow, 9).Value
      SAPImportArray(5) = Cells(iRow, 11).Value
      SAPImportArray(6) = Cells(iRow, 15).Value
      SAPImportArray(7) = Cells(iRow, 3).Value
      SAPImportArray(8) = Cells(iRow, 4).Value
   
      strStartPos = Cells(iRow, 14).Value
      strCompDesc = ""
     
      Do
        strCompDesc = strCompDesc & Cells(iRow, 15).Value & Chr(10) & Chr(13)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos

      strCompDesc = Left(strCompDesc, Len(strCompDesc) - 2)' fjerner de 2 sidste
      SAPImportArray(9) = strCompDesc

    ReDim Preserve SAPImport(iSAPCount)
    SAPImport(iSAPCount) = SAPImportArray ' smider arrayet SAPImportArray ind i SAPImport(iSAPCount)
      iSAPCount = iSAPCount + 1
     
    Next
Avatar billede snowball Novice
12. april 2005 - 12:16 #16
Det virkede ikke umiddelbart hos mig, så jeg lavede lidt om på det så det nu ser sådan her ud inde i min for/next:

      FirstRow = True
     
      Do
        If Not FirstRow Then strCompDesc = strCompDesc & Chr(10)

        FirstRow = False
        strtmp = Trim(Cells(iRow, 15).Value)
        If strtmp <> "" Then strCompDesc = strCompDesc & Trim(Cells(iRow, 15).Value)
        iRow = iRow + 1
      Loop While Cells(iRow, 14).Value = strStartPos

Det giver samme effekt.

Laver du et svar? :)
Avatar billede kabbak Professor
12. april 2005 - 12:35 #17
et svar ;-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester