Avatar billede kim1a Ekspert
07. marts 2017 - 15:57 Der er 10 kommentarer og
1 løsning

VBA kopiere uden formler

Jeg arbejder med et stort datasæt som måned for måned blot vokser.

Jeg vil gerne lave en VBA som tager de formler der står i T2:AC2 og kopierer dem ned. Jeg har ikke brug for formlerne efterfølgende andet end i den øverste række stadig.

Jeg kan godt kopiere formlerne, indsætte dem og efterfølgende kopiere værdierne og indsætte dem fladt. Lige nu lyder det sådan:

Dim intSidsteRække As Integer
intSidsteRække = Range("A1", Range("A1").End(xlDown)).Rows.Count - 2
Range("t2:ac2").Select
Selection.Copy
Selection.AutoFill Destination:=Range(Selection,Selection.Offset(intSidsteRække))

Jeg tænker dog der må være en bedre måde, der også gør makroen hurtigere. Jeg tænker det kræver at VBA laver udregningen og indsætter værdien, fremfor at indsætte formlen - kan nogen vise mig hvordan?

Formlerne er som følger (men det er nok med et par eksempler, så kan jeg nemt rette til i de andre:
=LEFT(C2;1)
=VLOOKUP(VALUE(N2);'Opslag ny'!$A:$B;2;0)
=IFERROR(VLOOKUP(VALUE(L2);'Opslag ny'!$E:$F;2;0);"-")
=VLOOKUP(U2;OPslag!$C$2:$E$180;3;0)
=VLOOKUP(V2;OPslag!$K$2:$M$29;3;0)
=IF(K2="SERVICE";IFERROR(VLOOKUP(W2;OPslag!$O$3:$S$39;5;0);"Øvrige Service");K2)
=VLOOKUP($Y2;OPslag!$G$3:$H$13;2;0)
=VLOOKUP(W2;OPslag!$C$2:$D$105;2;0)
=VLOOKUP(X2;OPslag!$K$2:$L$24;2;0)
=IFERROR(VLOOKUP($H2;'Opslag ny'!$I$2:$J$45;2;0);$H2)
Avatar billede excelent Ekspert
07. marts 2017 - 23:11 #1
Prøv :

Sub test1()

Application.Calculation = xlCalculationManual

Dim intSidsteRække As Integer
intSidsteRække = Range("A1", Range("A1").End(xlDown)).Rows.Count - 2
Range("t2:ac2").Select
Selection.Copy
Selection.AutoFill Destination:=Range(Selection, Selection.Offset(intSidsteRække))


With Range("T2:AC" & intSidsteRække)
.Value = .Value
End With

Application.Calculation = xlCalculationAutomatic

End Sub
Avatar billede excelent Ekspert
07. marts 2017 - 23:12 #2
With Range("T2:AC" & intSidsteRække)

skulle være

With Range("T3:AC" & intSidsteRække)
Avatar billede kim1a Ekspert
08. marts 2017 - 07:57 #3
Men så laver du jo netop først formlerne, og derefter skaber det som værdi? Det gør ikke makroen hurtigere desværre. Jeg tænker stadig at den kan lave beregningerne i makroen og pga ingen mulighed for at fortryde er den hurtigere.
Avatar billede Jan Hansen Ekspert
08. marts 2017 - 08:54 #4
hej

tror du skal lave noget i retningen af

Dim intSidsteRaekke As Integer
Dim Raekker As Integer
Sub test()
intSidsteRaekke = Range("A1", Range("A1").End(xlDown)).Rows.Count
For Raekker = 2 To intSidsteRaekke
    Cells(Raekker, 4) = Left(Cells(Raekker, 3).Value, 1)
    Cells(Raekker, 5) = Application.WorksheetFunction.VLookup((Range("N2").Value), Range("Opslag ny!$A:$B"), 2, 0)
Next Raekker

mvh Jan
Avatar billede kim1a Ekspert
09. marts 2017 - 22:54 #5
jeg tror bestemt det er løsningen, men får ikke lige testet i de næste par uger.
Avatar billede kim1a Ekspert
22. marts 2017 - 09:37 #6
Den første "formel" virkede fint. Men nummer to med vlookup giver mig lidt udfordringer.

Den skal naturligvis også skifte linje løbende så jeg lavede den til (her uden variabel for at teste den virker):
Cells(3, 21) = Application.WorksheetFunction.VLookup((Cells(3, 14).Value), Range("Opslag ny!$A:$B"), 2, 0)

Jeg tænker at det måske er noget med måden range er skrevet på?
Avatar billede kim1a Ekspert
22. marts 2017 - 09:41 #7
Jeg forsøgte dette:
Cells(3, 21) = Application.WorksheetFunction.VLookup((Cells(3, 14).Value), Worksheets("Opslag ny").Range("$A:$B"), 2, 0)

Det virker dog heller ikke.
Avatar billede kim1a Ekspert
24. maj 2017 - 15:55 #8
Spørgsmålet lukkes med uforrettet sag.
Avatar billede Jan Hansen Ekspert
24. maj 2017 - 16:23 #9
sorry men laver du ikke henvisning til samme celle som du vil sætte ind i?
Avatar billede Jan Hansen Ekspert
24. maj 2017 - 16:24 #10
beklager så forkert
Avatar billede Jan Hansen Ekspert
24. maj 2017 - 16:39 #11

Option Explicit

Sub Test1()
    Cells(6, 5).Formula = "=VLOOKUP(VALUE(N2),'Ark1'!$A:$B,2,0)"
End Sub
Sub Test2()
Cells(5, 5) = Application.WorksheetFunction.VLookup((Range("N2").Value), Range("Ark1!$A:$B"), 2, 0)
End Sub

funger hos mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester