Arvot listaksi

ListUniqueValues

Pitäisi saada kehiteltyä automaatti, joka poimii tietyistä sarakkeista arvot luetteloksi siten, että kukin arvo näkyisi listassa vain kerran. Periaatteessa samanlainen kuin tässä https://answers.microsoft.com/en-us/office/forum/office_2013_release-excel/formula-or-vba-function-to-list-unique-values-from/6e9f3e42-a8f8-44f2-8fd2-a0cdf929ca0c paitsi että "paljon" mutkikkaampi.
Ensinnäkin arvoja on useassa taulukossa (7-8 taulukkoa), joista ne pitäisi poimia yhteen luetteloon. Työkirjassa on taulukoita, joista tietoja haetaan, ja sellaisia, joista ei haeta. Niiden taulukoiden, joista haetaan, nimi alkaa aina samalla sanalla, vaikkapa "peli": peli_jokin, peli_muu jne. ja sitten on muunnimisiä, jotka siis jätetään huomioimatta.
Toiseksi eri sarakkeissa ja eri taulukoissa toistuu koko ajan samoja arvoja, mutta kukin arvo pitäisi tulla listaan vain kerran. Tuossa linkittämässäni sivussa oleva kaava ei sen vuoksi toiminut oikein edes yhdessä taulukossa: jos sama arvo oli kahdessa eri sarakkeessa, se tuli kahteen kertaan.
Ja vielä yksi lisähaaste: osa arvoista on suluissa, ja sellaiset pitäisi jättää väliin. Poimisi siis "arvo", mutta ei "(arvo)".
Listan pitäisi vieläpä olla automaattisesti päivittyvä, eli jos tulee muutoksia, pitäisi muutosten päivittyä tuohon listaankin, ilman että joutuu mitenkään erikseen käymään sitä päivittämässä.
Haettavat arvot ovat tekstiä (muutaman kirjaimen mittaisia koodeja). Sarakkeet, joista haetaan ovat F,J,N,R,V. Kaikissa peli_-alkuisissa taulukoissa nuo samat sarakkeet. Rivejä voi olla enimmillään ehkä 400. Tyhjiä rivejä on välissä. Erilaisia arvoja on käytännössä varmaan alle 100.

5

