Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1092to1096
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

Makro in Makro schreiben lassen ?

Makro in Makro schreiben lassen ?
alexander
Hallo,
mein Problem:
Ich habe ein Makro zur Massenpflege von verschiedenen Dateien erstellt. Nun möchte ich aber, das mir das Makro beim abändern der einzelnen Dateien einen bestimmten Code (ein weiteres Makro) in die Tabellenblattmodule der einzelnen Dateien schreibt. Sprich, das die veränderten Dateien beim öffnen ein Makro besitzen das bei der Arbeit mit diesen Aktiv ist.
Wie kann ich das am besten realisieren ? Am lieben wäre es mir wenn es den Makro Code gleich beim durchlaufen des Massenpflege Makros mit reinschreiben würde..
Wird sicherlich irgendwie über "ActiveWorkbook.VBProject.VBComponents("Tabelle1")" zu machen sein, habe aber ehrlich gesagt garkeine Ahnung. Wenn ihr wiederum nur eine Möglichkeit kennt die den Makrocode aus einer Textdatei einlesen dann wäre ich damit auch zufrieden. Wobei mir Option 1 besser gefallen würde.
Vielen Dank schon einmal im Voraus,
Alexander
hier ein Beispiel...
10.08.2009 10:16:27
Tino
Hallo,
Dies kann man so machen.
Nachteil ist, dem Zugriff auf VBA Projekte muss vertraut werden, sonst geht es nicht.
Dies muss man an dem jeweiligen Rechner in den Excel- Optionen einstellen.
Sub Beispiel()
Dim strCode As String
Dim meSH As Worksheet
'Code für die Tabellen
strCode = _
"Option Explicit" & Chr(10) & "" & Chr(10) & _
"Private Sub Worksheet_Activate()" & Chr(10) & _
" MsgBox ""Ich bin ein neues Eventmakro""" & Chr(10) & _
"End Sub"
For Each meSH In ThisWorkbook.Worksheets
With ThisWorkbook.VBProject.VBComponents(meSH.CodeName).CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString strCode
End With
Next meSH
End Sub
Gruß Tino
Anzeige
AW: hier ein Beispiel...
10.08.2009 10:20:08
alexander
Hallo Tino und Andere,
vielen Dank schon einmal. Aber mein Makro haette weit mehr als 4 oder 5 Zeilen. Es sind etwa 100. Gibt es da nicht eine einfachere Methode als alles per "" anzugeben ?
Danke,
Alexander
geht auch aus einer Textdatei
10.08.2009 10:32:24
Tino
Hallo,
speichere Deinen Code sauber in eine Textdatei ab und versuche es mal mit diesem Code.
Bei diesem Code geht ein Dialog auf wo du nach der Textdatei gefragt wirst.
Sub Beispiel()
Dim sPfad As String
Dim meSH As Worksheet

sPfad = Application.GetOpenFilename("Text Files (*.txt), *.txt")

If sPfad <> CStr(False) Then
    For Each meSH In ThisWorkbook.Worksheets
     With ThisWorkbook.VBProject.VBComponents(meSH.CodeName).CodeModule
      .DeleteLines 1, .CountOfLines
      .AddFromFile sPfad
     End With
    Next meSH
End If
          
