Avatar billede lineriber Praktikant
19. april 2013 - 10:21 Der er 25 kommentarer og
1 løsning

VBA: kopier linier ud fra kriterie og indsæt i samme linie i anden fil

Hej Eksperter

Jeg arbejder i Excel 2010 engelsk version.

Jeg har en fil (Fil1) som indeholder en liste med projektnumre i kolonne A, angivelse af aktiv/lukket i kolonne B og et forecast pr. måned i kolonne L til W (ialt 1000 rækker).

I en anden fil (fil2) har jeg den samme opstilling som i Fil1, hvor forecastet pr. måned er fundeet vha formler der linker til en stor datatabel.

Jeg vil gerne lave en VBA kode der skal køres fra Fil1:
1) Kopierer celle A1:A1000 fra Fil1 og indsætter dem i celle A1:A1000 i Fil2
2) I Fil2 skal data fra cellerne i kolonnen L:W kopieres, på alle de projekter der har en markering (et X) i kolonne B (angivelse af at projektet er aktivt)
3) Indsæt de kopierede celler SOM VÆRDIER i Fil1 i de samme rækkenumre som de blev kopieret fra.

Der må IKKE laves om på rækkefølgen af projekterne i kolonne A i Fil1!

Er er nogen der kan hjælpe med det??
Venligst skriv forklaring til hvad der sker i de forskellige linier i VBA'en så jeg har en chance for at forstå hvad der sker i koden.

Mvh
Line
19. april 2013 - 12:14 #1
Et skud fra hoften....

Dim wkb1 as workbook
Dim wkb2 as workbook

set wkb1 = workbooks.Open("skriv fil1 sti + navn")
set wkb2 = workbooks.open("skriv fil2 sti + navn")

'1)
range(wkb1.worksheets(1).range("A1"), wkb1.worksheets(1).range("A1").end(xldown)).copy destination:= wkb2.worksheets(1).range("A1")

'2) og 3)
Dim c as range
for each c in range(wkb2.worksheets(1).range("A1"), wkb2.worksheets(1).range("A1").end(xldown)).cells
  if lcase(c.offset(0,1).value) = "x" then
    range(c.offset(0,11), c.offset(0,22)).copy
    wkb1.worksheets(1).range("L1").offset(c.row -1,0).pastespecial xlvalues
  end if
next
24. april 2013 - 09:20 #2
Kunne du bruge det?
Avatar billede lineriber Praktikant
24. april 2013 - 09:27 #3
Jeg er lige ved at se om jeg kan finde ud af at få det testet.....
Men kan man indarbejde følgende:

A) wkb1 skal være den aktive fil, dvs. den fil jeg kører koden fra. Jeg ønsker dermed ikke at skulle angive filnavn og sti.

B) wkb2 skal vælges via en dialogboks ("Application.FileDialog(msoFileDialogOpen)") istedet for at angive filnavn og sti i selve koden.
24. april 2013 - 09:32 #4
Ja, det kan man godt

set wkb1 = activeworkbook
set wkb2 = Application.FileDialog(msoFileDialogOpen)
Avatar billede lineriber Praktikant
24. april 2013 - 09:48 #5
Kan du ikke lige forklarer hvad det er der sker i hver af de her linier. Jeg har nemlig brug for at kunne rette dem lidt til efter at mine ark har ændret sig lidt.

if lcase(c.offset(0,1).value) = "x" then
    range(c.offset(0,11), c.offset(0,22)).copy
    wkb1.worksheets(1).range("L1").offset(c.row -1,0).pastespecial xlvalues
  end if
24. april 2013 - 09:52 #6
.Copy linjen kopierer

.pastespecial sætter ind

.offset fanger der område du vil have kopieret
Avatar billede lineriber Praktikant
24. april 2013 - 09:55 #7
Jeg får en "Run-time error '13' Type mismatch" ¨på følgende linie:

set wkb2 = Application.FileDialog(msoFileDialogOpen)
24. april 2013 - 10:04 #8
Så må du dele i to

Application.FileDialog(msoFileDialogOpen)
set wkb2 = activeworkbook
Avatar billede lineriber Praktikant
24. april 2013 - 10:44 #9
Application.FileDialog(msoFileDialogOpen) fejler generelt!

"Compile error: Invalid user of property"


Hvis jeg søger i Excel hjælpen på "Application.FileDialog" så står der:

- msoFileDialogOpen. Allows user to open a file.
- msoFileDialogFilePicker. Allows user to select a file.

Eksemplet er som følger

Sub UseFileDialogOpen()

    Dim lngCount As Long

    ' Open the file dialog
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show

        ' Display paths of each file selected
        For lngCount = 1 To .SelectedItems.Count
            MsgBox .SelectedItems(lngCount)
        Next lngCount

    End With

End Sub

Bliver jeg nød til at skrive det på en anden måde for at det virker i Excel 2010 ???
Avatar billede lineriber Praktikant
24. april 2013 - 10:46 #10
vedr. #6: jeg mente det med "offset". Hvad betyder det, og hvad betyder tallene i parentesen?
24. april 2013 - 10:48 #11
Jeg ville nok gøre sådan her

