11. december 2001 - 13:58Der er
15 kommentarer og 1 løsning
VBA Dynamisk datatabel i begge retninger
Med henvisning til http://www.eksperten.dk/spm/144746 kunne jeg godt tænke mig at se om det er muligt at også antallet af kolonner kunne gøres dynamisk. Jeg ønsker at der kan være et vilkårligt antal kolonner, og et vilkårligt antal rækker i hver kolonne. Outputtet skal være en listning af alle kombinationer og komme ud i lige så mange kolonner som inputtet. Dvs. at hvis der i inputarket er 3 kolonner med hhv. 10, 10 og 4 rækker bliver outputtet 3 kolonner og 400 rækker. Håber jeg har gjort det forståeligt!
Jeg gider ikke at lave det, men jeg kan godt give et par ideer.
Tæl antal kolonner i række 1 For i = 1 to antalKolonner sMatrix = Column(i).CountA & \",\" \'Skal indeholde noget mere, men gi\'r dig nok ideen. Next i sMatrix = Left(sMatrix, Len(sMatrix)-1) \'For at fjerne det sidste komma \'sMatrix ser nok sådan ud nu 10,10,4 - med det eks. du har angivet.
Redim MyMatrix (sMatrix) \'Aner ikke om det virker, men måske
Husk at lave et check på, at du ikke smutter over 65536 rækker :-)
OK, Nu har jeg fået hul på den således at alle kolonner og rækker læses ind i x antal array\'s og jeg kan såmænd også få dem ud igen, bare ikke i rigtig rækkefølge og sammensætning. Nu er problemet: hvordan får jeg dem nu parret sammen så de kan komme rigtigt ud??
Hvis array1 indeholder 10 numre, array2 10 numre og array3 4 numre, hvordan får jeg nu lavet en/flere løkker der parrer disse???. Bemærk at der kan blive flere end 3 arrays
Det går knap så godt. Her er koden så vidt. Option Base 1 Sub test1() Set AWF = Application.WorksheetFunction Dim Matrix, NoOfRowMatrix Dim a, x, y, z, MaxColumns, MaxRows As Integer MaxRows = 0 Totalrows = 1 With AWF MaxColumns = .CountA(Range(\"1:1\")) \'tæl kolonner ReDim NoOfRowMatrix(MaxColumns) \'Array til at holde antal i kolonne For x = 1 To MaxColumns NoOfRowMatrix(x) = .CountA(Columns(x)) - 1 \'antal rækker pr kolonner \'** find største antal rækker If NoOfRowMatrix(x) > MaxRows Then MaxRows = NoOfRowMatrix(x) \'*** beregn det antal rækker der bliver brug for Totalrows = Totalrows * NoOfRowMatrix(x) Next x End With If Totalrows > 65000 Then Exit Sub \'hvis der er for mange rækker så stop ReDim Matrix(MaxRows, MaxColumns) \'Dim Matrix ex. (10,3) \'Data ind i matrix For z = 1 To MaxColumns For y = 1 To NoOfRowMatrix(z) Matrix(y, z) = Cells(y + 1, z) Next y Next z
\'data ud fra matrix With Worksheets(\"Ark2\") For z = 1 To MaxColumns For y = 1 To NoOfRowMatrix(z) .Cells(y, z) = Matrix(y, z) Next Next z End With End Sub
Som sagt er problemet at skrive en løkke der kan tage data ud af matrix\'en og i korrekt rækkefølge. Matrix\'en er lavet således at matrix(10,1) indeholder kol. A. Matrix(10,2) = kol. B. og matrix(10,3) = Kol C. NoOfRowsMatrix(x) indeholder så hvor mange elementer der aktuelt er i kol (x).
OK, så kan jeg også tage data ud i rigtig rækkefølge, men det kan sikkert blive bedre. With Worksheets(\"Ark2\") For z = 1 To MaxColumns repetion = 1 For x = z + 1 To MaxColumns repetion = repetion * NoOfRowMatrix(x) Next x a = 1 While a <= totalrows For y = 1 To NoOfRowMatrix(z) For i = 1 To repetion .Cells(a, z) = Matrix(y, z) a = a + 1 Next i Next y Wend Next z End With
hmmm - hvad er det jeg har set, når jeg først kigger i morgen .... LOL
Synes godt om
Ny brugerNybegynder
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.