End Sub
Gruß Tino
Anzeige
AW: geht auch aus einer Textdatei
10.08.2009 10:38:38
alexander
Danke,
ist es jetzt noch möglich, dass es die Textdatei automatisch einliest ?
Danke,
Alex
AW: geht auch aus einer Textdatei
10.08.2009 10:39:56
alexander
Hatte vergessen "Frage noch offen" zu markieren...
AW: geht auch aus einer Textdatei
10.08.2009 10:43:52
Ramses
Hallo
Gib doch anstelle des Open-dialogs einfach den Pfad zu der Datei an
Gruss Rainer
AW: geht auch aus einer Textdatei
10.08.2009 10:44:55
Tino
Hallo,
wenn ich dich richtig verstehe, ersetze den Dialog durch Deinen Pfad.
sPfad = "C:\Ordner\Noch ein Ordner\CodeFile.txt"
Gruß Tino
AW: geht auch aus einer Textdatei
10.08.2009 11:18:47
alexander
Hallo,
habe nun nur noch ein Problem. Wenn ich das Makro so ausführe in der neu erstellen Datei aus einem Modul dann geht das alles und die Tabellenblattmodule werden gefüllt.
Wenn ich den Code:
sPfad = "C:\Documents and Settings\?\Desktop\DYNAMISCH_1.txt"
If sPfad  CStr(False) Then
For Each meSH In ThisWorkbook.Worksheets
With ThisWorkbook.VBProject.VBComponents(meSH.CodeName).CodeModule
.DeleteLines 1, .CountOfLines
.AddFromFile sPfad
End With
Next meSH
End If
nun aber in einem Massenpflege habe und das mit ablaufen lasse (Variablen oben natürlich angegeben), dann werden mir die Blätter nicht gefüllt.
--------------------------
Hier ein Ausschnitt aus meinem Massenpflegemakro:
Sub altneu_nach_neu1()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim zaehler1 As Integer
Dim bezug As String
Dim i As Integer
Dim f As String
Dim zelle, zelle2 As Range
Dim wks As Worksheet, wkb As Workbook
Dim sPfad As String
Dim meSH As Worksheet
With Application.FileSearch
.NewSearch
.LookIn = "C:\Documents and Settings\AAdam\Desktop\Vorlagen\"
.SearchSubFolders = False
.Filename = "*.*"
If .Execute() > 0 Then
For zaehler1 = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler1), UpdateLinks:=0
' hier dann ne ganze Menge Code
sPfad = "C:\Documents and Settings\?\Desktop\DYNAMISCH_1.txt"
If sPfad  CStr(False) Then
For Each meSH In ThisWorkbook.Worksheets
With ThisWorkbook.VBProject.VBComponents(meSH.CodeName).CodeModule
.DeleteLines 1, .CountOfLines
.AddFromFile sPfad
End With
Next meSH
End If
Workbooks(2).Save
Workbooks(2).Close
Next zaehler1
End If
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Woran kann das liegen ?
Danke,
Alex
Anzeige
AW: geht auch aus einer Textdatei
10.08.2009 11:43:21
Tino
Hallo,
versuche mal und mach aus ThisWorkbook. --> ActiveWorkbook.
Gruß Tino
AW: geht auch aus einer Textdatei
10.08.2009 13:03:50
alexander
Hallo,
wenn ich das mache hängt sich Excel auf und muss beendet werden sobald es diesen Code-Abschnitt erreicht (aus deinem Code): End With und dann wieder nach oben springt.
Woran kann das liegen ?
Danke,
Alex
AW: geht auch aus einer Textdatei
10.08.2009 13:05:07
alexander
Hallo,
wenn ich das mache hängt sich Excel auf und muss beendet werden sobald es diesen Code-Abschnitt erreicht (aus deinem Code): End With und dann wieder nach oben springt.
Woran kann das liegen ?
Das ist jetzt auf deine "ActiveWorkbook" Antwort bezogen...
Danke,
Alex
Anzeige
oder so.
10.08.2009 11:57:57
Tino
Hallo,
oder versuche es mal so und verwende für die Dateien eine Variable.
Kann es nicht testen, ab xl2007 gibt es kein FileSearch mehr.
Sub altneu_nach_neu1()
Dim zaehler1 As Integer
Dim bezug As String
Dim i As Integer
Dim f As String
Dim zelle, zelle2 As Range
Dim wks As Worksheet, wkb As Workbook
Dim sPfad As String, Desktop As String
Dim meSH As Worksheet
Dim objShell As Object


