Avatar billede i865 Nybegynder
26. september 2013 - 12:20 Der er 1 løsning

2-dimensional array

Hej Eksperter,
Jeg har to 2-dimensional arrays - Array1(1,2) og Array2(5,2). Dvs. Array1 er en record og Array2 er en table med records. Jeg ønsker at tilføje records til tablen.

Betingelsen er at tilføje Array1 til Array2, kun såfremt først kollonne som er nøgle ikke er i Array2 i forvejen. Er den i Array2 skal Array2 overskrives med værdierne fra Array1 for den givne record.

Det hele skal ske i VBA og kun med en læsning fra worksheet range og en skrivning til worksheet range.

Eksempel:

Array1:
Grp    CurrentPlan
G    10

Array2:
Grp    CurrentPlan
F    1
B    2
C    3

Resultat i Array2
Array2:
Grp    CurrentPlan
F    1
B    2
C    3
G    10
30. september 2013 - 20:46 #1
Prøv engang at kigge på denne kode, og se om du efterfølgende kan få hul igennem din egen kode...

Sub ArrayDemo()
    Dim aSource As Variant, aTarget As Variant
    Dim iLastTarget As Integer, iNewMax As Integer
    Dim x As Integer, y As Integer
   
    ' Opret et target array 3,2 med indhold
    ReDim aTarget(1 To 3, 1 To 2)
    aTarget(1, 1) = "Allan"
    aTarget(1, 2) = "1"
    aTarget(2, 1) = "Bente"
    aTarget(2, 2) = "2"
    aTarget(3, 1) = "Casper"
    aTarget(3, 2) = "3"
   
    ' Opret et source array 1,2 med indhold
    ReDim aSource(1 To 1, 1 To 2)
    aSource(1, 1) = "Doris"
    aSource(1, 2) = "4"
   
    ' Udvid target array så alt fra source array kan fyldes deri
    iLastTarget = UBound(aTarget, 1)
    iNewMax = iLastTarget + UBound(aSource, 1)
   
    ' Et to demintionelt array kan ikke udvides i første demintion, men kun i den anden,
    ' derfor må array'et vendes rundt, udvides og vendes tilbage igen
    aTarget = TransposeArray(aTarget) ' byt om
    ReDim Preserve aTarget(1 To 2, 1 To iNewMax) ' udvid
    aTarget = TransposeArray(aTarget) ' byt retur
   
    ' Indsæt nye værdier
    For x = LBound(aSource, 1) To UBound(aSource, 1)
        For y = LBound(aSource, 2) To UBound(aSource, 2)
            aTarget(iLastTarget + x, y) = aSource(x, y)
        Next y
    Next
       
    'Indsæt værdier i aktivt ark
    ActiveSheet.Range("A1").Resize(UBound(aTarget, 1), UBound(aTarget, 2)).Value = aTarget
   
End Sub


Public Function TransposeArray(ByVal aSource As Variant) As Variant
    Dim aRetVal As Variant
    Dim lRow As Long, lCol As Long

    ReDim aRetVal(LBound(aSource, 2) To UBound(aSource, 2), LBound(aSource, 1) To UBound(aSource, 1))
    For lRow = LBound(aSource, 1) To UBound(aSource, 1)
        For lCol = LBound(aSource, 2) To UBound(aSource, 2)
            aRetVal(lCol, lRow) = aSource(lRow, lCol)
        Next lCol
    Next lRow

    TransposeArray = aRetVal
End Function
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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