Avatar billede beanbag Nybegynder
10. juli 2006 - 11:59 Der er 8 kommentarer og
2 løsninger

Bygge videre på VBA der vender en matrix..

Nedenstående kode var der en flink mand der hjalp mig med for lang tid siden i NG for regneark.

Koden tager en dataopstilling hvor der er tal ud til højre med en betegnelse over hver kolonne, f.eks. et budget med 12 månedskolonner, og omdanner det til en tabel med kun 1 kolonne med tal, men tilgengæld 12 linier for hver post (en for hver måned). Formålet er at få tabeldata der er mere fleksible at analysere med en pivottabel.

Makroen fungerer fint sålænge der kun er 1 kolonne og 1 række med navne.

Jeg kan ikke helt finde ud af at tilpasse makroen så den også kan håndtere hvis der f.eks. er to kolonner med "overskrifter" der skal "låses" ift. omdannelsen til en tabel - eller hvis der er 2 rækker med "overskrifter" der skal kopieres ned som en del af den nye tabel.

Er der nogen der kan hjælpe. Hvis makroen kan gøres dynamisk så brugeren definerer hvor mange hhv. kolonner og rækker der skal være "overskrifter" vil det være ekstra fornemt.

pft
Thomas

Sub NuSkalDuVendes()
    Dim raDerSkalVendes As Range
    Dim startCelle As Range
    Dim iStartCol As Integer
    Dim iStartRow As Integer
    Dim Counter As Integer
    Dim myCell As Range


    'Det aktuelle område ActiveCell kan udskiftes med Range("xx")
    Set raDerSkalVendes = ActiveCell.CurrentRegion
    iStartCol = raDerSkalVendes.Cells(1, 1).Column
    iStartRow = raDerSkalVendes.Cells(1, 1).Row
    'Uden overskrifterne og første kolonne
    Set raDerSkalVendes = raDerSkalVendes.Offset(1, 1).Resize(raDerSkalVendes.Rows.Count - 1, raDerSkalVendes.Columns.Count - 1)


    'Opretter lige et nyt ark til de vendte data
    ActiveWorkbook.Worksheets.Add
    Set startCelle = ActiveCell.Offset(1)
    'Indsætter overskrifter
    ActiveCell.Value = "Overskrift A"
    ActiveCell.Offset(0, 1).Value = "Overskrift B"
    ActiveCell.Offset(0, 2).Value = "Overskrift C"


    'Så løbes alle data igennem
    For Each myCell In raDerSkalVendes
        startCelle.Offset(Counter, 0).Value = myCell.Offset(0, -myCell.Cells.Column + iStartCol)
        startCelle.Offset(Counter, 1).Value = myCell.Value
        startCelle.Offset(Counter, 2).Value = myCell.Offset(-myCell.Cells.Row + iStartRow)
        Counter = Counter + 1
    Next
    End Sub
Avatar billede bak Forsker
10. juli 2006 - 17:40 #1
denne er til 2 kolonner og 2 rækkeoverskrifter.
Den er desværre ikke dynamisk, men det fikser jeg måske engang (ellers klarer de andre nok det :-)))

Sub MatrixToList()
Dim rngAll As Range
Dim rngValues As Range
Dim rngOutput As Range
Dim c As Range
Dim listen()
Dim y As Long, x As Long

  y = 0
  Set rngAll = Application.InputBox(prompt:="hvilket område skal listes?", Type:=8)
  Set rngValues = rngAll.Offset(2, 2).Resize(rngAll.Rows.Count - 2, rngAll.Columns.Count - 2)

  x = rngValues.Cells.Count
  ReDim listen(1 To x, 1 To 5)
  For Each c In rngValues
      If Not CSng(c) = 0 Then
        y = y + 1
       
        listen(y, 1) = Cells(c.Row, rngAll.Column).Value
        listen(y, 2) = Cells(c.Row, rngAll.Column + 1).Value
        listen(y, 3) = Cells(rngAll.Row, c.Column).Value
        listen(y, 4) = Cells(rngAll.Row + 1, c.Column).Value
        listen(y, 5) = c.Value
       
      End If
  Next
  Set rngOutput = Application.InputBox(prompt:="Hvortil ?", Type:=8)
  rngOutput.Resize(x, 5) = listen