486

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Kundepuu

      Tällä kertaa teinkin collection objektilla , koska se herjaa jos lisää tupla-arvon ja sitä hyödynsin ;-), eli koodi on tosi simppeli


      moduuliin...
      Option Explicit
      Dim cl As Range
      Dim cainoa As Collection
      Dim i As Long
      Dim uList() As Variant
      Dim ws As Worksheet
      Dim TäytäLista As Variant

      Sub Uniikit()
      On Error Resume Next
      Application.ScreenUpdating = False
      Set cainoa = New Collection
      For Each ws In ThisWorkbook.Worksheets
      ' muuta haettava taulukon nimi sopivaksi ja kirjainten määrä nimen alusta(ISOLLA KIRJAIMILLA) nyt PELI ja 4 ekaa kirjainta
      If UCase(Left(ws.Name, 4)) = "PELI" Then
      ' muuta haettavat sarakeet sopivaksi
      ws.Activate
      Union(ws.Range("F:F"), ws.Range("J:J"), ws.Range("N:N"), ws.Range("R:R"), ws.Range("V:V")).SpecialCells(xlCellTypeConstants, 23).Select
      For Each cl In Selection
      If cl.Value <> "" And Not Left(cl.Value, 1) = "(" Then
      cainoa.Add cl.Value, CStr(cl.Value)
      End If
      Next cl
      ws.Range("F1").Select
      End If
      Next
      TäytäLista = ""
      If cainoa.Count > 0 Then
      ReDim uList(1 To cainoa.Count)
      For i = 1 To cainoa.Count
      uList(i) = cainoa(i)
      Next i
      TäytäLista = Application.WorksheetFunction.Transpose(uList)
      End If

      'kopioi uniikit A sarakkeeseen, muuta alue ja taulukon nimi sopiviksi
      Worksheets("Koonti").Activate
      Range("A:A") = ""
      Range("A1").Resize(cainoa.Count) = TäytäLista
      Range("A1").Select
      Application.ScreenUpdating = True
      On Error GoTo 0
      End Sub

      ThisWorkbook (TämäTyökirja) moduuliin...

      Option Explicit

      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      If Sh.Name = "Koonti" Then Exit Sub
      If Not Intersect(Union(Range("F:F"), Range("J:J"), Range("N:N"), Range("R:R"), Range("V:V")), Target) Is Nothing Then
      Uniikit
      End If
      End Sub

      Keep EXCELing
      @Kunde

    • ListUniqueValues

      Olipa tosiaan simppeli, heh... on se helppoa, jos osaa. Kiitoksia avusta.
      Yksi isompi ja yksi pienempi ongelma vielä on, vaikka tästä oli tosiaan jo minulle paljon apua.

      Kun tekee jotain muutoksia noihin kohteena oleviin sarakkeisiin, niin lista päivittyy sinne koonti-sivulle ihan kuten halusinkin, mutta se koontisivu jää sitten aina näkyviin. Jos teen vaikkapa sinne peli_jokin -taulukkoon 10 muutosta putkeen, niin joutuu 9 kertaa palaamaan siihen takaisin, kun joka välissä joutuu siihen koonti-taulukkoon. Jos muutos on sellainen, että poistan jotain ja kirjoitan jotain tilalle, tuo koontiin heittäminen tapahtuu itse asiassa kahdesti. Voiko tuota fiksata siten, että muutoksen tehtyäni pysyisin edelleen siellä, minne sen muutoksen olen tehnyt, ja se koonti vain päivittyisi niin, että voin käydä sitä katsomassa sitten, kun sen listan haluan nähdä?

      Toinen juttu on, että tuo ei jotenkin hyväksy arvojen siirtelyä noiden sarakkeiden sisällä. Jos vaikka solussa F3 lukisi "test" ja F4 on tyhjä, ja haluan siirtää sen "test"-sanan soluun F4, niin onnistuu siten, että tyhjennän F3:n ja kirjoitan F4:ään, mutta ei onnistu raahaamalla eikä cut-paste -menetelmällä, vaan tulee "Run-time error 1004: Method 'intersect' of object '_Global' failed". Copy-paste kyllä toimii. Tämähän ei ole iso ongelma, kun sen voi helposti kiertää, kun vain muistaa.

    • Kundepuu

      Mikä EXCEL versio käytössä?
      Mulla kyllä voi raahata kopioida ja leikata ihan normaalisti (v.2010)
      muuta koodissa loppuosa


      Sub Uniikit()
      On Error Resume Next
      Application.ScreenUpdating = False
      Set cainoa = New Collection
      For Each ws In ThisWorkbook.Worksheets
      ' muuta haettava taulukon nimi sopivaksi ja kirjainten määrä nimen alusta(ISOLLA KIRJAIMILLA) nyt PELI ja 4 ekaa kirjainta
      If UCase(Left(ws.Name, 4)) = "PELI" Then
      ' muuta haettavat sarakeet sopivaksi
      ws.Activate
      Union(ws.Range("F:F"), ws.Range("J:J"), ws.Range("N:N"), ws.Range("R:R"), ws.Range("V:V")).SpecialCells(xlCellTypeConstants, 23).Select
      For Each cl In Selection
      If cl.Value <> "" And Not Left(cl.Value, 1) = "(" Then
      cainoa.Add cl.Value, CStr(cl.Value)
      End If
      Next cl
      ws.Range("F1").Select
      End If
      Next
      TäytäLista = ""
      If cainoa.Count > 0 Then
      ReDim uList(1 To cainoa.Count)
      For i = 1 To cainoa.Count
      uList(i) = cainoa(i)
      Next i
      TäytäLista = Application.WorksheetFunction.Transpose(uList)
      End If

      'kopioi uniikit A sarakkeeseen, muuta alue ja taulukon nimi sopiviksi
      Worksheets("Koonti").Range("A:A") = ""
      Worksheets("Koonti").Range("A1").Resize(cainoa.Count) = TäytäLista
      Worksheets("Koonti").Range("A1").Select
      Application.ScreenUpdating = True
      On Error GoTo 0
      End Sub

      Keep EXCELing
      @Kunde

    • Kundepuu

      unohtui tää toinen koodi...

      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      If Sh.Name = "Koonti" Then Exit Sub
      If Not Application.Intersect(Union(Range("F:F"), Range("J:J"), Range("N:N"), Range("R:R"), Range("V:V")), Target) Is Nothing Then
      Uniikit
      Sh.Activate
      End If
      End Sub

    • ListUniqueValues

      Molemmat ongelmat hävisivät. 2016 tuo versio on, vaikkei sillä enää liene väliä, mutta vastaanpa kuitenkin kysymykseen. Kiitos taas.

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

    Luetuimmat keskustelut

    1. Ihanasti alkoi aamu: SDP:n kaula kokoomukseen jo 6,9 %-yks

      Lindtmanin I hallitus on tukevasti jytkyttämässä laittamaan Suomi kuntoon Orvon täystuhohallituksen jäljiltä, jonka kann
      Maailman menoa
      310
      2443
    2. Olen niin kesken

      Omien asioiden suhteen etkä voi odottaa loputtomiin. Mun on muutenkin niin vaikea suhun luottaa vaikka joku ihme syvyys
      Ikävä
      16
      1850
    3. Teidän persujen pitäisi välillä miettiä kuinka Suomen talous saataisiin kuntoon

      Ja lopettaa tuo tyhjänpäiväinen maahanmuuttajista höpöttäminen. Teillä on sentään rahaministerin salkku tällä kierroksel
      Maailman menoa
      66
      1780
    4. Tietääkö joku ylläpidosta?

      Miten näillä palstoilla tomii tuo ylläpito, onko sitä yli päätään olemassa vai ovatko huhut totta että on palstan kirjoi
      Sinkut
      221
      1434
    5. Minkä ikäinen

      Minkä ikäinen on kaipauksesi kohde?
      Ikävä
      97
      1429
    6. Auttaja paikalla. Kerro huolesi. (Osa 2)

      Voin auttaa sinua näkemään tilanteesi uudesta näkökulmasta. Voin antaa lohtua, toivoa ja rohkeutta. Olen elänyt maan pä
      Ikävä
      186
      1190
    7. Martina ei mennyt naimisiin

      IS 17.9: Martinan häät peruuntui, tajusi, ettei ollut oikea aika. Rahat meni hevosiin. On edelleen parisuhteessa Yhdysva
      Kotimaiset julkkisjuorut
      144
      1043
    8. TTK:sta tippunut Sara Siipola rehellisenä Jurza-open kanssa: "Että jaa, siinäkö..."

      Tippuiko oikea TTK-pari ensimmäisenä? Joka tapauksessa iso kiitos tansseistanne Sara ja Jurza Tanssii Tähtien Kanssa -p
      Tanssii tähtien kanssa
      20
      1010
    9. Nainen olet ensimmäinen tarpeeksi vahva

      joka kestää tämän kokonaisuuden, minut. Persoonani, tunteeni, kipuni, pelkoni. Olen aina pidätellyt itseäni ja antanut v
      Ikävä
      60
      1003
    10. Kaninkolojen vaikutus?

      Vinkki sinkkumiehille: jos haluatte kunnollisen täysijärkisen naisen, niin kaivautukaa ulos kaninkoloistanne ja parantak
      Sinkut
      171
      996
    Aihe