Avatar billede zany Nybegynder
17. august 2011 - 13:14 Der er 10 kommentarer og
1 løsning

Excel VBA kopier X antal ark fra 2 filer

Hej Eksperten

Jeg står med et VBA problem. Jeg bruger excel version 2007.

Jeg skal have en kode til følgende: Der er X antal ark i 2 "master" filer.
Herfra skal der kopieres et fast defineret antal ark (benævnt med specifik ark navn).
De kopierede ark skal gemmes i et nyt excel ark som gemmes automatisk udfra et hvad felt  A2 indeholder samt måneden (skrevet i felt R2.

Der skal total set oprettes ca. 20 nye ark, hvorved det virker smartest at efter overførsel af ark fra de 2 masterfiler, så lukkes den nye projektmappe.

Slutteligt, og evt i en seperat makro skal et outlook vindue åbnes hvor de nye filer er vedhæftede og filens navn er mailens overskrift. Derudover skal "til" feltet være udfyldt med en specifik mail adresse.

Indtil videre har jeg prøvet med følgende kode, men der får jeg kun 1 ark overført, og mail funktionen åbner kun mailen og vedhæfter filen, men mangler at angive mail adressen. Tror dog ikke den virker når der først kommer flere ark til?


Sub kopier()

' kopier Makro

    Application.Calculation = xlManual
' Deaktiverer beregningsfunktion i hele excel.

    Windows("150811 K-data.xlsm").Activate
    Sheets("BHN").Copy
    'Kopiere data ark i ny fil.

    FilNavn = Range("A2").Value
    Mdr = Range("R2").Value
    ActiveWorkbook.SaveAs Filename:="H:\My Documents\" & "TPM " & FilNavn & Mdr & ".xlsm", _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
'Gemmer filen med det angivne navn og format på angivne placering
       

Sheets("BHN").Select
'vælger data ark

Application.Dialogs(xlDialogSendMail).Show


End Sub




Forestiller mig det er en halv kompleks operation, hvorved jeg har sat et høj point tal på. På forhånd tak :)
Avatar billede supertekst Ekspert
17. august 2011 - 14:04 #1
"Slutteligt, og evt i en seperat makro skal et outlook vindue åbnes hvor de nye filer er vedhæftede"

Er der ikke kun tale om en ny fil?

-

Hvis du opbygger en illustrativ model af masterfiler og "ny fil" så skal jeg prøve at udarbejde koden. Denne vil jeg så placere i en "systemfil", der automatisk åbner de to masterfiler - kopiere ark til en ny fil - lukker masterfilerne - kalder outlook og sender den nye fil.

Du er altså velkommen til at sende en model - @-adresse under min profil.
Avatar billede zany Nybegynder
18. august 2011 - 09:21 #2
Jo der er kun tale om 1 ny fil. Det var en uklar formulering, da jeg mente at det evt. kunne skrive som et separat VBA modul i samme projektmappe.

Smart forslag med at have en "systemfil" hvorfra filudsplitning kunne foregå fra.
Masterfilerne består af en række ark. Typisk er 1 ark med data og et ark 2 med data og grafer. Ark 2 har en del referencer til ark 1. For at sikre at alt kommer med, vil det derfor være smartest at kopiere hele arket over som det er i masterfilerne.

Masterfilerne hedder:
K-data.xlsm
F-data.xlsm

Den nye fil skal hedde: " & "TPM " & FilNavn & Mdr & ".xlsm
hvor:
FilNavn = Range("A2").Value
Mdr = Range("R2").Value

De "nye" filer med ark fra de 2 masterark kan se ud som følger:
eksempel 1:

Arknavn: BHN (kilde: K-data.xlsm
Arknavn: BHN Analyse (kilde: K-data.xlsm)

Eksempel 2:
Arknavn: BBB (kilde: K-data.xlsm
Arknavn: BBB Analyse (kilde: K-data.xlsm
Arknavn: BRO (kilde: F-data.xlsm
Arknavn: BRO Analyse (kilde: F-data.xlsm
m.fl. ark

Koden skal derfor være fleksibel i forhold til at jeg i koden selv kan sætte op hvilke filer og fra hvor som skal over i den "nye fil".

Det kunne med fordel laves sådan at først hentes alle ark fra K-data, hvorefter den lukkes ned. Derefter hentes alle ark fra F-data.

Grunden hertil er at K-data fylder ca. 61 mb og F-data fylder ca. 86 mb

Slutteligt evt. i et seperat modul kunne e-mail funktionen være?

Jeg ved ikke om det besvarer de manglede informationer du mangler, eller om de skal være mere præcise/formuleres på en anden måde?
Avatar billede supertekst Ekspert
18. august 2011 - 10:04 #3
Spørgsmål:

"Koden skal derfor være fleksibel i forhold til at jeg i koden selv kan sætte op hvilke filer og fra hvor som skal over i den "nye fil".

Filnavne & sti - eller?

--

Alt andet lige ville det have været nemmere, hvis jeg kunne få en model. som jeg nævnte. Altså med repræsentation af filerne.
Avatar billede supertekst Ekspert
18. august 2011 - 10:17 #4
Endnu et spørgsmål:

FilNavn = Range("A2").Value
Mdr = Range("R2").Value

Fra hvilken fil/ark?
Avatar billede zany Nybegynder
18. august 2011 - 10:22 #5
Fleksibel i forhold til at jeg i koden kan angive hvilke ark i de 2 masterfiler jeg vil have over i den nye fil.

Jeg kan godt opsætte en model i excel og sende til dig? En model er det hvordan selve master arkene ser ud?
Avatar billede zany Nybegynder
18. august 2011 - 10:25 #6
FilNavn = Range("A2").Value
Mdr = Range("R2").Value


Værdierne herfra er placeret i det første ark som skal kopieres fra masterfilerne. F.eks. ift. tidligere eksempel så står værdierne heri i arkene BHN og BBB
Avatar billede supertekst Ekspert
18. august 2011 - 10:34 #7
Tror vi stopper her - måske kommer der en forbi...
Avatar billede zany Nybegynder
18. august 2011 - 10:50 #8
Måske lettere hvis jeg sender dig en model over filerne?
Avatar billede supertekst Ekspert
18. august 2011 - 10:59 #9
Ok -
Avatar billede zany Nybegynder
18. august 2011 - 11:32 #10
så er det afsendt :)
Avatar billede supertekst Ekspert
20. august 2011 - 23:49 #11
VBA-kode i Userform1:

Rem Reference til Microsoft Outlook xx. Object Library er sat
Rem =========================================================
Const masterSti = "C:\Users\peter\Desktop\Zany_945248\"                    'Tilpasses
Const resultatSti = "C:\Users\peter\Desktop\Zany_945248\ResultatFiler\"      '-- " --

Dim Kdata As Workbook, Fdata As Workbook
Const KmasterNavn = "K-data.xlsm"
Const FmasterNavn = "F-data.xlsm"

Const resultatDummyNavn = "Resultat.xlsm"
Dim ResultatObj As Workbook, resultatFilNavn As String

Const modtagerMail = "xx@xxx-it.dk"                                  'Tilpasses
Private Sub CommandButton1_Click()                  'Ok-knap
On Error GoTo fejl
    With ResultatObj
        kopierFraMaster Kdata, Me.Lb_KarkNavne
        kopierFraMaster Fdata, Me.Lb_FarkNavne
       
        If .Sheets.Count > 1 Then
            Application.DisplayAlerts = False
            .Sheets("xxx").Delete
       
            .SaveAs Filename:=resultatSti & resultatFilNavn
        End If
    End With
   
Rem overfør resultatfilnavn til arket
    ThisWorkbook.ActiveSheet.Range("A1") = resultatSti
    ThisWorkbook.ActiveSheet.Range("A2") = resultatFilNavn
   
    lukAlleObjekter
   
    Exit Sub
   
fejl:
    MsgBox "Fejl erkendt"
    Stop
    Resume Next                'til test

    lukAlleObjekter
End Sub
Private Sub userform_terminate()
    lukAlleObjekter
End Sub
Private Sub lukAlleObjekter()
    lukObjekt Kdata
    lukObjekt Fdata
    lukObjekt ResultatObj
   
    Unload UserForm1
End Sub
Private Sub kopierFraMaster(mobj As Workbook, listeObj As Object)
Dim f As Byte, antalArk As Byte
    For f = 0 To listeObj.ListCount - 1
       
        antalArk = ResultatObj.Sheets.Count
       
        If listeObj.Selected(f) = True Then
            arknavn = listeObj.List(f)
                     
            mobj.Sheets(arknavn).Copy after:=ResultatObj.Sheets(antalArk)
        End If
    Next f
End Sub
Private Sub UserForm_activate()
    Application.Cursor = xlDefault
    visDataFraMaster
End Sub
Private Sub visDataFraMaster()
    Application.ScreenUpdating = False
   
    Application.Cursor = xlWait
    Me.Frame1.Enabled = True
    fraMaster Kdata, KmasterNavn, Me.Lab_Kfilnavn, Me.Lab_Kmåned, Me.Lb_KarkNavne
   
    Me.Frame2.Enabled = True
    fraMaster Fdata, FmasterNavn, Me.Lab_FfilNavn, Me.Lab_Fmåned, Me.Lb_FarkNavne
    Application.Cursor = xlDefault
   
Rem opret resultatfil
    resultatFilNavn = "TPM " & Me.Lab_Kfilnavn & " " & Me.Lab_Kmåned
    Set ResultatObj = Workbooks.Open(masterSti + resultatDummyNavn)
       
    Me.CommandButton1.Enabled = True
End Sub
Private Sub fraMaster(mobj As Workbook, masterfilNavn As String, filNavnObj As Object, månedObj As Object, listeObj As Object)
Dim ark As Worksheet

On Error GoTo lukFilObj
   
    Set mobj = Workbooks.Open(masterSti + masterfilNavn)
    filNavnObj = mobj.ActiveSheet.Range("A2")
    månedObj = mobj.ActiveSheet.Range("R2")
       
Rem Vis arknavne, der ikke er rent numeriske
    listeObj.Clear
   
    For Each ark In mobj.Sheets
        If IsNumeric(ark.Name) = False Then
            listeObj.AddItem ark.Name
        End If
    Next ark
    Exit Sub
   
lukFilObj:
    MsgBox "Fejl erkendt"
    Resume Next

    lukObjekt mobj
    Stop
End Sub
Private Sub lukObjekt(mobj As Workbook)
On Error Resume Next
    Application.Cursor = xlDefault

    mobj.Close savechanges:=False
    Set mobj = Nothing
End Sub
Public Sub emailSendes()
    SendResultatFil modtagerMail, ThisWorkbook.ActiveSheet.Range("A2"), ThisWorkbook.ActiveSheet.Range("A1")
End Sub
Public Sub SendResultatFil(modtager, emne, ResultatFilSti)
Dim mailApp, Namespace, indbakke, nyMail, nyAtt
    Set mailApp = CreateObject("Outlook.Application")

    Set nyMail = mailApp.CreateItem(olMailItem)
    Set nymod = nyMail.Recipients
    nymod.Add modtager
    nyMail.Subject = emne
   
    Set nyAtt = nyMail.Attachments
    nyAtt.Add ResultatFilSti & emne + ".xlsm"
   
    nyMail.Display
    nyMail.send
End Sub
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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