Avatar billede beanbag Nybegynder
11. juli 2006 - 01:12 Der er 6 kommentarer og
1 løsning

Bygge videre på makro #2

Se dette spørgsmål:

http://www.eksperten.dk/spm/719916

Jeg har fået en makro fra bak der virker som ønsket, men ville gerne have at den kunne automatiseres lidt mere, så brugeren indtaster hvor mange hhv. rækker og kolonner der skal betragtes som overskrifter.

Se orginal makro fra bak i ovenstående spørgsmål (Overskrifter i 2 rækker og 2 kolonner) og en tilpasset en jeg har fået til at virke med 2 rækker og 3 kolonner.

Er der nogen der har mod på at automatisere dette?


Sub MatrixToList23()
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, 3).Resize(rngAll.Rows.Count - 2, rngAll.Columns.Count - 3)'RETTET

  x = rngValues.Cells.Count
  ReDim listen(1 To x, 1 To 6)'RETTET
  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(c.Row, rngAll.Column + 2).Value'TILFØJET
        listen(y, 4) = Cells(rngAll.Row, c.Column).Value'RETTET
        listen(y, 5) = Cells(rngAll.Row + 1, c.Column).Value'RETTET
        listen(y, 6) = c.Value'RETTET
       
      End If
  Next
  Set rngOutput = Application.InputBox(prompt:="Hvortil ?", Type:=8)
  rngOutput.Resize(x, 6) = listen'RETTET
End Sub
Avatar billede mrjh Novice
11. juli 2006 - 15:58 #1
Det ser ud som om du bare skal offsette yderligere ved at ændre linien

Set rngValues = rngAll.Offset("RÆKKER", "KOLONNER").Resize(rngAll.Rows.Count - ("RÆKKER", rngAll.Columns.Count - "KOLONNER")'RETTET
Avatar billede bak Forsker
12. juli 2006 - 01:16 #2
Her er en dynamisk version

Sub test()
    Dim matrixrange As Range
    Dim ListOutput As Range
    Dim CHeaders As Long
    Dim RHeaders As Long

    Set matrixrange = Application.InputBox(prompt:="hvilket område skal listes?", Type:=8)
    Set ListOutput = Application.InputBox(prompt:="Hvortil ?", Type:=8)
    CHeaders = InputBox("Antal kolonneoverskrifter ? :")
    RHeaders = InputBox("Antal rækkeoverskrifter ? :")
    Call MatrixToList(matrixrange, ListOutput, CHeaders, RHeaders)
End Sub

Sub MatrixToList(rngAll, rngOutput, ColHeaders, RowHeaders)
    Dim rngValues As Range
    Dim c As Range
    Dim MyList()
    Dim Counter1 As Long
    Dim Counter2 As Long
    Dim Counter3 As Long
    Dim Counter4 As Long
   
    Counter3 = 0
   
    Set rngValues = rngAll.Offset(RowHeaders, ColHeaders).Resize(rngAll.Rows.Count - RowHeaders, rngAll.Columns.Count - ColHeaders)    'RETTET

    Counter4 = rngValues.Cells.Count
    ReDim MyList(1 To Counter4, 1 To ColHeaders + RowHeaders + 1)
    For Each c In rngValues
        If Not CSng(c) = 0 Then
            Counter3 = Counter3 + 1
            For Counter1 = 1 To ColHeaders
                MyList(Counter3, Counter1) = Cells(c.Row, rngAll.Column + Counter1 - 1).Value
            Next
            For Counter2 = 1 To RowHeaders
                MyList(Counter3, Counter2 + ColHeaders) = Cells(rngAll.Row + Counter2 - 1, c.Column).Value
            Next
            MyList(Counter3, ColHeaders + RowHeaders + 1) = c.Value
        End If
    Next
   
    rngOutput.Resize(Counter4, ColHeaders + RowHeaders + 1) = MyList
End Sub
Avatar billede beanbag Nybegynder
12. juli 2006 - 17:24 #3
-> mrjh
Jaeeh, det er nok rigtigt nok, men det er jo kun en lille del af de ændringer i makroen der skal til. Der skal jo også tilføjes en linie nede ved "listen" osv.
Avatar billede beanbag Nybegynder
12. juli 2006 - 17:29 #4
-> bak
Jeg er simpelthen så glad for din makro. Jeg ville ønske jeg kunne finde ud af at lave sådan noget.
Tak for hjælpen - smid et svar
Avatar billede bak Forsker
12. juli 2006 - 17:31 #5
ok, jeg synes da også den en sød :-)
Avatar billede beanbag Nybegynder
12. juli 2006 - 21:36 #6
Sød.. nå ja hehe
Men sparet mig for en del arbejde - det har den...
Avatar billede bak Forsker
12. juli 2006 - 22:57 #7
Bemærk lige at der ikke tages 0-værdier og blanke fra selve dataområdet med i den nye liste.
Det er med vilje, men ønsker du at tage dem med alligevel så udkommenter linien:
If Not CSng(c) = 0 Then

og den End If der hører til.
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

IT-JOB

AL Sydbank

AI Engineer

Politiets Efterretningstjeneste

Teknisk IT-sikkerhedsspecialist i PET

Capgemini Danmark A/S

AI Data Architect

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Solution Manager til Cyberdivisionen