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

218

    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. Olen tosi outo....

      Päättelen palstajuttujen perusteella mitä mieltä minun kaipauksen kohde minusta on. Joskus kuvittelen tänne selkeitä tap
      Ikävä
      16
      2128
    2. Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornosta

      https://www.kymensanomat.fi/paikalliset/8081054 Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornon hallussapi
      Kotka
      84
      2068
    3. Oletko sä luovuttanut

      Mun suhteeni
      Ikävä
      101
      1377
    4. Vanhalle ukon rähjälle

      Satutit mua niin paljon kun erottiin. Oletko todella niin itsekäs että kuvittelet että huolisin sut kaiken tapahtuneen
      Ikävä
      10
      1176
    5. Hommaatko kinkkua jouluksi?

      Itse tein pakastimeen n. 3Kg:n murekkeen sienillä ja juustokuorrutuksella. Voihan se olla, että jonkun pienen, valmiin k
      Sinkut
      145
      1170
    6. Maisa on SALAKUVATTU huumepoliisinsa kanssa!

      https://www.seiska.fi/vain-seiskassa/ensimmainen-yhteiskuva-maisa-torpan-ja-poliisikullan-lahiorakkaus-roihuaa/1525663
      Kotimaiset julkkisjuorut
      81
      1143
    7. Aatteleppa ite!

      Jos ei oltaisikaan nyt NATOssa, olisimme puolueettomana sivustakatsojia ja elelisimme tyytyväisenä rauhassa maassamme.
      Maailman menoa
      249
      886
    8. Omalääkäri hallituksen utopia?

      Suurissa kaupungeissa ja etelässä moinen onnistunee. Suuressa osassa Suomea on taas paljon keikkalääkäreitä. Mitenkäs ha
      Maailman menoa
      172
      858
    9. Mitä sanoisit

      Ihastukselle, jos näkisitte?
      Tunteet
      63
      834
    10. Onko se ikä

      Alkanut haitata?
      Ikävä
      59
      811
    Aihe