Avatar billede h_s Forsker
06. juli 2004 - 14:22 Der er 9 kommentarer og
1 løsning

Makro til overførsel af celler til andet ark

Jeg har brug for en makro der kopier A1:BF13 med de formater der er i regnearket fra et regneark til et andet.

Der skal kopieres fra i alt 18 filer over i et ark, sådan at A1:BF13 fra de 18 filer kommer til at stå under hinanden, så 2. "felt" står i A15:BF26 - nr. 3 fra A28:BF39 osv.

Jeg har nedenstående makro, der overføre 2 ark til i alt 15 andre filer:

Sub TransferSheets1()
Dim TemplateBook As Workbook
Dim templatesheet1 As Worksheet
Dim templatesheet2 As Worksheet
Dim shName1 As String, shName2 As String
Dim AllBooks
Dim x As Long
On Error GoTo HandleErr
Set TemplateBook = ThisWorkbook
'Udfyld med de rigtige arknavne fra skabelonen
Set templatesheet1 = TemplateBook.Sheets("PRIVAT")
Set templatesheet2 = TemplateBook.Sheets("ERHVERV")
'Indsæt alle navnene på de projektmapper der skal udfyldes
AllBooks = Array("01 Aabenraa.xls", "02 Aalborg.xls", "03 Esbjerg.xls", "04 Herning.xls", "05 Horsens.xls", "06 Kolding.xls", "07 København.xls", "08 Odense.xls", "09 Padborg.xls", "10 Svendborg.xls", "11 Sønderborg.xls", "12 Tønder.xls", "13 Varde.xls", "14 Vejle.xls", "15 Århus.xls")
'Indsæt navnene på de ark der skal have nyt indhold
shName1 = "PRIVAT"
shName2 = "ERHVERV"
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


For x = LBound(AllBooks) To UBound(AllBooks)
    templatesheet1.Cells.Copy Destination:=Workbooks(AllBooks(x)).Sheets(shName1).[a1]
    templatesheet2.Cells.Copy Destination:=Workbooks(AllBooks(x)).Sheets(shName2).[a1]
    Workbooks(AllBooks(x)).Close SaveChanges:=True
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
ExitHere:
    Exit Sub
' Automatic error handler last updated at 04-20-2004 08:52:50
HandleErr:
    Select Case Err.Number
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "Module2.TransferSheets1"    'ErrorHandler:$$N=Module2.TransferSheets1
    End Select
' End Error handling block.
End Sub

--------------------------
Kan I hjælpe mig?
Avatar billede knowit-mmp Nybegynder
06. juli 2004 - 20:24 #1
Sub copySheetContents()
Dim objWBrecievingBook As Excel.Workbook
Dim objWBSourceBook As Excel.Workbook
Dim objWSRecivingSheet As Excel.Worksheet
Dim objWSSourceSheet As Excel.Worksheet

Dim shName1 As String

Dim AllBooks
Dim x As Long

On Error GoTo HandleErr
Set objWBrecievingBook = ThisWorkbook

'Udfyld med de rigtige arknavne fra skabelonen
Set objWSRecivingSheet = objWBrecievingBook.Sheets("Ark1")

'Indsæt alle navnene på de projektmapper der skal udfyldes fra

AllBooks = Array("Book1.xls", "Book2.xls", "Book3.xls")

'Indsæt navnet på det ark der skal modtage fra de 18 filer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


For x = LBound(AllBooks) To UBound(AllBooks)
    Set objWBSourceBook = Workbook.Open(AllBooks(x))
    Set objWSSourceSheet = objWBSourceBook.Sheets("Ark1")
   
    objWSSourceSheet.Range("A1:BF13").Copy Destination:=objWSRecivingSheet.Range(Cells(65536, 1).End(xlUp))
    objWBSourceBook.Close False
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

beforeExit:
    Exit Sub

errorhandler:

    Select Case Err.Number
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
           
    End Select

End Sub


Denne her skulle kunne gøre det du er interesseret i.
Avatar billede h_s Forsker
06. juli 2004 - 23:19 #2
Jeg skal lige høre dig. Det du kalder "Ark1" er det arket jeg kopier fra eller til? Hvor skal jeg skrive stien til de 18 ark der skal kopiers fra og hvor skal stien til det ark der skal kopieres til stå?
Avatar billede knowit-mmp Nybegynder
07. juli 2004 - 07:29 #3
Denne linje indeholder de filer der skal kopieres fra. I dette eksempel er der 3 filer :
    AllBooks = Array("Book1.xls", "Book2.xls", "Book3.xls")

Denne linje indeholder det ark der skal modtage data fra de 18 filer. Det skal være et ark i den fil, hvor du skal lægge denne kode:
    Set objWSRecivingSheet = objWBrecievingBook.Sheets("Ark1")

Denne linje åbner de filer, der indeholder de data der skal kopieres sammen:
    Set objWBSourceBook = Workbook.Open(AllBooks(x))

Linjen kan udvides så den også indeholder en sti til de 18 filer:
    Set objWBSourceBook = Workbook.Open("c:\mappe1\mappe2\" & AllBooks(x))

Linjen her vælger arket med dine kildedata, i den fil der lige er blevet åbnet:
    Set objWSSourceSheet = objWBSourceBook.Sheets("Ark1")


Jeg håber det var forklaring nok.
Avatar billede h_s Forsker
07. juli 2004 - 08:25 #4
Jeg har tilrettet formlen så den indeholder stien til de 18 filer.

Jeg får en fejl i linjen:

On Error GoTo HandleErr

Og får fejlen: Koden kan ikke udføres i pausetilstand

Hvad kan være årsagen?
Avatar billede h_s Forsker
07. juli 2004 - 08:49 #5
Jeg glemte lige og fortælle dig, at jeg bruger Office 95! Tror nok det har en lille betydning i programmeringen :-|
Avatar billede knowit-mmp Nybegynder
07. juli 2004 - 15:12 #6
Ja, det har en KÆMPE betydning.....

Linjen ON error goto HandleErr skal rettes til

On error goto errorhandler
Avatar billede h_s Forsker
08. juli 2004 - 08:24 #7
God morgen knowit-mmp!

Det er nu rettet. Kommer stadig med en fejl: Et objekt er obligatorisk
Avatar billede knowit-mmp Nybegynder
08. juli 2004 - 11:33 #8
OK, nu her jeg fundet fejlen, denne kode skulle kunne gøre det :

Sub copySheetContents()
Dim objWBrecievingBook As Excel.Workbook
Dim objWBSourceBook As Excel.Workbook
Dim objWSRecivingSheet As Excel.Worksheet
Dim objWSSourceSheet As Excel.Worksheet

Dim shName1 As String

Dim AllBooks
Dim x As Long

On Error GoTo errorhandler
Set objWBrecievingBook = ThisWorkbook

'Udfyld med de rigtige arknavne fra skabelonen
Set objWSRecivingSheet = objWBrecievingBook.Sheets("Ark1")

'Indsæt alle navnene på de projektmapper der skal udfyldes fra

AllBooks = Array("Book1.xls", "Book2.xls", "Book3.xls")

'Indsæt navnet på det ark der skal modtage fra de 18 filer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


For x = LBound(AllBooks) To UBound(AllBooks)
    Set objWBSourceBook = Workbooks.Open(ThisWorkbook.Path & "\" & AllBooks(x))
    Set objWSSourceSheet = objWBSourceBook.Sheets("Ark1")
   
    objWSSourceSheet.Range("A1:BF13").Copy Destination:=objWSRecivingSheet.Cells(65536, 1).End(xlUp)
    objWBSourceBook.Close False
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

beforeExit:
    Exit Sub

errorhandler:

    Select Case Err.Number
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
           
    End Select

End Sub

Hvis dine 18 filer ikke ligger i samme mappe som din modtage-fil, så skal du ændre følgende linje :

    Set objWBSourceBook = Workbooks.Open(ThisWorkbook.Path & "\" & AllBooks(x))

til

    Set objWBSourceBook = Workbooks.Open("[Indsæt sti her - fjern klammerne]" & "\" & AllBooks(x))


/Martin
Avatar billede h_s Forsker
08. juli 2004 - 14:45 #9
Tak det virker :-)

Hvis jeg nu vil have en række i mellemrum og gerne vil have der kun tages fra B1, hvad skal jeg så ændre? Jeg har prøvet at ændre objWSSourceSheet.Range("A1:BF13").Copy.... til objWSSourceSheet.Range("B1:BF13").Copy uden held!
Avatar billede knowit-mmp Nybegynder
08. juli 2004 - 15:29 #10
så skal du sætte denne linje :

objWSSourceSheet.Range("A1:BF13").Copy Destination:=objWSRecivingSheet.Cells(65536, 1).End(xlUp)

til

objWSSourceSheet.Range("B1:BF13").Copy Destination:=objWSRecivingSheet.Cells(65536, 2).End(xlUp).Offset(1,0)

Det skulle kunne gøre det...

/Martin
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