End Sub
Avatar billede supertekst Ekspert
10. juli 2006 - 17:50 #2
Et lignende bud -
Dim antalKol, antalRæk, antalOverKol, antalOverRæk
Sub vendMatrix()
    antalOverKol = 2        'Antal OverskriftsKolonner - ændres t/indtastning
    antalOverRæk = 2        'Antal OverskriftsRækker
   
    antalKol = ActiveCell.SpecialCells(xlLastCell).Column
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
   
    udførVending
End Sub
Private Sub udførVending()
Dim ræk, kol, målRæk, målKol
    ræk = antalOverRæk + 1
    kol = 1
   
    målRæk = antalRæk + 3
    målKol = 1
   
    For r = ræk To antalRæk
        For k = antalOverKol + 1 To antalKol
            For x = 1 To antalOverKol
                Cells(målRæk, målKol) = Cells(r, x).Value
                målKol = målKol + 1
            Next x
           
            Cells(målRæk, målKol) = Cells(r, k).Value
            målKol = målKol + 1
            For y = 1 To antalOverRæk
                Cells(målRæk, målKol) = Cells(y, k).Value
                målKol = målKol + 1
            Next y
            målKol = 1
            målRæk = målRæk + 1
        Next k
    Next r
End Sub
Avatar billede beanbag Nybegynder
11. juli 2006 - 01:00 #3
Bak - det er kanon. Og hurtigt!
Og så har det den yderligere fordel at jeg forstår tilstrækkeligt til at kunne tilpasse den manuelt. :o)
Tak for det og smid et svar...
Avatar billede beanbag Nybegynder
11. juli 2006 - 01:04 #4
Supertekst - jeg har også prøvet dit bud.
Jeg kan bare ikke få det til at virke? Det ser ud som om at der ikke sker noget når jeg aktiverer makroen. Jeg får ikke nogen fejlmeddelelser eller noget. Hvor er det meningen at den skal skrive resultatet til? Det er muligt at det er mig der er for træt til at fatte helt hvad jeg skal gøre. Men tak for indsatsen - smid et svar så fordeler jeg point.
Avatar billede beanbag Nybegynder
11. juli 2006 - 01:05 #5
Jeg opretter et nyt spørgsmål hvor jeg efterspørger en automatisering af din makro Bak - altså at man får mulighed for at indtaste hvor mange hhv. overskriftskolonner og rækker der er, og makroen så tilpasses til dette..
Det er tilladt ikke?
Avatar billede supertekst Ekspert
11. juli 2006 - 09:00 #6
Her er et svar + kommentar til min løsning:
Den "vendte matrix" opbygges på samme ark - 3 rækker under den oprindelige.

Som en begyndelse - blev antallet af ønskede overskrifter - varieret manuelt i begyndelsen af koden - men dette kan ændres via en indtastning:

Sub vendMatrix()
    antalOverKol = 2        'Antal OverskriftsKolonner - ændres t/indtastning
    antalOverRæk = 2        'Antal OverskriftsRækker
Avatar billede beanbag Nybegynder
12. juli 2006 - 17:33 #7
-> bak
lægger du også et svar..
Avatar billede beanbag Nybegynder
12. juli 2006 - 17:39 #8
->supertekst
Jeg kan simpelthen ikke få din kode til at reagere?
Skal man stå et bestemt sted - har prøvet det hele syntes jeg.
Avatar billede bak Forsker
12. juli 2006 - 17:41 #9
ok:-)
Avatar billede supertekst Ekspert
13. juli 2006 - 09:36 #10
Nej - det er ikke nødvendigt - men det der måske er specielt, er at jeg beregner den sidste række i arket: "antalRæk = ActiveCell.SpecialCells(xlLastCell).Row" - hvis du prøver at erstatte denne linie med "nr. på din første ledige række" - så sker der måske noget:

Sådan ser mit test-resultat ud:

Art    Afd    jan    feb    mar    apr    maj    jun
År        1999    2000    2001    2002    2003    2004
Kto 1    B    1    2    3    4    5    6
Kto 2    C    11    22    33    44    55    66


Kto 1    B    1    jan    1999           
Kto 1    B    2    feb    2000           
Kto 1    B    3    mar    2001           
Kto 1    B    4    apr    2002           
Kto 1    B    5    maj    2003           
Kto 1    B    6    jun    2004           
Kto 2    C    11    jan    1999           
Kto 2    C    22    feb    2000           
Kto 2    C    33    mar    2001           
Kto 2    C    44    apr    2002           
Kto 2    C    55    maj    2003
Kto 2    C    66    jun    2004
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