Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1532to1536
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Exceldatei generieren incl Makro

Exceldatei generieren incl Makro
16.01.2017 14:51:38
japes36
Hallo zusammen,
ich generiere hier aus einer Exceldatei per VBA eine neue Exceldatei. Diese wird als *.xlsm gespeichert. In dieser neu erzeugten Datei hätte ich aber gern ein paar Zeilen Code, der beim Öffnen der Datei ausgeführt wird.
Wie bekomme ich Code per VBA in die andere Datei? Hab ja gelernt, dass irgendwie dann doch "fast" alles geht :D
Beispieldatei kann ich hier leider nicht hochladen durch 300kb Beschränkung.
Danke und viele Grüße
Jan

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nepumuk in OL in 2008
16.01.2017 15:14:23
japes36
Schon mal Top, vielen Dank :)
Ich benötige den Code in "diese Arbeitsmappe" damit der beim Workbook_Open ausgeführt wird.
Bis jetzt war ich mit Suchmaschinen immer nur auf Erzeugen/Kopieren von Modulen gelandet.
Gibts für meinen Fall auch etwas?
Vielen Dank
ebenda, 1 Seite vorher
16.01.2017 15:32:03
lupo1
http://office-loesung.de/ftopic229690_0_0_asc.php
Vermutlich nimmt man statt .Add(1) einfach .Add(100), wenn ich den ersten Code in dem Link richtig verstehe, und mit dem vorherigen Link vergleiche. Habs nicht ausprobiert.
Wäre schön, wenn Du Deine Beobachtungen anschließend mitteilst! Wegen der Seltenheit.
Anzeige
oder evtl. "transparenter"
16.01.2017 15:52:18
Michael
Hi,
der Link ist interessant...
Man könnte aber auch die Makro-Datei quasi als Vorlage erstellen, öffnen (ohne Events, dann wird das dortige Open nicht ausgeführt), mit Daten bestücken und unter anderem Namen speichern, also etwa so:
Option Explicit
Sub auf()
Dim pfad$, datei$, neu$
Dim aktWB As Workbook, macWB As Workbook
Set aktWB = ThisWorkbook
pfad = ThisWorkbook.Path & "\"
datei = "Workbook_Open_hier_drin.xlsm"
neu = "Workbook_Open_erzeugt.xlsm"
Application.EnableEvents = False
Workbooks.Open pfad & datei
Application.EnableEvents = True
Stop ' hier dann weiter mit F8
Set macWB = ActiveWorkbook
' alles mögliche kopieren...
aktWB.Sheets(1).Range("A1").Copy macWB.Sheets(1).Range("B2")
macWB.SaveAs pfad & neu
macWB.Close
MsgBox "erl."
End Sub