Set objShell = CreateObject("WScript.Shell")
Desktop = objShell.SpecialFolders("Desktop") 'Desktoppfad ermitteln 
Desktop = IIf(Right(Desktop, 1) = "\", Desktop, Desktop & "\")

 With Application
  .DisplayAlerts = False
  .ScreenUpdating = False
 
        With .FileSearch
            .NewSearch
            .LookIn = Desktop & "Vorlagen\"
            .SearchSubFolders = False
            .Filename = "*.*"
            
            If .Execute() > 0 Then
             
             ' hier dann ne ganze Menge Code 
             sPfad = Desktop & "DYNAMISCH_1.txt"
                For zaehler1 = 1 To .FoundFiles.Count
                    Set wkb = Workbooks.Open(Filename:=.FoundFiles(zaehler1), UpdateLinks:=0)
                            
                        If Dir(sPfad) <> "" Then
                            For Each meSH In wkb.Worksheets
                             With wkb.VBProject.VBComponents(meSH.CodeName).CodeModule
                              .DeleteLines 1, .CountOfLines
                              .AddFromFile sPfad
                             End With
                            Next meSH
                        End If
    
                        wkb.Close True
                 Next zaehler1
            End If
        End With
  .DisplayAlerts = True
  .ScreenUpdating = True
 End With
 
 Set objShell = Nothing
 End Sub
Gruß Tino
Anzeige
AW: oder so.
10.08.2009 13:06:50
alexander
Hallo,
wenn ich das mache hängt sich Excel auf und muss beendet werden sobald es diesen Code-Abschnitt erreicht (aus deinem Code): End With und dann wieder nach oben springt.
Woran kann das liegen ?
Das ist jetzt auf deine "ActiveWorkbook" Antwort bezogen...
Danke,
Alex
werde mal testen...
10.08.2009 13:35:43
Tino
Hallo,
muss mal xl2003 anschmeißen und testen, kann ein wenig dauern.
Gruß Tino
kann ich nicht nachvollziehen...
10.08.2009 13:44:37
Tino
Hallo,
habe es soeben bei mir unter xl2003 getestet, an drei Excel- Dateien.
Habe Dein Projekt exakt nachgebaut nur ohne den Code der da noch dazwischen ist.
Bei mir läuft der Code super durch ohne welche Aufhänger.
Kann Dir nicht sagen, was bei Dir anders ist.
Gruß Tino
Anzeige
So legt man Ereignisprocs aber besser nicht...
11.08.2009 02:58:24
Luc:-?
...an, Tino.
Dafür gibt's ein Kommando, das das Kopf und Fuß kreiert...
Gruß Luc :-?
kannst du es auch zeigen? oT.
11.08.2009 05:00:40
Tino
.CreateEventProc "Change", "Worksheet" orT
12.08.2009 04:15:26
Luc:-?
Gruß Luc :-?
und der Vorteil?
12.08.2009 04:56:12
Tino
Hallo,
was ist daran besser?
Kann den Vorteil nicht erkennen, außer daß End sub schon da steht.
Gruß Tino
Gott, liegt doch auf der Hand! Man kann...
13.08.2009 04:59:51
Luc:-?
...keinen Parameter vergessen, Tino...
Manchem ist halt nichts recht, selbst, wenn Bill ihm mal die Arbeit erleichtert... ;-)
Gruß m.Kopfschütteln
Luc :-?
Du bist gut...
13.08.2009 10:59:41
Tino
Hallo,
, wenn ich schon einen Code mit einem Code erstelle,
gehe ich davon aus der String vollständig und auch funktionsfähig ist.
Zudem solltest Du andere die nicht Deinen Kenntnisstand haben mit solchen Kommentaren abwerten, Kopfschütteln kann ich somit auch. ;-)
Ende
Gruß Tino
Anzeige
Das Kopfschütteln bezog sich nur auf...
14.08.2009 02:40:06
Luc:-?
...deinen "Einwand", nicht auf deinen Kenntnisstand, Tino... ;-) [*mild gelächelt*]
Gruß Luc :-?
AW: Einfache Alternative
10.08.2009 16:56:34
Daniel
Hi
machs doch so:
1. Erstelle die UpDate-Datei so, daß sie aussieht wie die alte Datei, nur halt mit den neuen Makros (dh. Sheets und Formate passen)
2. das Update-Makro kopiert dann nur noch die Daten und Formeln der Sheets aus der alten Datei in die Update-Datei, anschließend wird die alte Datei geschlossen und gelöscht, die Updatedatei speichert sich unter dem Namen der alten Datei wieder ab.
3. wenn das Makro mit der Update-Funktion ein einem eigenen Modul steht, dann kann sich das Makro auch selbst nach getander Arbeit wieder löschen, so daß es nicht ein 2.Mal aufgerufen werden kann.
Gruß, Daniel
Anzeige

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige