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

Run-Macro-in-protected-Project

Run-Macro-in-protected-Project
06.09.2021 17:06:31
Hendrik
Hi zusammen!
Ich habe vor einem Jahr eine Makro-Vorlage gebaut, mit denen Projekte kalkuliert werden.
Nennen wir Sie Vorlage B.
D.h., es liegen mittlerweile über 100 verschiedene Projekte vor, die alle im Format der Vorlage B vorliegen.
Also B1, B2 usw.
Die Vorlage B hat ca. 32 Tabellenblätter, von denen ich für mein neues Tool (siehe folgend) nur die Abschlusstabelle 15 benötige.
Die Vorlage B ist so aufgebaut, dass beim Öffnen der Datei nur das Tabellenblatt 1 angezeigt wird. Den Rest lässt man sich spezifisch einblenden.
Nun baue ich eine neue Datei, die eine Analyse dieser Projekte vornehmen soll.
Nennen wir Sie Vorlage A.
Dazu versuche ich, alle Projekte mit Vorlage B, die ich gerne untersuchen möchte, in einen Ordner zu werfen, und dass diese dann von meiner neuen Vorlage A durchgegangen werden.
Problem:
Um die o.g. Abschlusstabelle 15 anzuzeigen, muss ich also erst die Datei mit open-workbooks öffnen lassen und dann das in der Vorlage vorliegende Modul "alle_einblenden" ausführen (run).
Dies funktioniert leider nicht, weil das VBA-Projekt passwortgeschützt ist.
Wie kriege ich es hin, dass er, nachdem er mit open-workbooks die Datei geöffnet hat, die VBA-Umgebung mit dem vorliegenden Passwort ("Test") aktiviert, sodass ich dann mit Application.Run das benötigte "Sub" ausführen kann?
Ich dachte, ich hätte eine Lösung für die Passworteingabe gefunden (siehe im Code in fett und kursiv), aber das funktioniert nicht.

Sub Bereich_importieren()
Dim directory As String
Dim fileName As String
Dim sheet As Worksheet
Dim total As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
directory = "C:\meinpfad\Test\"
fileName = Dir(directory & "*.xl?")
Do While fileName  ""
Workbooks.Open (directory & fileName)
ActiveWorkbook.Activate
Application.Run fileName & "!alle_einblenden", Password:="Test"
For Each sheet In Workbooks(fileName).Worksheets
total = Workbooks("Gesamtdatei").Worksheets.Count
Workbooks(fileName).Worksheets("Name der Tabelle15").Copy _
after:=Workbooks("Gesamtdatei").Worksheets(total)
Next sheet
Workbooks(fileName).Close
fileName = Dir()
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Vielen lieben Dank im Voraus fürs Lesen. Ich habe versucht, sehr genau zu sein, aber wenn noch Informationen benötigt werden, liefere ich die gerne nach :-)
Beste Grüße
Hendrik

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Run-Macro-in-protected-Project
06.09.2021 17:10:25
Nepumuk
Hallo Hendrik,
zeig doch mal den Code von "alle_einblenden".
Gruß
Nepumuk
AW: Run-Macro-in-protected-Project
06.09.2021 17:16:43
Oberschlumpf
Hi Hendrik
- wenn du "Name von Tabelle15" kennst, sollte eigtl schon der Befehl

Sheets("Name Tabelle15").Copy ....usw
reichen, da eine Tabelle, um kopiert werden zu können ,nicht sichtbar sein muss.
- wenn du den Namen von Tabelle15 nicht kennst, dann musst du in jedes Makro "alle_einblenden" die Befehle einbinden, dass

Blattschutz entfernt wird (geht mit .UnProtect "korrektes password")
Blatt wird sichtbar
Blattschutz wird wieder gesetzt (geht mit .Protect "korrektes password")
Hilfts?
Wenn nein, zeig bitte ausreichend viele Bsp-Dateien per Upload.
Ciao
Thorsten
Anzeige
AW: Run-Macro-in-protected-Project
06.09.2021 17:20:58
Nepumuk
Hallo Thorsten,
da täuschst du dich. Um ein Worksheet zu kopieren muss es sichtbar sein.
Gruß
Nepumuk
AW: Run-Macro-in-protected-Project
06.09.2021 17:28:13
Oberschlumpf
Hi M.
hmm, ok, danke, ich hatte das Gegenteil tatsächlich unterstellt - ohne - es mal zu testen.
Wieder was gelernt.
Ciao
Thorsten
AW: Run-Macro-in-protected-Project
06.09.2021 20:56:07
Hendrik
Hi Nepumuk und Thorsten!
Dankeschön, dass Ihr euch meiner annehmt.
Das "Sub" für das Einblenden der Tabellenblätter ist nix Besonderes:

Sub alle_einblenden()
Application.ScreenUpdating = False
If Application.InputBox("Bitte geben Sie das Passwort ein!", "Passwortabfrage") = "Test" Then
For Each ws In ThisWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
Else
MsgBox "Falsches Passwort", vbCritical, "Fehler"
End If
Application.ScreenUpdating = True
End Sub
Bei Projekten mit Vorlage B, wo ich das Passwort vom VBA-Projekt entfernt habe, funktioniert es, da führt er das alle_einblenden aus.
Bei Projekten mit Vorlage B, wo das Passwort vom VBA-Projekt aktiv ist, kommt der Laufzeitfehler 1004, dass das Makro wohl nicht verfügbar ist oder verschoben wurde o.ä.
Darum meine Frage: Wie kriege ich es hin, im Modul von Vorlage A, nachdem open-workboos das Workbook geöffnet hat, man das Passwort vom VBA-Projekt eingeben kann, damit er dann das Modul "alle_einblenden" in der Vorlage B ausführen kann.
War das so hilfreich? Wenn ihr Beispieldateien braucht, würde ich mich morgen früh mal hinsetzen und welche für die Öffentlichkeit zusammenstutzen :-)
Besten Gruß!
Hendrik
Anzeige
Nicht einfach möglich!
07.09.2021 04:04:41
Luc:-?
Es ist nicht mit einfachen Befehlen möglich, einen VBA-Projekt-Schutz aufzuheben, Hendrik,
sonst hätte man das ja auch mit generell geschützten µS-AddIns machen können, obwohl das nicht viel bringt. Man muss dazu TastenAnschläge senden, was auch schief gehen kann und deshalb nicht zu empfehlen ist. Du solltest dir etwas Anderes überlegen!
Morhn, Luc :-?
AW: Run-Macro-in-protected-Project
07.09.2021 09:04:51
Nepumuk
Hallo Hendrik,
du brauchst doch das andere Makro gar nicht. Da du schon eine Schleife über die Worksheets im Import-Makro hast, blende sie da ein:

Option Explicit
Sub Bereich_importieren()
Const directory As String = "C:\meinpfad\Test\"
Dim fileName As String
Dim sheet As Worksheet
Dim objWorkbook As Workbook
Dim total As Integer
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
fileName = Dir$(directory & "*.xls*")
Do Until fileName = ""
Set objWorkbook = Workbooks.Open(directory & fileName)
For Each sheet In objWorkbook.Worksheets
sheet.Visible = xlSheetVisible
total = Workbooks("Gesamtdatei").Worksheets.Count
objWorkbook.Worksheets("Name der Tabelle15").Copy _
After:=Workbooks("Gesamtdatei").Worksheets(total)
Next sheet
objWorkbook.Close SaveChanges:=False
fileName = Dir$
Loop
Set objWorkbook = Nothing
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub
Gruß
Nepumuk
Anzeige
AW: Run-Macro-in-protected-Project
07.09.2021 09:17:28
Hendrik
Guten morgen Nepumuk und Luc und Thorsten!
Dankeschön für eure Rückmeldungen.
@Luc: Das ist dieses "sendkeys", richtig? Das habe ich vereinzelt in den Tiefen des Interwebs gesehen (google Seite 5! :-D), teilweise in Beiträgen von 2002 oder so. Ich dachte, wenn man das Passwort hätte, könnte man das VBA-Projekt einfach "öffnen" ohne Sendkeys, denn du hast Recht: Diese Lösung ist vielleicht nicht ideal.
@Nepumuk:
Dankeschön für deinen Lösungsvorschlag! Diese Lösung habe ich vor lauter Bäumen im Wald gar nicht bedacht.
Ich probiere den eben aus und gebe Rückmeldung. Wollte mich nur schon mal melden, damit ihr nicht denkt, ihr vertut eure Zeit hier mit mir :)
Besten Gruß und bis gleich!
Hendrik
Anzeige
AW: Run-Macro-in-protected-Project
07.09.2021 13:25:24
Hendrik
UPDATE:
Lieber Nepumuk, deine Idee war wie ein Durchbruch. Ich brauche tatsächlich nicht das "Sub" in der Vorlage-B-Datei ausführen, ich kann einfach alle Blätter einblenden, wie du es geschrieben hast.
Einzige Änderung, die ich machen musste:
Das "next sheet" musste ich etwas hochziehen (siehe in deinem Code in fett und kursiv, Stelle 1).
Option Explicit

