Tiedon siirtoa solusta kommenttikenttään

Tarpeilija

Miten siirrän VB:llä tietoa Taul1:n sisällä seuraavasti.
Ainoastaan solusta P4, jossa tieto vaihtuu -pitäisi siirtää tieto nappia painamalla A-sarakkeen riveille (2-2000) siten, että tieto tallentuisi aina ensimmäiseen ylimpänä olevan tyhjän solun kommenttikenttään. Joskus A-sarakkeesta tyhjennetään joku solu, jolloin siitä tulee silloin ylin tyhjä solu.

VB taitoni ei yllä tuohon, saako apua tälläiseen ongelmaan.

24

223

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Tämmöinen

      Tavalliseen moduliin seuraava rivi:
      Public Edellinen

      Työkirjan moduliin:

      Private Sub Workbook_Open()
         Edellinen = Worksheets("Taul1").Range("P4")
      End Sub

      Taul1:n moduliin seuraavat:

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
         If Not Intersect(Target, Range("P4")) Is Nothing Then
            Edellinen = Target.Value
         End If
      End Sub
      ' ----
      Private Sub Worksheet_Change(ByVal Target As Range)
         Application.EnableEvents = False
         If Not Intersect(Target, Range("P4")) Is Nothing Then
            On Error Resume Next
            Range("A1").Comment.Delete
            On Error GoTo Täysi
            Range("A2:A2000").SpecialCells(xlCellTypeBlanks).Select
            ActiveCell = Edellinen
            Range("A1").AddComment.Text (Edellinen)
            Target.Offset(1, 0).Range("A1").Select
         End If
         Application.EnableEvents = True
      Exit Sub
      Täysi:
         Application.EnableEvents = True
         Target.Offset(1, 0).Range("A1").Select
         MsgBox ("Kaikki rivit täynnä!" & Chr(13) _
               & "Edellinen arvo oli:" & Chr(13) & Edellinen)
      End Sub
      '----

      Minulla tosin tuo haku ei jostain käsittämättömästä syystä löydä tyhjiä rivejä enää rivin 22 jälkeen. Miten muilla? Missähän on vika?

    • Tarpeilija

      Kiitos Tämmöselle, yritin rakentaa ohjeesi mukaan. En onnistunut, tein varmaan jotain väärin.
      Siksi kysynkin tarkennusta..

      Tuleeko tämä tarkasti ottaen minkä alle -moduuliin?
      >>Tavalliseen moduliin seuraava rivi:
      >>Public Edellinen

      Tämä siis "Tämä työkirja" moduuliin.
      >>Private Sub Workbook_Open()
      >>Edellinen = Worksheets("Taul1").Range("P4")
      >>End Sub


      Tämä selkeästi siis Taul1 moduuliin.
      >>Taul1:n moduliin seuraavat:
      >>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      >>If Not Intersect(Target, Range("P4")) Is Nothing Then
      >>Edellinen = Target.Value
      >>End If
      >>End Sub

      >>' ----

      >>Private Sub Worksheet_Change(ByVal Target As Range)
      >>Application.EnableEvents = False
      >>If Not Intersect(Target, Range("P4")) Is Nothing Then
      >>On Error Resume Next
      >>Range("A1").Comment.Delete
      >>On Error GoTo Täysi
      >>Range("A2:A2000").SpecialCells(xlCellTypeBlanks).Select
      >>ActiveCell = Edellinen
      >> Range("A1").AddComment.Text (Edellinen)
      >>Target.Offset(1, 0).Range("A1").Select
      >>End If
      >>Application.EnableEvents = True
      >>Exit Sub
      >>Täysi:
      >>Application.EnableEvents = True
      >>Target.Offset(1, 0).Range("A1").Select
      >>MsgBox ("Kaikki rivit täynnä!" & Chr(13) _
      >>& "Edellinen arvo oli:" & Chr(13) & Edellinen)
      >>End Sub

    • Tämmöinen

      Tavalliseen moduliin tulee ainoastaan muuttujan Edellinen esittely. Tarvitaan, jotta se pysyy muistissa. Molemmat makrot tulevat Taul1:n moduliin.
      Jos kopioit tästä tekstiä, joka toinen rivi on tyhjä. Tarpeettomat pitää siivota pois. Ainakaan jatkuvan rivin (alaviivaan päättyvän) jälkeen ei saa olla tyhjää riviä.

    • Tarpeilija

      Aikani tuhertaessani sain aikaan sen, että vain A1 -soluun tuli lisäkommenttikenttä(punakolmio) ja sinne solun P4 sisältö. Seuraavat P4 -solun sisällöt tulivat ilman kommenttikenttää ja loppuivat riville 24, eli viimeisin tuli A24 soluun. Siihen loppui tuotto mulla.

      Oli siis tarkoitus, että solun P4 uusi sisältö siirtyisi napin- tai enterin painalluksella A-sarakkeelle aina ensimmäisen tyhjän solun kommenttikenttään, eli muodostaisi kommenttikentän (sen punakolmion) sinne soluun ja tieto sisään.

      • just niinhän koodi tekee ;-)
        Keep EXCELing
        @Kunde


      • Tämmöinen
        kunde kirjoitti:

        just niinhän koodi tekee ;-)
        Keep EXCELing
        @Kunde

        Miksi Excel ei käy läpi koko saraketta?


      • Tämmöinen

        Luin huonosti. Vaihda Range("A1") tilalle (Cells(r,1) silloin kommentti tulee samaan soluun.


      • odotellaan seuraavaa varmasti tulevaa bugia ;-)...

        Keep EXCELing
        @Kunde


    • Tämmöinen

      Tämä etsii tyhjan solun silmukalla:

      Private Sub Worksheet_Change(ByVal Target As Range)
         Application.EnableEvents = False
         If Not Intersect(Target, Range("P4")) Is Nothing Then
            For r = 2 To 2000
               If Cells(r, 1) = "" Then
                  On Error Resume Next
                  Range("A1").Comment.Delete
                  On Error GoTo Err
                  Range("A1").AddComment.Text (Edellinen)
                  Cells(r, 1) = Edellinen
                  Exit For
               End If
               If r = 2000 Then
                  MsgBox ("Kaikki rivit täynnä!" & Chr(13) _
                  & "Edellinen arvo oli:" & Chr(13) & Edellinen)
               End If
            Next r
         End If
      Err:
         Application.EnableEvents = True
      End Sub

      Sarake A päivittyy aina kun soluun P4 kirjoitetaan uusi arvo (ja painetaan enteriä tai poistutaan solusta). Nappia ei tarvitse painaa. Jos toiminnan haluaa nappiin, sen ohjelmaan tulee sama ohjelmanpätkä ilman ehtoa If Not Intersect...

    • Tarpeilija

      Kokeilin tätä viimeisintä Taul1 moduliin, muihin moduleihin en laittanut mitään.
      Kokeilin myös versiota, jossa tavalliseen moduliin ja Tämä työkirja-moduliin laitoin aiemmat koodit.
      Sain soluun A1 ainoastaan tyhjän kommenttikentän. Ei siis toiminut.

      Luontevaa olisi, jos soluun P4 kirjoittamani/liittämäni teksti siirtyisi reaaliaikaisesti heti enterin painamisen jälkeen A-sarakkeelle aina ensimmäiseen tyhjään soluun ja sen kommenttikenttään.
      Yksi ominaisuus kuitenkin toimi aiemmassa versiossa hyvin, eli se huomioi jos joku solu oli välissä tyhjä.
      Koodissa on selvästi ainesta, kunhan sitä hieman viilailisi. Tässä kohtaa olen kyllä muiden taitajien varassa, kun en itse hanskaa näitä.

      • Tämmöinen

        Tavallisessa modulissa täytyy olla esittely muuttujlle Edellinen. Muuten Excel ei muista sen arvoa, ja löytynyt tyhjä solu sekä kommentti jäävät tyhjiksi.

        Taul1'n modulissa pitää olla Worksheet_Change'n lisäksi alkuperäisessä listauksessa ollut Worksheet_SelectionChange, jossa Edellinen saa solun P4 arvon siihen siirryttäessä.

        Työkirjan modulissa olevan Workbook_Open'in puuttuminen ei estä toimintaa. Se on, jotta Edellisellä olisi arvo, silloinkin kun solua P4 muutetaan heti työkirjan avataamisen jälkeen ja solu P4 sattui jo olemaan aktiivinen (siihen ei siirrytä ennen muokkausta).


    • Tarpeilija

      Kiitos "Tämmönen".. sain varsin hyvin tähänastisen version toimimaan.
      Muutin A-sarakkeen alkamaan A2 -solusta, joka vastaa paremmin lopullista käyttötilannetta.
      Vielä jäi hieman alkuperäistä toivelistaa toteutumatta, tai sitten tee jotain väärin.

      Taisin ilmaista toiveeni epämääräisesti..

      Ajatuksena oli, että P4 -soluun kirjoitettu tekstitieto siirtyisi välittömästi enterin painamisen jälkeen A-sarakkeen ensimmäiseen vapaaseen tyhjään soluun ja siellä muodostettavaan kommenttikenttään.

      Ensimmäinen vapaa tyhjä soluhan voi olla missä kohtaa vaan A-saraketta, kun sarakkeelta tyhjennetään tietoa silloin tällöin, jolloin solut jää tyhjiksi.

      Miksiköhän muuten nyt vain ensimmäiseen ylimpään soluun tulee tuo kommenttikenttä ja sekin ainoastaan aloittaessa tyhjää työkirjaa, eikä kaikkiin soluihin, kuten oli tarkoitus?

      • Tämmöinen

        Jos kommentti tulee vain ylimpään soluun, 21.4.2016 7:50 ilmoittamani korjaus on tekemättä. Se oli mennyt väärän kommentin perään.


    • Tarpeilija

      No nyt toimii lähes mallikkaasti, kiitos.
      Vaikkakin tuo toimii teknisesti kuten pitääkin, niin se muutama pieni ominaisuus olisi vielä toivelistalla, eli tieto minkä kirjoitan NYT soluun P4, siirtyisi enterin painamisen tai toisen solun klikkaamisen jälkeen välittömästi seuraavan tyhjän solun kommenttikenttään, eikä vasta seuraavan uuden tiedon lisäämisen jälkeen. Nyt tieto päivittyy ikään kuin viiveellä, eikä reaaliaikaisesti. Pystyykö tuohon vaikuttamaan?

      Myöskään A-sarakkeen soluihin ei tarvitse tiedon siirtyä, ainoastaan solun kommenttikenttiin riittää. Tämä oli alkuperäinen toive.

      • Tämmöinen

        Jos tieto lisätään vain kommenttikenttään, tyhjä solu jää edelleen tyhjäksi ja tieto menee aina samaan paikkaan. Tämäkö on tarkoitus?


    • Tarpeilija

      Ideaalitilanne olisi, että P4 -solun tieto siirtyisi ainoastaan A-sarakkeen solujen kommenttikenttiin ja P20:stä tieto siirtyisi A-sarakkeen itse soluun.
      Onko tämä hankalaa toteuttaa?
      En ensin ajatellut, että tietoa voisi siirtää kahdesta P-sarakkeen solusta A-sarakkeelle.

    • Tarpeilija

      *Tarpeilija - alkuperäinen kysyjä*
      Tähän viimeiseen lisäykseen ei taida olla ratkaisua, eli
      Taul1 P4 tieto siirtyisi enterillä A-sarakkeen (2-2000) aina ylimmän vapaan solun kommenttikenttään ja itse soluun siirtyisi tieto P20:stä.
      Huomioitavaa, että A-sarakkeen soluja tyhjennetään välillä, eli aina joku solu muuttuu ylimmäiseksi tyhjäksi.

      • Tämmöinen

        Löytyneeseen soluun sijoitetaan Edellisen arvon sijasta solun P20 arvo:
        Cells(r, 1) = Range("P20")


    • Tarpeilija

      Jostain syystä en saa tätä toimimaan kuten ajattelin.
      Tarkoitus oli, että kun kirjoitan(-tai pastetan) soluihin P4 ja P20 tiedot, siirtyisivät ne A-sarakkeelle ensimmäiseen tyhjään soluun ylhältä lukien siten, että P20 tieto siirtyisi itse soluun ja P4 tieto siirtyisi saman solun kommenttikenttään.
      Nyt tieto kyllä siirtyy, mutta VASTA ns. seuraavalla syöttökierroksella, eli jos nyt kirjoitan P4 -soluun Tieto1 ja P20 -soluun Tieto2 -siirtyy ne A-sarakkeelle VASTA, kun syötän uudet tiedot P4 ja P20 -soluihin.
      Onko siis mahdollista saada tietojen siirtyvän reaaliaikaisesti, eikä vasta seuraavalla syöttökierroksella?

      Alla käyttämäni VB koodit. (onko jotain näissä väärin?)


      Tavallisessa moduulissa:
      Public Edellinen


      Tämä työkirja moduulissa:
      Private Sub Workbook_Open()
      Edellinen = Worksheets("Taul1").Range("P4")
      End Sub


      Taul1:n moduulissa:
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not Intersect(Target, Range("P4")) Is Nothing Then
      Edellinen = Target.Value
      End If
      End Sub
      Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
      If Not Intersect(Target, Range("P4")) Is Nothing Then
      For r = 2 To 2000
      If Cells(r, 1) = "" Then
      On Error Resume Next
      Cells(r, 1).Comment.Delete
      On Error GoTo Err
      Cells(r, 1).AddComment.Text (Edellinen)
      Cells(r, 1) = Range("P20")
      Exit For
      End If
      If r = 2000 Then
      MsgBox ("Kaikki rivit täynnä!" & Chr(13) & "Edellinen arvo oli:" & Chr(13) & Edellinen)
      End If
      Next r
      End If
      Err:
      Application.EnableEvents = True
      End Sub

    • Tarpeilija

      Onkohan Excel-gurut kesälaitumella jo.. ;D

    • Tämmöinen

      Enpäs taaskaan ollut lukenut kunnolla, vaan olin jostain saanut päähäni, että A-sarakkeeseen piti siirtää solun P4 vanha arvo. Siitä tuo viive. Kommenttiin ei voi laittaa mitä tahansa, vaan on varmistettava sen tekstimuotoisuudesta. Solun P20 muuttumista ei ensin pitänytkään tarkkailla. Seuraava Taul1:n moduliin tuleva makro ottaa senkin huomioon ja mitään muita määrittelyitä ei tarvita:

      Private Sub Worksheet_Change(ByVal Target As Range)
         Application.EnableEvents = False
         
         If Target.Column = 16 And (Target.Row = 4 Or Target.Row = 20) Then
            For r = 2 To 2000
               If Cells(r, 1) = "" Then
                  On Error Resume Next
                  Cells(r, 1).Comment.Delete
                  On Error GoTo Err
                  Cells(r, 1).AddComment.Text (Range("P4").Text)
                  Cells(r, 1) = Range("P20")
                  Exit For
               End If
               If r = 2000 Then
                  MsgBox ("Kaikki rivit täynnä!" & Chr(13) & "Edellinen arvo oli:" & Chr(13) & Edellinen)
               End If
            Next r
         End If

      Err:
      e = Err.Description
         Application.EnableEvents = True

      End Sub

      • Tämmöinen

        Edellinen jäi yhä kummittelemaan MsgBoxiin.


    • Tarpeilija

      Sain tämän toimimaan.. jotenkin.
      Ihan ensimmäisten tietojen syöttö tyhjän taulukkon P4:ään ja P20:een meni mallikkaasti, mutta jo seuraavien syöttöjen kanssa tuli hankaluuksia.. Koodi varmaan toimii jotenkin loogisesti oikein, mutta ei siten kuin ajattelin.
      Testasitko itse miten se sinulla toimii?

      Nyt tiedot siirtyvät aika villisti väärille soluille ja kommenteille.

    • Tarpeilija

      Millä ihmeen muokkauksella saisin tämän alla olevan koodin toimimaan siten, että P4 ja P20 soluihin syöttämäni tieto siirtyisi sarakkeen A2-A2000 soluihin, sekä kommentteihin vasta enterin tai napinpainamisen jälkeen?

      Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False

      If Target.Column = 16 And (Target.Row = 4 Or Target.Row = 20) Then
      For r = 2 To 2000
      If Cells(r, 1) = "" Then
      On Error Resume Next
      Cells(r, 1).Comment.Delete
      On Error GoTo Err
      Cells(r, 1).AddComment.Text (Range("P4").Text)
      Cells(r, 1) = Range("P20")
      Exit For
      End If
      If r = 2000 Then
      MsgBox ("Kaikki rivit täynnä!" & Chr(13) & "Edellinen arvo oli:" & Chr(13) & Edellinen)
      End If
      Next r
      End If

      Err:
      e = Err.Description
      Application.EnableEvents = True

      End Sub

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

    Luetuimmat keskustelut

    1. Hetken jo luulin, että en ikävöi sinua koko aikaa

      Mutta nyt on sitten taas ihan hirveä ikävä jotenkin. Tiedätköhän sinä edes, kuinka peruuttamattomasti minä olen sinuun r
      Ikävä
      35
      7051
    2. JOKO OLETTE KUULLET, MITÄ KIURUVEDELLÄ ON SATTUNUT!

      Oletteko jo kuulleet, mitä Kiuruvedellä on sattunut, voi hyvänen aika? Aivan viime tuntien aikana olisi sattunut, jos t
      Kiuruvesi
      26
      6209
    3. Nolointa ikinä miehelle

      On ghostata nainen jonka kanssa on ollut ystävä tai ollu orastavaa tapailua pidemmän aikaa. Osoittaa sellaista moukkamai
      Ikävä
      100
      3245
    4. Outoa että Trump ekana sanoutui irti ilmastosopimuksesta

      kun Kaliforniaa riepottelee siitä johtuvat tuhoisat maastopalot. Hirmumyrskytkin ovat USA:ssa olleet tuhoisia.
      Maailman menoa
      556
      2958
    5. V*ttuu että mä haluan sua

      Jos jotain ihmistä voi kunnolla haluta, niin hän on se. Voi Luoja auta jo! Joku jeesus hjelppa mej!
      Ikävä
      60
      2887
    6. Mikä sinua eniten

      Huolestuttaa tässä tilanteessa?
      Ikävä
      58
      2433
    7. Eli jos toisen hiki haisee ns. omaan nenään siedettävältä

      Se kertoo hyvästä yhteensopivuudesta. Selvä! Olet mies minun. 🫵🥳
      Ikävä
      34
      2256
    8. Katsoitko mua yhtään

      Kun nähtiin 🥺.
      Ikävä
      33
      2114
    9. Sattuma ja muutama väärinkäsitys

      vaikuttivat siihen millaiseksi tämä kaikki muodostui. Pienet aikanaan huomaamattomat käänteet. Seuraava näytös on jo tul
      Ikävä
      32
      1893
    10. Ei ois kyllä kivaa

      Jos miestä ei kiinnostais ollenkaan minun seura. Aina huitelis ties missä tai olis omassa seurassaan. Kaikki muu ois kiv
      Ikävä
      7
      1451
    Aihe