Just nu i M3-nätverket
Jump to content

Klistra in rader efter varandra


Rattaxes

Recommended Posts

Hej har ett litet problem som jag hoppas att någon kan hjälpa mig med.

 

Vill skapa en lista genom att klistra in olika fält med macroknappar.

När jag har klistrat in en rad vill jag att nästa rad ska klistras in efter den förra osv.

 

Det är inte alltid jag vet vilken knapp (rad) jag vill börja med så jag vill också att oavsett vilken knapp jag börjar med så ska första raden klistras in på samma ställe.

 

Någon som har någon aning om hur man kan få till detta?

 

Tack på förhand

 

/Mikael

 

Link to comment
Share on other sites

Hur har du datat på bladet uppställt?

 

Ex.v går det att leta reda på sista raden i en kolumn det finns data vilket skulle kunna ge dig en ledtråd om var du ska skriva dina data.

 

Eller har du en startcell i en tabell kan man även utifrån denna ta reda på sista raden med data.

 

Ex.v men anropet

Set myRn = Range("A6").End(xlDown)

 

ger att myRn pekar på sista raden nedan A6 med data OM A6 innehåller data. Om A6 är tom blir det istället första ifyllda cellen i A-kolumnen nedanför A6.

 

Om du markerar en cell på bladet och trycker CTRL+ pil (ned) är det samma sak om End(xlDown). Testa och se.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Varje knapp har en fält som är 15 celler brett och en cell högt. Den första knapp som trycks in skall hämta sitt fält och klistra in det i ruta D18. Nästa knapp som trycks in ska då klistra in sitt fält (15x1) i raden under med början på D19 osv. Det som behöver vara fast är just det att det ska börja i D18 oavsett vilken knapp jag trycket på först.

 

Link to comment
Share on other sites

Finns många sätt...

 

Är D18 tom innan något skrivs dit eller ska värdet som finns där skrivas över?

 

Asch, en metod är att skapa en funktion som returnerar var du ska stoppa in dina data, det är nog snyggast och enklast, två exempel:

 

[color="#0000ff"]Function[/color] GetTarget() As Range
    [color="#0000ff"]Set[/color] GetTarget = Worksheets([GRÅ]"Blad1"[/GRÅ]).Range([GRÅ]"D18"[/GRÅ])
    [color="#0000ff"]If[/color] GetTarget <> [GRÅ]""[/GRÅ] [color="#0000ff"]Then[/color]
        [color="#0000ff"]If[/color] GetTarget.Offset(1, 0) = [GRÅ]""[/GRÅ] [color="#0000ff"]Then[/color]
            [color="#0000ff"]Set[/color] GetTarget = GetTarget.Offset(1, 0)
        [color="#0000ff"]Else[/color]
            [color="#0000ff"]Set[/color] GetTarget = GetTarget.[color="#0000ff"]End[/color](xlDown).Offset(1, 0)
        [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]

[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

[color="#0000ff"]Function[/color] GetTarget2() As Range
    Static rwIndex As Integer
    [color="#0000ff"]If[/color] rwIndex = 0 [color="#0000ff"]Then[/color]
        rwIndex = 18
    [color="#0000ff"]Else[/color]
        rwIndex = rwIndex + 1
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
    [color="#0000ff"]Set[/color] GetTarget2 = Worksheets([GRÅ]"Blad1"[/GRÅ]).Cells(rwIndex, 4)
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

[color="#0000ff"]Sub[/color] test()
    [color="#0000ff"]Dim[/color] myRn As Range
    [color="#0000ff"]Set[/color] myRn = GetTarget
    [color="#0000ff"]MsgBox[/color] myRn.Address
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

GetTarget ger en referens till G18 eller första tomma cellen under G18

 

GetTarget2 stegar en rad nedåt vid varje anrop. Första anropet ger en referens till G18, andra till G19 osv. Dock är denna "dum". Om VBA-projektet avbryts förloras värdet i den statiska variabeln. Likaså har den ingen koll på något skrivits till referensen den givits. Inte helt bra med andra ord men ett exempel på hur man kan göra.

 

Test() kan du köra några gånger för att se hur funktionerna fungerar.

 

Själva kopieringen har du väl koll på?

annars:

 [color="#0000ff"]Dim[/color] rnTarget As Range
    [color="#0000ff"]Set[/color] rnTarget = GetTarget
    Range(rnTarget, rnTarget.Offset(0, 15)).Value = Range([GRÅ]"A1:O1"[/GRÅ]).Value

är effektivast om det enbart är värdena du vill kopiera.

 

 

/T

.

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2007-01-04 10:50:05 av Monshi]

Link to comment
Share on other sites

Är inte helt säker på att jag fattar eller om jag lyckades förklara vad jag menar tillreckligt bra.

 

Säg att jag vill med hjälp av 10 olika knappar vill kunna klistra in 10 olika sorters rader med olika formler i varje.

 

Hur kopplar jag de olika raderna till respektive knapp?

 

 

Skickar med ett förenklat exempel

 

Om man klickar på knapp F,G,H eller I ska raden som står till höger om FGHI i tabellen klistras in i D8.

nästa ska klistras in i D9 osv...

 

[bild bifogad 2007-01-05 11:12:54 av Rattaxes]

904240_thumb.jpg

Link to comment
Share on other sites

Är jag inte på rätt spår:

 

Knappen du trycker på vet vilken rad den ska kopiera, det den behöver är ett mål. Med hjälp av funktionen jag givit ovan kan man väl skriva ex.v.

 

[color="#0000ff"]Sub[/color] CopyValues(srcRn As Range, trRn As Range, noCells As Integer)

    Range(trRn, trRn.Offset(0, noCells)).Value = Range(srcRn, srcRn.Offset(0, noCells)).Value