Sub Bereich_importieren()
Const directory As String = "C:\meinpfad\Test\"
Dim fileName As String
Dim sheet As Worksheet
Dim objWorkbook As Workbook
Dim total As Integer
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
fileName = Dir$(directory & "*.xls*")
Do Until fileName = ""
Set objWorkbook = Workbooks.Open(directory & fileName)
For Each sheet In objWorkbook.Worksheets
sheet.Visible = xlSheetVisible
'Stelle1
Next sheet
total = Workbooks("Gesamtdatei").Worksheets.Count
'Stelle2
            objWorkbook.Worksheets("Name der Tabelle15").Copy _
After:=Workbooks("Gesamtdatei").Worksheets(total)
objWorkbook.Close SaveChanges:=False
fileName = Dir$
Loop
Set objWorkbook = Nothing
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub
Ich bin dabei in ein Folgeproblem gelaufen, wo ich hoffe, dass es da auch eine einfache Lösung gibt:
In dem Passus an Stelle 2:
"objWorkbook.Worksheets("Name der Tabelle15").Copy _
After:=Workbooks("Gesamtdatei").Worksheets(total)"

wird das gesamte Tabellenblatt 15 kopiert. Damit aber leider auch ein VBA-Code, der in dem Blatt liegt.
Dieser Code wirft mir dann, nach dem kopieren, eine Fehlermeldung aus, weil er nicht ausgeführt werden kann.
Besteht die Möglichkeit, die Tabelle 15 ohne den Code-Anteil zu kopieren? Also einfach nur das Blatt? Ich habe bereits versucht, "values" an verschiedene Stellen im o.g. fetten Codeauszug zu setzen, das hat aber nicht funktioniert.
Beste Grüße erneut!
Hendrik
Anzeige
AW: Run-Macro-in-protected-Project
07.09.2021 13:41:34
Nepumuk
Hallo Hendrik,
so besser?

Option Explicit
Public Sub Bereich_importieren()
Const FOLDER_PATH As String = "C:\meinpfad\Test\"
Dim strFileName As String
Dim objWorksheet As Worksheet
Dim objWorkbook As Workbook
Application.ScreenUpdating = False
strFileName = Dir$(FOLDER_PATH & "*.xls*")
Do Until strFileName = ""
Set objWorkbook = Workbooks.Open(FOLDER_PATH & strFileName)
Set objWorksheet = Workbooks("Gesamtdatei").Worksheets.Add( _
After:=Worksheets(Workbooks("Gesamtdatei").Worksheets.Count))
Call objWorkbook.Worksheets("Name der Tabelle15").Cells.Copy( _
Destination:=objWorksheet.Cells(1, 1))
Call objWorkbook.Close(SaveChanges:=False)
strFileName = Dir$
Loop
Set objWorkbook = Nothing
Application.ScreenUpdating = True
End Sub
Gruß
Nepumuk
Anzeige
AW: Run-Macro-in-protected-Project
07.09.2021 18:36:04
Hendrik
WTF NEPUMUK.
Okay. Ich fasse das mal eben zusammen.
1. Du antwortest MIT EINER LÖSUNG nach 15 Minuten. Das ist ein Forum, ich habe mit einer Antwort heute Abend (oder gar erst morgen) gerechnet.
2. DAS DING LÄUFT AUCH NOCH WIE WARMES MESSER DURCH BUTTER.
WTF? Das ist so smooth. Dieser Block hier ist so elegant, er muss nicht mehr ewig rattern, um erst alle Blätter einzublenden:
Set objWorksheet = Workbooks("Gesamtdatei").Worksheets.Add( _
After:=Worksheets(Workbooks("Gesamtdatei").Worksheets.Count))
Call objWorkbook.Worksheets("Name der Tabelle15").Cells.Copy( _
Destination:=objWorksheet.Cells(1, 1))


Danke, Nepumuk. Ehrlich.
Hammer.
Danke auch an Thorsten und Luc, ich habe mich sehr gefreut, wie ihr alle mir helfen wolltet!
Beste Grüße!
Hendrik
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige