Avatar billede dramsgaard Nybegynder
06. april 2011 - 22:39 Der er 4 kommentarer og
1 løsning

tilføj data til array i VBA

Hvordan kan man lettest tilføje data til et array som allerede findes. F.eks. hvis jeg har flg.:

//////

Dim vArr As Variant

vArr = Range("F2:F6").Value

'udskriv
Range("G2:G6").Value = vArr

//////

Hvordan kan jeg nemmest tilføje f.eks. Range("A2:A6").Value i bunden af det der i forvejen er i vArr??
Avatar billede Tryphon Nybegynder
07. april 2011 - 08:53 #1
Hej dramsgaard

Jeg ved ikke, om det er den nemmeste løsning, men den virker. Problemet er, at man kun kan udvide et array i sidste dimension, og når du henter data fra Excel ved arr=range,så har du brug for at udvide i første dimension. Du skal derfor først "vende" arrayet, udvide, tilføje og så "vende" igen.

Function AddToArr()
Dim vArr() As Variant
Dim vArrKolA() As Variant
Dim vTempArr() As Variant
Dim x As Integer

  vArr() = Range("f2:f6")
  vArrKolA = Range("a2:a6")
 
' Du kan kun tilføje til sidste dimension i et array
' derfor skal arrayet vendes
  TransponeArray_Var vArr(), vTempArr()

' Redimensioner dit temp array
  ReDim Preserve vTempArr(LBound(vTempArr, 1) To UBound(vTempArr, 1), _
    LBound(vTempArr, 2) To UBound(vTempArr, 2) + UBound(vArrKolA, 1)) As Variant

' Indsæt data fra kolonne a
  For x = LBound(vArrKolA, 1) To UBound(vArrKolA, 1) Step 1
    vTempArr(1, x + UBound(vArr, 1)) = vArrKolA(x, 1)
  Next x
 
' Vend igen for korrekt udlæsning til cellerne
  TransponeArray_Var vTempArr(), vArr()
  Range("g2:g11") = vArr()
End Function

Function TransponeArray_Var(ByRef InputArray() As Variant, ByRef OutputArray() As Variant)
' Transpones a Variant array into a new array
Dim x As Long
Dim y As Long

  ReDim OutputArray(LBound(InputArray, 2) To UBound(InputArray, 2), LBound(InputArray, 1) To UBound(InputArray, 1)) As Variant
   
  For x = LBound(InputArray, 2) To UBound(InputArray, 2) Step 1
    For y = LBound(InputArray, 1) To UBound(InputArray, 1) Step 1
      OutputArray(x, y) = InputArray(y, x)
    Next y
  Next x
End Function
Avatar billede dramsgaard Nybegynder
07. april 2011 - 19:52 #2
tak for svar.

hmm det virker godt nok voldsomt med den kode for en forholdsvis simpel handling.

Der må da være en langt nemmere løsning
Avatar billede Tryphon Nybegynder
07. april 2011 - 20:15 #3
Hvis der er, kunne jeg også godt tænke mig at kende den, men jeg tvivler, da man kun kan udvide et array i sidste dimension. I et array, der er hentet fra en range, står rækker i første dimension og kolonner i sidste. Hvis du vil koble data på kolonnevis, kan du bare skrive

redim preserve array(lbound(array,1) to ubound(array,1), lbound(array,2) to ubound(array,2) + antal kolonner, du vil have på) og så tilføje data.

Hvis det drejer sig om rækker, er du nødt til at vende arrayet, så rækkker kommer til at stå i sidste dimension for at du kan udvide det.

Det er jo trods alt kun tre step
1) vend array (funktionben TransponeArray_Var)
2) udvid array
3) vend array tilbage

Jeg har lagt funktionen TransponeArray_Var i en klasse, som jeg bare lægger ind, når jeg skal bruge den. Så kan den jo genbruges :-)
Avatar billede dramsgaard Nybegynder
22. maj 2011 - 13:22 #4
har glemt at lukke

- det var ikke helt det jeg søgte, men hvis du vil have point, så smid et svar
Avatar billede Tryphon Nybegynder
22. maj 2011 - 19:20 #5
Det er jeg næsten klar over, men man kan som sagt kun føje til i sidste dimension af et array, og når man henter et array fra Range, står rækkerne desværre i første dimension.

Selvom koden ser voldsom ud, er det jo blot

1) Vend array, så rækkerne kommer i sidste dimension
2) Udvid ved at ReDim array
3) Tilføj til dit array
4) Vend igen array, så der kan skrives til en Range i dit Excelark.

Bemærk, at der er to funktioner. Den sidste af dem er den, der vender arrayet.
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

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