Just nu i M3-nätverket
Jump to content

Makro: paste special kolumn


Sibir
 Share

Recommended Posts

Hej,

jag är ny på just VBA och försöker hanka mig fram och göra det jag vill men har fastnat helt och hoppas på lite hjälp.

Ofta har jag följande scenario:

column oktobers cellvärden : Copy -> Paste special:Formulas till column November

column Oktober cellvärden Copy -> paste special: Values

Det vill säga Oktober skall få döda värden och November formler.

 

Jag försöker skapa ett makro som för varje klick gör detta för ytterligare en kolumn i taget. Tänker att om jag har rätt funktion borde den väl rimligtvis innehålla +1 för att göra just detta.

Mitt makro skall:

Ändra färg på månadscellen

Copy special:formulas till nästa kolumn

copy special:values i aktuell kolumn

 

klar.

 

Kan inte bidra med någon kod av värde,

Färg har jag lyckats med samt en variant där makrot uppdaterade samtliga återstod av kolumner i tabellen med formler vilket blir fel då den skriver över prognos.

 

tacksam för input/tips :)

Link to comment
Share on other sites

En variant som utgå från aktuell markeringen och helt enkelt sätter målet = "förskjut ett steg åt höger" (Offset(0,1))

Avluta med att göra målkolumnen till selected. Nästa gång du trycker på knappen startar den därifrån

Private Sub CommandButton1_Click()
Dim Källa As Range
Dim Mål As Range

    Set Källa = Selection
    Set Mål = Selection.Offset(0, 1)
    With ActiveSheet
        Källa.Copy
        Mål.PasteSpecial xlPasteAll
        Källa.PasteSpecial xlPasteValues
    End With
    Källa.Interior.Color = 255
    Mål.Interior.Color = 65535
    Mål.Select
End Sub

Fördelen med ovanstående metod är att du inte behöver komma ihåg hur många varv du gått mellan. 

Nackdelen är uppenbar. Du får inte göra något mellan knapptryckningarna. Om du ändrar vilken cell som är vald går det åt skogen.

 

En bättre? variant är kanske att hitta senast ifyllda kolumn och utgå därifrån

Link to comment
Share on other sites

Hej, 
Jag hade kommit såhär långt idag innan jag såg att du skrivit, la till ett försök att välja kolumn som du föreslog, men problemet borde bli att kolumn blir markerad så förstår vad du menar. Det ska helt enkelt vara möjligt att göra vad man nu vill mellan knapptrycken och sedan uppdatera så att nästa månadskolumn ersätter tidigare prognosvärden med formeln. ;

Här är koden, dock så får jag runtime error "13" type mismatch.

 

Sub Macro7()
'
' Macro update column
'
    With worksheets(sheet6)
    .Range("AD6:AD7").offset(0,1).copy
    .Range("AE6:AE7").offset(0,1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    .Range("AD6").offset(0,1).copy
    .Range("AE6").offset(0,1).Paste
    .Range("AD12:AD31").offset(0,1).Copy
    .Range("AE12").offset(0,1).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    .Range("AD12[1]").offset(0,1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    .Range("AE12:AE31").offset(0,1).select
    end with
End Sub

Link to comment
Share on other sites

sheet6 är lite förvirrande. Jag tycker att det är enklare att skriva in namnet du gett bladet med citat-tecken "sheet6". Eller "MinBok" i mitt exempel.

Det kan i alla fall ge en massa fel

 

Här är en variant när man söker efter den sist ifyllda cellen på rad12 och expanderar den 20 rader ner. Och det utgår man ifrån

Sub Macro8()
Dim MittOmråde As Range
    With Worksheets("MinBok")
        Set MittOmråde = .Range("A12")
        Set MittOmråde = MittOmråde.EntireRow.Find(What:="*", After:=MittOmråde, SearchDirection:=xlPrevious)
        Set MittOmråde = MittOmråde.Resize(20, 1)
        MittOmråde.Copy
        MittOmråde.Offset(0, 1).PasteSpecial xlPasteAll
        MittOmråde.PasteSpecial xlPasteValues
    End With
End Sub


 

Kanske med en lite kontroll av valt område

Sub Macro9()
Dim MittOmråde As Range
Dim svar As Integer
    With Worksheets("MinBok")
        Set MittOmråde = .Range("A12")
        Set MittOmråde = MittOmråde.EntireRow.Find(What:="*", After:=MittOmråde, SearchDirection:=xlPrevious)
        Set MittOmråde = MittOmråde.Resize(20, 1)
        MittOmråde.Select
            svar = MsgBox("är det valda området rätt?", vbYesNo)
            If svar = vbNo Then Exit Sub
        MittOmråde.Copy
        MittOmråde.Offset(0, 1).PasteSpecial xlPasteAll
        MittOmråde.PasteSpecial xlPasteValues
    End With
End Sub

 

 

 

Delar

'Startpunkten för att hitta sista ifyllda cellen i Rad12

    Set MittOmråde = .Range("A12")

' och ett Sök-efter trix för att hitta sista cellen i rad 12

    Set MittOmråde = MittOmråde.EntireRow.Find(What:="*", After:=MittOmråde, SearchDirection:=xlPrevious)

' sen förstorar man området så att det innehåller 20 rader (12-31)
    Set MittOmråde = MittOmråde.Resize(20, 1)

Link to comment
Share on other sites

Tack för förtydligandet.

Det ser snyggt ut och funkar nu, bra med en kontroll, dock kvarstår problemet att uppdatera nästa kolumn. Men tror jag kommit fram till att den inte måste veta att den ska hantera nästa kolumn utan jag kör en IF-sats på tabellens range och när den stöter på kolumn med formel exekverar den. Logiskt egentligen eftersom jag bara alltid har en kolumn med formler. 

 

Tack för att du tog dig tid att hjälpa mig vidare ?

Edited by Sibir
Uppdatering
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share



×
×
  • Create New...