Hierarkia siirtymä-funktiolla

Puuaivo2

Minulla on Excel- tietokantoja, jossa on A-sarakkeessa tasoja ilmaisevat luvut 1-6, ja niihin liittyvät tiedot B-sarakkeessa.

Tarkoitus olisi saada aikaan hierarkiapuu, jossa 1. tason tiedot jäisivät B-sarakkeeseen, mutta seuraavat tasot aina yhden sarakkeen oikealle siten että 6. taso tulisi sarakkeeseen G.

Tein ensialkuun painikkeita, joissa oli koodi tyyliin:

Private Sub CommandButton1_Click()
Selection.Cut
ActiveCell.offset(0, 1).Select
ActiveSheet.Paste
End Sub

Painikkeiden käyttö osoittautui kuitenkin työlääksi tietokannan koon ollessa suuri. Suodatetut rivit kun piti valita yksitellen.

Yritin tehdä makroa, mutta taitoni eivät riittäneet.
Siksi käännyn gurujen puoleen, jos vaikka saisin pienen vihjeen homman ratkaisemiseksi.

13

408

    Vastaukset 13

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • karvalaggi

      Jos tämä on vain kertaluonteinen tapahtuma, tekisin minä näin. Esimerkissäni minulla on soluissa C1:H1 tasoluvut 1-6 (otsikot) ja tiedosto alkaa 2 riviltä. Kaavat:
      C2=JOS(A2=1;B2;"")
      D2=JOS(A2=2;B2;"")
      E2=JOS(A2=3;B2;"")
      F2=JOS(A2=4;B2;"")
      G2=JOS(A2=5;B2;"")
      H2=JOS(A2=6;B2;"")
      Valitse hiirellä solut C2:H2. Tuplaklikkaa solun H2 oikeassa alakulmassa olevaa "pallukkaa". Kaavat kopioituvat alaspäin niin pitkälle kuin A/B sarakkeissa on tietoja.
      Kopioidut solut jäävät "valituiksi". Suorita "Kopioi". Valitse solu C2 ja liitä määräten (vain arvot). Poista sarake B. Nyt sinulla on jaoteltu tiedot hierarkisesti sarakkeisiin B:G

      • Puuaivo2

        Kiitos. Tuokaltaisen virityksen olin jo tehnyt. Taulukoita on useita, ja niitä päivitetään jatkuvasti. Tarkoitus olisi saada käyttöön makrolla toimiva yleisemmässä käytössä oleva ratkaisu.


    • ORCL

      moduuliin:

      Sub MuokkaaHierarkiapuu()

      Dim Taso As Variant
      Dim ViimeinenRivi As Integer
      Dim i As Integer

      ViimeinenRivi = Cells(Rows.Count, 1).End(xlUp).Row

      For i = 1 To ViimeinenRivi

      Taso = Cells(i, 1).Value

      On Error Resume Next

      Select Case Taso

      Case 2
      Cells(i, 3).Value = Cells(i, 2).Value
      Cells(i, 2).ClearContents

      Case 3
      Cells(i, 4).Value = Cells(i, 2).Value
      Cells(i, 2).ClearContents

      Case 4
      Cells(i, 5).Value = Cells(i, 2).Value
      Cells(i, 2).ClearContents

      Case 5
      Cells(i, 6).Value = Cells(i, 2).Value
      Cells(i, 2).ClearContents

      Case 6
      Cells(i, 7).Value = Cells(i, 2).Value
      Cells(i, 2).ClearContents

      End Select

      Next i

      End Sub

      • Puuaivo2

        Kiitos. Tämä toimi hyvin. Sitä on helppo muokata myös laajentuneeseen taulukkoon sopivaksi.


    • moduuliin...

      Sub Siirrä()
      Dim Alue As Range
      For i = 1 To 6
      Set Alue = Etsi(i)
      Alue.Offset(0, i 1) = Alue.Offset(0, 1)
      Next
      Columns("B:B").Delete
      End Sub

      Function Etsi(Hakuehto As Variant) As Range
      Dim solu As Range
      Dim EkaOsoite As String
      With Range("A:A")
      Set solu = .Find( _
      What:=Hakuehto, _
      LookIn:=xlValues, _
      LookAt:=xlWhole, _
      SearchOrder:=xlByRows, _
      SearchDirection:=xlNext, _
      MatchCase:=False, _
      SearchFormat:=False)
      If Not solu Is Nothing Then
      Set Etsi = solu
      EkaOsoite = solu.Address
      Do
      Set Etsi = Union(Etsi, solu)
      Set solu = .FindNext(solu)
      Loop While Not solu Is Nothing And solu.Address <> EkaOsoite
      End If
      End With
      End Function

      Keep EXCELing
      @Kunde

      • Puuaivo2

        Kiitos. Kunden koodi on kunnianhimoisen näköistä, mutta en saanut sitä toimimaan. Makron suorituksessa tuli seuraavanlainen virheilmoitus:

        Microsoft Visual Basic for Applications
        Run-time error '91':
        Object variable or With block variable not set


    • plockare

      Minun versiossa valitaan ensin haluttu sarake tai sarakkeesta arvoalue, jossa on ne luvut kuinka etäälle kyseisestä luvusta oikealla olevan solun arvo siirretään. Esimerkiksi tässä tapauksessa valittaisiin sarake A ja ajettaisiin makro.

      Makrossa tarkastetaan ensin että valittuna on vain yhden sarakkeen tietoja. Sitten suodatetaan alueen soluista pelkästään positiiviset arvoltaan yli 1 olevat kokonaisluvut. Kun luku kelpaa, niin oikeanpuoleisen solun sisältöä siirretään luvun verran valintasarakkeesta oikealle päin.

      Pastebin-linkki jos s24 rikkoo tuon koodin, vaikkei tietysti sisennyksillä ole VBA:ssa mitään merkitystä: http://pastebin.com/m09YQ5WK

      Sub siirra()
      If Selection.Columns.Count() = 1 Then
      For Each cell In Selection
      If Len(cell.Value) > 0 Then
      If IsNumeric(cell.Value) = True Then
      If Int(cell.Value) = cell.Value And cell.Value > 1 Then
      cell.Offset(0, 1).Cut cell.Offset(0, cell.Value)
      End If
      End If
      End If
      Next
      End If
      End Sub

      • jos valitaan sarake reilut miljoona luuppia tekee, vaikka tarvitsisi esim. 30 riviä käydä läpi ;-)


      • Tämmöinen

        Jos välilyönnin korvaa sidotulla välilyönnillä, se muuttuu S24:ssä tavalliseksi välilyönniksi joka säilyy. Sidottu välilyönti ( Alt 0160) on suomalaisen standardin (SFS 5966) näppäimistössä Alt välilyönti.


      • Puuaivo2

        Kiitos. Tämä oli sellainen, että makro piti ajaa joka riviltä erikseen. Ei paljoa eroa omaan nappulaviritykseen.


      • plockare
        Puuaivo2 kirjoitti:

        Kiitos. Tämä oli sellainen, että makro piti ajaa joka riviltä erikseen. Ei paljoa eroa omaan nappulaviritykseen.

        Valitsitko varmasti kaikki lukuarvot sisältävän alueen (tai koko sarakkeen) ennen makron ajamista? Tuo käy siis koko valitun alueen läpi. Jos vain yksi solu on valittuna, niin silloin temput tehdään vain sen solun riville.


      • Puuaivo2

        Ok. Koko alueen valinta tosiaan auttoi. Siihen pitää vielä lisätä alueen valintaa varten koodia.


      • plockare
        Puuaivo2 kirjoitti:

        Ok. Koko alueen valinta tosiaan auttoi. Siihen pitää vielä lisätä alueen valintaa varten koodia.

        Joo siihen voi laittaa ensimmäiseksi riviksi vaikka Columns("A:A").Select tai Range("A1:A20").Select, jos alue on aina samassa kohtaa.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Puukotus Kajaanissa

      Kuka puukotti ja ketä? https://yle.fi/a/74-20247765 Vähemmän yllättäen päihteet mainittu
      Kajaani
      49
      1155
    2. Taas henkirikos

      Kuka lienee nyt asialla.
      Ilomantsi
      16
      815
    3. Mitä söpö

      Mies mietit?
      Ikävä
      63
      725
    4. 68
      722
    5. Miten uskallan sua nähdä

      Kun vaikutat suuttuneelta :(
      Ikävä
      47
      694
    6. Nainen, tässä olen kahden vaiheilla

      Toinen pitäisi valita ja kummassakin on hyvät ja huonot puolensa. Toinen olisi sellainen pysyvä mutta työläs. Toinen taa
      Ikävä
      69
      678
    7. Hyvä on sitten, jos et sitä s*ksiä halua kanssani.

      Rakastetaan vaan toisiamme, voin käydä muualla tyydyttämässä fyysisenpuolen tarpeet. Puhumalla tämäkin olisi selvinnyt.
      Ikävä
      131
      615
    8. Suloinen ja herkkä

      Toiset huomioiva, räväkkä, yllättävä. Ei sellaisesta voi olla pitämättä.
      Rakkaus ja rakastaminen
      31
      585
    9. Humalassa autolla ajo.

      Tuhti humala hyydytti kuljettajan Suomussalmella -sammui rattiin ,uutisoi Ylä-Kainuu.
      Suomussalmi
      9
      530
    10. Minä muistan

      Minä muistan sinut nauravana. Sellaisena, joka sai tavallisenkin hetken tuntumaan vähän kevyemmältä, kuin huoneeseen ol
      Ikävä
      45
      508
    11. Tiesitkö? Jorma Uotisen EX-rakas on Helena Lindgren - Nämä ovat välit nyt: "Me ollaan..."

      Jorma Uotinen ja Helena Lindgren olivat avoliitossa v. 1982-1999. Pariskunta oli aikansa näyttävä julkkispari, missä i
      Kotimaiset julkkisjuorut
      8
      490
    12. Hyvää yötä hurmuri

      Iltaa haaveeni! Kauniita unia😘 Jospa me vielä nähtäis ja juteltais, suukoteltais ja halittais, siliteltäis ja hyväiltä
      Ikävä
      24
      463
    13. Hurja pako Kuhmossa

      19 vuotias kaahasi humalassa jalkakäytävälle tänään. Kuka mitä häh.
      Kuhmo
      4
      462
    14. Jäljitelmä Birginit

      Ei jumaleisson, Jeffin vaimo kertoo et nää Hermesit olikin jäljitelmiä ja timangit labrarääsää. Anna mun kaikki kestää �
      Kotimaiset julkkisjuorut
      104
      459
    15. Pitäisikö seksille asettaa huvivero?

      (ja jos hankkisi todistuksen sen harrastamisesta velvollisuudesta tai lisääntymistarkoituksessa, saisi siitä vapautuksen
      Sinkut
      113
      434
    16. Olet pelottava ilme vakavana

      Sitä alkaa ajatella äkkiä kaikenlaista. Synkkiäkin juttuja. Kai tässä oma mielikuvitus kun laukkaa. 🤔😳
      Ikävä
      26
      417
    17. Mä voisin rakastua noihin tähti silmiin

      Katseesi on niin lumoava nainen💚.
      Ikävä
      13
      410
    18. Kaduttaako kun jätit vastaamatta

      Vai oliko tarkoitus satuttaa?
      Ikävä
      33
      398
    19. Jos tullaan toisiamme vastaan, niin

      pitäiskö pysähtyä ja onnitella?
      Ikävä
      35
      389
    20. Kaikki pilattu

      Paluuta normaaliin ei ole. Kiitos ja hyvästi.
      Ikävä
      30
      385
    Aihe