[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

[color="#0000ff"]Sub[/color] CopyAll(srcRn As Range, trRn As Range, noCells As Integer)
    Range(srcRn, srcRn.Offset(0, noCells)).Copy

    trRn.PasteSpecial xlPasteAll
    [b]Application[/b].CutCopyMode = [color="#0000ff"]False[/color]


[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]


[color="#0000ff"]Sub[/color] MyButton()
    [color="#0000ff"]Dim[/color] trRn As Range, srcRn As Range
    [color="#0000ff"]Dim[/color] noCells As Integer
    noCells = 5
    [color="#0000ff"]Set[/color] srcRn = Range([GRÅ]"k4"[/GRÅ])
    [color="#0000ff"]Set[/color] trRn = GetTarget
    [color="#0000ff"]Call[/color] CopyValues(srcRn, trRn, noCells)
[color="#006400"]'    Call CopyAll(srcRn, trRn, noCells)[/color]

[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

Där CopyValues fungerar som tidigare nämnt och CopyAll använder normala kopieringsfunktionen.

 

OBS!

Detta ovan är testat med koden på ett blad och därmed inge problem med referenser. Om koden delvis flyttas ut i moduler behövs en starkare referens till bladet.

 

Hänger du med i vad jag försöker göra? Är jag rätt ute?

 

Och du ska göra allt i VBA-kod? Inte ha formler på bladet som hämtar de värden du vill ha och kanske bara kod som skriver in ett index på vilken rad som ska hämtas? Exempelvis.

 

Edit: Aktivering av kod-taggar

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2007-01-05 11:31:54 av Monshi]

Link to comment
Share on other sites

God Morgon

 

jag får det inte att fungera på hos mig.

 

har gjort ett exempel med några knappar, men hela tiden så blir det fel när jag ska köra det. OM du vill göra min dag kanske du har lust att skicka över arket du hade gjort och testat på så får jag se. Känns som om jag har glömt något på mitt eller att jag helt enkel inte fattar. För om jag för in den koden som du har skrivit i forumet och dessutom försöker koppla en knapp till det så blir det fel så fort jag trycker på knappen. Det enda som händer förutom att det kommer upp ett felmeddelande är att de rutor där det ska klistras in värden och formler blir markerade, men inget kommer in där..

 

 

Hjälp....

 

Dessutom så behöver jag en "hårdare" refenrens, då jag vill att mer än bara värdena följer med. har formler i några av dem.

[inlägget ändrat 2007-01-12 10:23:39 av Rattaxes]

Link to comment
Share on other sites

Ok, sänder det till dig.

 

Alla funktioner ovan samt en ny finns med i boken. Den nya skapar länkar till cellerna istället.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Hallå...

 

Tack så hemskt mycket för hjälpen, nu fungerar det.

 

hur gör jag nu då om jag vill med hjälp av en knapp ta bort den senast inlagda raden. Låt oss säga att man har tryckt på fel knapp i första läget..

 

att ta bort alla rader är inte så svårt, men just den SENAST tillagda

 

 

/Tack på förhand

 

Link to comment
Share on other sites

Undo och VBA är en egen historia men att ångra en enstaka kan vi nog lösa enkelt.

 

Senaste inlagda raden är väl även den som ligger sist?

Då är det enkelt:

1: Använd GetTarget(). Då får då nästa rad där inkopiering ska ske

2: Kontrollera så att det ej är den första raden, då finns inget att radera.

3: Stega upp en rad och ta bort.

 

ex.

Sub DelLastRow()
  Dim myRn as Range
  Set myRn = GetTarget
  If myRn.Adress = Worksheets("Blad1").Range("D8") Then Exit Sub

  Range(myRn.Offset(-1,0), myRn.Offset(-1,15))= ""
End Sub

 

eller något liknande. Tror du förstår tanken. ( ej testat koden, frihand)

 

Ett annat sätt är att ha en gobal variabel där du sparar senast skrivna rad.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

  • 3 weeks later...

Har nu stött på ett nytt problem.

 

För varje rad jag klistrar in så ska 3 celler till vänster om raden få ett värde.

Om jag tex börjar klistra in min rad på A7 så får A4,A5,A6 ett värde.

Men de syns bara om jag klistrat in en rad.

Vad som står i de nya cellerna är förutbästämt och beror inte på vad man klistrar in.

 

Problemet är att jag vill ha och har rutnät runt cellerna i den rad jag klistrar in och vill därför ha sammarutnär runt de tre cellerna till vänster, men bara när de har ett värde.

 

 

Kan man lösa detta?

 

Tack på förhand

Micke

 

Link to comment
Share on other sites

För varje rad jag klistrar in så ska 3 celler till vänster om raden få ett värde.

Om jag tex börjar klistra in min rad på A7 så får A4,A5,A6 ett värde.

Men de syns bara om jag klistrat in en rad.

Vad som står i de nya cellerna är förutbästämt och beror inte på vad man klistrar in.

Dvs det står redan där eller ska det skrivas dit när du kopierar? (vad är det du gör egentligen?)

 

Om det redan ska stå där:

=OM(A7="";"";"Mitt värde")

i cell A4 exempelvis.

Om du ska skriva in det när du kopierar kan du ex.v. använda funktionen Offset (för du har väl en referens till cellen där du kopierar in).

 

Ett exempel

Set myRn = Range("A7")
myRn.Offset(-3,0) = "Mitt värde"

 

Problemet är att jag vill ha och har rutnät runt cellerna i den rad jag klistrar in och vill därför ha sammarutnär runt de tre cellerna till vänster, men bara när de har ett värde.

Jamen - kopiera formatet då...Eller kör med lite villkorsstyrd formatering. Ta en titt i menyn Format för det senare eller funktionen PasteSpecial för det förstnämnda.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...