Das stop ist nur zum Mitverfolgen des Makros und kann gelöscht werden, wenn es wunschgemäß läuft.
Schöne Grüße,
Michael
Anzeige
AW: oder evtl. "transparenter"
16.01.2017 16:37:49
japes36
Hi Michael,
Vorlage ist so nicht umsetzbar, da unbestimmte Anzahl von Kollegen, Abteilungen und Standorten Zugriff auf diese Vorlage haben müssten.
Danke dennoch :)
AW: ebenda, 1 Seite vorher
16.01.2017 16:34:42
japes36
Hi und vielen Dank. Ich werd das morgen in der Firma weiter ausprobieren. Hier zu Hause hab ich nur Excel for Mac. Da geht mein Vertrauen in Seattle nicht weit genug, um derlei Code unter MacOS zu schreiben und in der Firma mit den 64bit Win Dosen auszuführen :D
AW: Exceldatei generieren incl Makro
16.01.2017 15:39:00
littletramp
Hallo Jan
Auch dieses kann per VBA realisiert werden.
Wenn es immer derselbe Code ist, so erstellst du eine Excel-Vorlage mit Makros, die den gewünschten Code enthält. Beim Erzeugen der Excel-Mappe anhand dieser Vorlage wird dann autom. auch der Code übernommen.
Wenn es nicht immer derselbe Code ist, so wird es etwas komplizierter. Dabei wäre der Codeteil lösbar. Das grössere Problem ist dann aber, dass bei den Makrosicherheitseinstellungen der "Zugriff auf das VBA-Projektmodell vertrauen" aktiviert werden muss. Dass das ein Systemadministrator zulässt, ist eher nicht anzunehmen.
Falls du wirklich diese Variante brauchst, könnte ich dir weiterhelfen, da ich bereits einen IDE-AddIn erstellt habe, der dies tut.
Gruss Markus
Anzeige
AW: Exceldatei generieren incl Makro
16.01.2017 16:28:04
japes36
Hallo und Danke :)
zu 1:
dazu müsste für alle, die da Dateien generieren wollen, diese Vorlage allgemein zugänglich sein, was hier im Unternehmen nicht so einfach umzusetzen ist.
zu 2:
..brauch ich unsere Admins gar nicht erst fragen :D
Viele Grüße
AW: Exceldatei generieren incl Makro
16.01.2017 16:28:06
littletramp
Hallo Jan
Wenn du das Ausführen von Workbook_Open beim Erzeugen der Mappe aus der Vorlage unterdrücken willst, so empfehle ich dir zu prüfen ob die Mappe schon gespeichert ist, was ja dann ein Workbook_Open ist.
Dazu prüfst du ganz einfach ob die Mappe schon einen Pfad hat. Von der Verwendung von EnableEvents würde ich eher abraten.
Hier der benötigte Code in der Vorlage:
Private Sub Workbook_Open()
If ThisWorkbook.Path = "" Then Exit Sub
' Hier der Code der beim Öffnen der gespeicherten
' Arbeitsmappe ausgeführt werden soll
MsgBox "Workbook_Open"
End Sub
Gruss Markus
Anzeige
AW: Exceldatei generieren incl Makro
16.01.2017 16:31:23
japes36
Hi Markus,
guter Tipp. Hebe ich mir für andere Projekte mal auf. Kannte ich so noch nicht ;) Hier bringt mich das nicht weiter.
Viele Grüße
AW: Exceldatei generieren incl Makro
16.01.2017 16:45:42
littletramp
Hallo Jan
Ich hätte da noch eine andere Variante, ohne Vorlage.
Dazu müsste ich aber schon genaueres Wissen zum Code der enthalten sein soll:
  • immer derselbe Code?

  • mehrere Codevarianten:
    • wovon ist die Variantenwahl abhängig
      • Benutzer
      • oder was

  • Gruss Markus
    AW: Exceldatei generieren incl Makro
    16.01.2017 16:52:33
    japes36
    Hi Markus,
    ja, der Code, welcher beim Öffnen ausgeführt werden soll, ist immer gleich. Der springt nur komfortabel zu bestimmten Sheets und da zu Zellen, abhängig vom Tag und Uhrzeit und welche Daten bereits vorhanden sind.
    Anzeige
    AW: Exceldatei generieren incl Makro
    16.01.2017 17:03:52
    littletramp
    Hallo Jan
    Noch zwei Fragen:
  • Wird die Mappe in der du jetzt gerade programmierst und die die neuen Mappen erzeugen soll, nur von dir, oder auch von anderen benutzt.

  • Wäre es dir egal, dass der Code der Mappe, in der du jetzt gerade programmierst, auch in der neu erzeugten Mappe enthalten ist (ganzer Code mit Passwortschutz).

  • Gruss Markus
    AW: Exceldatei generieren incl Makro
    16.01.2017 17:09:50
    japes36
    Hmmm...ich hab das Ding zusammengebastelt, aber es wird nicht nur von mir, sondern auch von anderen genutzt. Allerdings wird diese schreibgeschützt geöffnet.
    zur zweiten Frage, iim Prinzip ist es mir egal, lediglich die Dateigröße macht einen Unterschied. Die erzeugten Dateien sind frisch erzeugt nur halb so groß wie Mutti :D Aber wir reden hier von knapp 500kb zu 240kb, also vernachlässigbar.
    Bin gespannt, was Du vorschlägst. Allerdings werd ich mich auf jeden Fall auch mit dem Vorschlag von Lupo beschäftigen, wenn ich nicht mehr an nem MacBook sitze
    Anzeige
    AW: Exceldatei generieren incl Makro
    16.01.2017 17:29:49
    japes36
    
    Dim WS As Worksheet
    With Worksheets(Array("Voreinstellungen", "Feiertage", "Januar", "Februar", "März", "April", _
    "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", "Jahresübersicht", "Fahrtkosten", "Berechnungen"))
    .Copy
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    '        Set WBS = ActiveWorkbook
    For Each WS In actFile.Worksheets
    WS.UsedRange.Formula = WS.UsedRange.Formula
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    Next WS
    End With
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    Call prcGenerate("pcrProtectSheets", "Geheim")
    Application.Visible = False
    Application.DisplayAlerts = False
    Dim strPfad As String
    strPfad = Environ("UserProfile") & "\Desktop\"
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    Sheets("Berechnungen").Visible = False
    Sheets("Voreinstellungen").Activate
    ActiveWorkbook.Date1904 = True
    Application.Visible = False
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    If ActiveSheet.ProtectContents = True Then Exit Sub
    For Each WS In Worksheets
    WS.Protect DrawingObjects:=False, Contents:=True, Scenarios:=True, Password:="n198969"
    LBL_Blau.Width = LBL_Blau.Width + Faktor: DoEvents
    Next
    ..........
    
    das wäre der Teil, bei dem nach Erstellen der Datei der Makrocode mitgegeben werden müsste, bevor sie gespeichert wird bzw. gleich versendet...
    Anzeige
    AW: Exceldatei generieren incl Makro
    16.01.2017 17:38:57
    littletramp
    Die Variante von Lupo verlangt, dass bei den Makrosicherheitseinstellungen der "Zugriff auf das VBA-Projektmodell vertrauen" aktiviert werden muss!!!!
    AW: Exceldatei generieren incl Makro
    16.01.2017 19:49:31
    littletramp
    Da greift er doch auf das VBProject zu, und dazu muss er die Makrosicherheitseinstellungen ändern:
    Workbooks("Testmappe.xls").VBProject.VBComponents
    

    AW: Exceldatei generieren incl Makro
    16.01.2017 20:59:53
    littletramp
    Hallo Jan
    Ich habe dir eine Demo erstellt (https://www.herber.de/bbs/user/110615.xlsm).
    Aller Code muss sich in der Originalmappe (die Mappe, die dann die neue Mappe erzeugt) befinden.
    Von dieser Mappe wird eine temporäre Kopie gespeichert. Dann wird die Kopie gleich geöffnet, ev. nichtbenötigte Blätter entfernt, Tabellen angepasst, und der Anwender aufgefordert die Mappe unter neuem Namen abzuspeichern. Zum Schluss wird dann noch die temporäre Kopie gelöscht.
    Das Erzeugen der neuen Mappe erfolgt mit Sub NeueMappeMitMakrosErzeugen() die sich im Tabellenblatt "Erzeuge neue Mappe mit Makro" befindet (siehe auch Schaltfläche auf Tabellenblatt).
    Dieses Blatt wird in der neuen Mappe gelöscht, somit ist dieser Code in der neuen Mappe nicht mehr vorhanden.
    Falls du noch Code hast, der in der neuen Mappe erhalten bleibt, und der dort nicht ausgeführt werden darf, so kannst du die Ausführung durch hinzufügen nachfolgender Zeile verhindern (als erste Zeile in Public Sub/Function).
    If Not IstOriginalmappe Then Exit Sub
    
    Beim wiederholten Öffnen der neu erzeugten Mappe wird dann der für die neu erzeugte Mappe erstellte Code von Workbook_Open() ausgeführt.
    Damit es funktioniert muss in der Originalmappe der Name FlagIstOriginalmappe mit dem Wert TRUE enthalten sein. Dieser Name wird dann beim Erzeugen der Neuen Mappe gelöscht. So ist erkennbar, ob es sich um die Originalmappe, oder um eine neu erstellte Mappe handelt.
    Das Flag kannst du mit Sub ErzeugeFlagIstOriginalmappe() erzeugen die sich im Sheet("Erzeuge neue Mappe mit Makro") befindet.
    Code in Diese Arbeitsmappe:
    Option Explicit
    Private Sub Workbook_Open()
    ' Prüfen ob Originalmappe, oder neu erzeugte Mappe
    If IstOriginalmappe Then
    Sheets("Erzeuge neue Mappe mit Makro").Activate
    Else
    MsgBox "Workbook_Open von neuer Mappe"
    End If
    End Sub
    
    Code im Sheet("Erzeuge neue Mappe mit Makro"):
    Option Explicit
    '    Markus Schmid, info@maschmid.ch
    Private Sub NeueMappeMitMakrosErzeugen()
    Dim wbk As Workbook
    Dim obj As Object
    Dim wsh As Worksheet
    Dim dlg As FileDialog
    Dim strTempFileName As String
    ' Nur Ausführen wenn Originalmappe
    If Not IstOriginalmappe Then Exit Sub
    strTempFileName = ThisWorkbook.Path & "\Temp_" & Format(Now, "dd_mm_yy_hh_mm_ss") & ".xlsm"
    ThisWorkbook.SaveCopyAs strTempFileName
    Set wbk = Workbooks.Open(strTempFileName)
    For Each obj In wbk.Sheets
    Select Case obj.Name
    Case "Voreinstellungen", "Feiertage", "Januar", _
    "Februar", "März", "April", "Mai", "Juni", _
    "Juli", "August", "September", "Oktober", _
    "November", "Dezember", "Jahresübersicht", _
    "Fahrtkosten", "Berechnungen"
    ' nichts machen
    Case Else
    ' Sheet löschen
    Application.DisplayAlerts = False
    obj.Delete
    Application.DisplayAlerts = True
    End Select
    Next
    ' hier weitere Anpassungen ausführen
    For Each wsh In wbk.Worksheets
    ' Beispielcode
    wsh.Range("A1").Value = wsh.Name
    wsh.Range("A2").Value = FormatDateTime(Now, vbShortTime)
    Next
    ' Nun Flag entfernen
    wbk.Names("FlagIstOriginalmappe").Delete
    ' Nun vom Anwender unter anderem Namen speichern lassen
    Do      ' Endlosschleife mit Exit Do
    Set dlg = Application.FileDialog(msoFileDialogSaveAs)
    dlg.InitialFileName = ""    ' hier ev. Name vorgeben
    dlg.FilterIndex = 2         ' 2: Excel-Arbeitsmappe mit Makros
    dlg.Show
    ' Wenn anderer Name eingegeben, so Mappe speichern,
    ' temp. Datei löschen, und Schleife verlassen.
    If dlg.SelectedItems(1)  strTempFileName Then
    dlg.Execute             ' Mappe speichern
    Kill strTempFileName    ' temp. Datei löschen
    Exit Do                 ' Schleife verlassen
    Else
    MsgBox "Sie müssen die Datei unter" & vbLf _
    & "einem neuen Namen speichern!", vbExclamation
    End If
    Loop
    End Sub
    Private Sub ErzeugeFlagIstOriginalmappe()
    ThisWorkbook.Names.Add "FlagIstOriginalmappe", "=TRUE"
    End Sub
    
    Und hier noch der Code zum ermitteln ob es sich um die Originalmappe handelt.
    Code in Modul modFlagHandling:
    Option Explicit
    Option Private Module
    Public Function IstOriginalmappe() As Boolean
    On Error Resume Next
    IstOriginalmappe = ThisWorkbook.Names("FlagIstOriginalmappe").Value = "=TRUE"
    On Error GoTo 0
    End Function
    
    Ich hoffe, dass du meine Lösung brauchen kannst, hat mich viel Zeit gekostet :-)
    Gruss Markus
    Anzeige
    AW: Exceldatei generieren incl Makro
    16.01.2017 21:07:45
    japes36
    Hi Markus,
    Du bist der Hammer. *verbeug
    Ich hoffe, ich komme schon die nächsten Tage dazu. Ansonsten wird's wohl erst das Wochenende. Sieht alles sehr plausibel aus und das Du dir die Mühe gemacht hast, ist nicht selbstverständlich. Großes Lob
    Viele Grüße
    Jan
    AW: Exceldatei generieren incl Makro
    17.01.2017 07:59:07
    japes36
    Guten Morgen :)
    deine Datei eben auf meiner Windowsmaschine ausprobiert. Super Workaround für meine Ausgangsfrage, dass ich in einer durch VBA generierten Datei Makrocode haben möchte.
    As i said...es geht dann doch so ziemlich alles in VBA, wenn man weiß wie... ^^
    Meine "Vorlage" wird schreibgeschützt geöffnet, startet automatisch eine Userform und versteckt "Excel". Mit den Eingaben in die Userform und den Daten aus der Vorlage wird eine Datei generiert und gespeichert oder automatisch versendet an die Zielperson. Da der Code von mir bereits älter ist und einiges daran ich heute nicht mehr so machen würde(auch wenn er 100% funktioniert), werde ich beim Einarbeiten deines Codes gleich das komplette Ding überarbeiten.
    Nochmals vielen Dank :)
    Viele Grüße
    Jan
    Anzeige
    AW: Exceldatei generieren incl Makro
    17.01.2017 15:23:25
    japes36
    Hallo Markus,
    bin dann doch heute schon dazugekommen. Ich stoße auf folgenden Widerstand :D
    Ich lass ja bei Workbook_Open bereits die Userform starten für die Eingaben. Wenn mit deinem Code die temporäre Datei geöffnet wird, ist das Flag für die Originaldatei noch vorhanden und er will dort dann auch die Userform starten. Hast zufällig noch ne Idee dafür?
    Zur Not starte ich den ganzen Kram per Button, wie in deiner Demo. Wäre halt schicker, wenn man auf den Button verzichten könnte..
    Vielen Dank und Grüße
    Jan

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige