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.
Tiedon siirtoa solusta kommenttikenttään
24
210
Vastaukset
- 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.- Tämmöinen
kunde kirjoitti:
just niinhän koodi tekee ;-)
Keep EXCELing
@KundeMiksi 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.
- 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
Kuvat! Dannyyn liitetty Helmi Loukasmäki, 22, on puhjennut naisena kukkaan - Some sekoaa: "Sä..."
Ooo, kaunis aikuinen nainen Helmistä on kasvanut siinä yli 80-vuotiaan Dannyn rinnalla! Katso uudet kuvat: https://ww685623- 613764
Suodatinpussin kastelemalla saa parempaa kahvia
Kokeilin niksiä ja kyllä tämä kahvi on parempaa nyt. Ei lainkaan maistu paperiselta. Huljuttelee hanan alla suppiloa pap1532755Tidätkö nainen
että suoraan sanottuna v.tut.aa että pääsit näin lähelle minua. Ei olisi oikeasti aikaa tähän mutta silti aina välillä o1052196Mikä on kaivattusi etunimi?
Otsikossa siis on kysymys eriteltynä. Vain oikeat vastaukset hyväksytään.1092045Oho! Arja Koriseva paljastaa TTK:n ekasta suorasta lähetyksestä: "On vähän ärsyttävä yhtälö!"
Upea Arja Koriseva! Tsemppiä haasteelliseen tilanteeseen! Lue lisää: https://www.suomi24.fi/viihde/oho-arja-koriseva-211329Onkohan sinulla kaikki hyvin?
Nyt vähän sellainen outo tunne tuli. Sinun asiasi niin ei minulle toki tarvitse kertoa. Kunhan mietin...381297En kestä katsoa
Sitä miten sinusta on muut kiinnostuneita. Olen kateellinen. Siksi pitäisi lähteä pois961278Huikeeta, mahtavaa, ihan mielettömän upeeta
Me ostettiin talo Espanjasta. Tosin saadaan käyttää sitä vain muutama viikko vuodessa kun on monta muutakin ostajaa! M1951232- 1731146