FileToOpen = Application.GetOpenFilename _
(Title:="Please choose a file to import", _
FileFilter:="Excel Files *.xlsx (*.xlsx),")
''
If FileToOpen = False Then
MsgBox "No file specified.", vbExclamation, "Duh!!!"
Exit Sub
Else
set wkb2 = Workbooks.Open Filename:=FileToOpen
End If
24. april 2013 - 10:52 #12
det første tal er række offset det andet er kolonne offset
Avatar billede lineriber Praktikant
24. april 2013 - 10:59 #13
Jeg prøver at køre den i breakmode og med det samme jeg prøver at sætte den igang med F8, så går den ned og fejler:"Compile error: Syntax error" på linien:
"Set wkb2 = Workbooks.Open Filename:=FileToOpen"
24. april 2013 - 11:01 #14
Set wkb2 = Workbooks.Open(Filename:=FileToOpen)
Avatar billede lineriber Praktikant
24. april 2013 - 11:17 #15
Ok, super så virkede det.

Næste spørgsmål/problem:

'1)
range(wkb1.worksheets(1).range("A1"), wkb1.worksheets(1).range("A1").end(xldown)).copy destination:= wkb2.worksheets(1).range("A1")

Hvad skal mine sheets hedde? 1? jeg syntes ikke der sker noget når jeg kører dette trin i breakmode....
24. april 2013 - 11:24 #16
worksheets(1) tager den første arkfane
Avatar billede lineriber Praktikant
24. april 2013 - 11:26 #17
Og hvis jeg istedet skal angive at sheet'et fx hedder "FOREXTMONDKK", hvordan skriver jeg det så?
24. april 2013 - 11:36 #18
worksheets("FOREXTMONDKK")
Avatar billede lineriber Praktikant
25. april 2013 - 13:46 #19
Hej igen Thor

Jeg har lige brug for en sidste hjælp:

Hvad betyder denne linie:
wkb1.worksheets(1).range("L1").offset(c.row -1,0).pastespecial xlvalues


Jeg syntes nemlig ikke at jeg får indsat mine copierede celler i de korrekte linier.....
Området med tal som jeg kopierer i wkb2 starter i celle L1, så derfor skal området som dataene indsættes is i wkb1 vel også starte med L1. Men hvad betyder .offset(c.row -1,0) så?
Avatar billede lineriber Praktikant
25. april 2013 - 13:49 #20
Det ser ud som om at det jeg har kopieret i wkb2 fra række 6 bliver indsat i wkb1 i række 11 osv.
25. april 2013 - 15:14 #21
Koden looper over linjerne i wkb2 og hvis der er x bliver L... kopieret og sat ind i samme række i wkb1.
offset sørger for at komme ned i samme række som informationerne kommer fra.
Avatar billede lineriber Praktikant
25. april 2013 - 15:55 #22
hmmm, jeg forstår ikke hvad det er der går galt......
Kan du gennemskue hvad det er der sker ifht det jeg skriver i #20?
Jeg har ændret noget på de celler der henvises til og det offset der laves, så koden nu ser således ud:


Sub test()

Dim wkb1 As Workbook
Dim wkb2 As Workbook

Set wkb1 = ActiveWorkbook  ' RDPortfolio filen

FileToOpen = Application.GetOpenFilename _
(Title:="Please choose an excel file to import data from", _
FileFilter:="Excel Files *.xls* (*.xls*),")
''
If FileToOpen = False Then
MsgBox "No file specified.", vbExclamation, "Duh!!!"
Exit Sub
Else
Set wkb2 = Workbooks.Open(Filename:=FileToOpen) ' Consolidation filen
End If

'1)
Range(wkb1.Worksheets("Portfolio file").Range("B6"), wkb1.Worksheets("Portfolio file").Range("B6").End(xlDown)).Copy Destination:=wkb2.Worksheets("Consolidation").Range("B6")

'2) og 3)
Dim c As Range
For Each c In Range(wkb2.Worksheets("Consolidation").Range("B6"), wkb2.Worksheets("Consolidation").Range("B6").End(xlDown)).Cells
  If LCase(c.Offset(0, -1).Value) = "x" Then
    Range(c.Offset(0, 1), c.Offset(0, 12)).Copy
    wkb1.Worksheets("Portfolio file").Range("C6").Offset(c.Row - 1, 0).PasteSpecial xlValues
  End If
Next

End Sub


Så spørgsmålet er om jeg har ændret noget forkert i den sidste linie i koden???
25. april 2013 - 16:03 #23
ja

wkb1.Worksheets("Portfolio file").Range("C6").Offset(c.Row - 1, 0).PasteSpecial xlValues

skal være

wkb1.Worksheets("Portfolio file").Range("C1").Offset(c.Row - 1, 0).PasteSpecial xlValues
01. maj 2013 - 10:13 #24
Skal vi lukke?
Avatar billede lineriber Praktikant
01. maj 2013 - 10:43 #25
Hej Thor

Undskyld ventetiden, jeg er lige blevet hængt op af et budget!
Jeg har ikke nået at teste din rettelse i #23, så vil gerne lige holde den åben.
.....jeg forstår dog ikke hvorfor det skal være C1 istedet for C6.....?
Avatar billede lineriber Praktikant
14. maj 2013 - 14:27 #26
Hej Thor

Så fik jeg endelig testet færdig.
Det med offset har jeg ikke arbejdet med før, så det gav mig nogle udfordringer ifht at få rettet koden til så den passede i min originale fil som var noget anderledes end det eksempel jeg havde opstillet i dette spørgsmål.
Men det lykkedes :-)

Mange tak for hjælpen.
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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