Makro durch nicht gespeich. Dokument laufen lassen

Hallo Leute,

ich habe mir in VBA ein Excel-Makro gebastelt (hätte ich ins Excel-Forum posten müssen?), das aus einer elend langen Tabelle (A) automatisch mehrere Pivot-Tabellen erstellt.

Das Problem ist nicht groß, aber für mich als relativer Anfänger schwierig zu erklären:

Ich möchte, dass ein neues Tabelle (B) geöffnet wird, dann wird die A geöffnet, alle belegten Zellen markiert und in die Zwischenablage kopiert. Dann soll diese Zwischenablage in B kopiert werden.

Wie selektiere ich nun wieder elegant die (neue und ungespeicherte) Tabelle B?
Sie wird ja dann Mappe.xls genannt. Der Code zum aktivieren des Arbeitsblatts sähe dann wie folgt aus:

Windows("Mappe.xls").Activate

Aber wenn ein anderer Nutzer zufällig schon ein ungespeichertes Dokument geöffnet hat, heisst sie bei ihm Mappe01 o.ä. und ich bekomme nen Runtime Error.

Ich hab es jetzt erstmal so gelöst, dass ich die Tabelle B mit einem Dummynamen speichere und sie dann im Code so auswähle:

Windows(".xls").Activate

Aber dann wird der Nutzer beim Schließen nur gefragt, ob er die Datei speichern möchte oder nicht. Er weiß aber nicht mal, wo sie liegt und findet sie nicht oder nur mit Glück. Ich würde gern, dass nach dem Klicken auf „Ja“ der selbe Dialog aufgeht, als ob man ne ungespeicherte Datei schließt. Also dass der Nutzer dann noch mal explizit Pfad und Dateiname angeben muss.

Wenn es irgendwie möglich ist, ohne die Dummydatei auszukommen, wär das super!

Hallo Micha,

Wie selektiere ich nun wieder elegant die (neue und
ungespeicherte) Tabelle B?

vor dem Wechseln in Tabelle A
neuer_name = activeworkbook.name
zum Wechseln in Tablle B
workbooks(neuer_name).activate

zum schließen ohne speichern:
workbooks(neuer_name).close (false)
zum schließen mit speichern:
workbooks(neuer_name).close (true)

Wenn du ohne die Datei auskommen willst, leg doch ein neues Register an:

'Aktsheetname Name des Registers, Create = True erzeugen, ansonsten wird es nur gelöscht
Public Sub Register_erzeugen(Aktsheetname As String, create As Boolean)

On Error Resume Next
Err.Clear
Worksheets([Aktsheetname]).Activate
'Wenn Register vorhanden ist, wird es gelöscht
If Err.Number = 0 Then
'kein nerviges Popup: Wollen Sie wirklich löschen?
Application.DisplayAlerts = False
'Register wird gelöscht.
Worksheets([Aktsheetname]).Delete
'Popup wird wieder angeschaltet.
Application.DisplayAlerts = True
End If

Err.Clear
If create=True Then
'Register wird erzeugt
Worksheets.Add
'Bei Problemen gibt es eine Fehlermeldung
If Err.Number 0 Then
MsgBox [Err.Description]
Stop
End If
'Register wird benannt.
ActiveSheet.Name = [Aktsheetname]
End If
End Sub

Ich hoffe es hilft!

Noch ein Tipp: Ich arbeite nur noch mit Workbooks, da mit Windows bei meinen Kollegen häufig Probleme aufgetreten sind. VBA ist manchmal komisch! Bei Workbooks darf man das „.xls“ nicht vergessen.

Workbooks(Pfad & „“ & „Beispiel.xls“).open
workbooks(„Beispiel.xls“).activate

Schönen Gruß,
Thorsten

Hi Thorsten

Äh, ich versteh nur Bahnhof und werde wohl bei meiner Dummy-Lösung bleiben. Aber trotzdem vielen Dank für den prompten Hilfsversuch!

Hi Micha,

ich habe mir in VBA ein Excel-Makro gebastelt (hätte ich ins
Excel-Forum posten müssen?), das aus einer elend langen
Tabelle (A) automatisch mehrere Pivot-Tabellen erstellt.

poste bitte den Code und benutze dabei den Pre-Tag. Und wo steht der Code, in der Arbeitsmappe A oder in personl.xls?

Das Problem ist nicht groß, aber für mich als relativer
Anfänger schwierig zu erklären:

Könnte was dransein, da ich die Erklärung kaum kapiere, aber kann logo auch an mir liegen :smile:)

Ich möchte, dass ein neues Tabelle (B) geöffnet wird, dann
wird die A geöffnet, alle belegten Zellen markiert und in die
Zwischenablage kopiert. Dann soll diese Zwischenablage in B
kopiert werden.

Nachfrage, mit B ist eine Arbeitsmappe also eine neue xls-Datei gemeint1?

Wie selektiere ich nun wieder elegant die (neue und
ungespeicherte) Tabelle B?
Sie wird ja dann Mappe.xls genannt. Der Code zum aktivieren
des Arbeitsblatts sähe dann wie folgt aus:

Eine Exceldatei entspricht einer Arbeitsmappe, die enthält Tabellenblätter auf/in denen sich Tabellen befinden können.

Windows(„Mappe.xls“).Activate

Wie der Vorredner ziehe ich die Ansprache einer Arbeitsmappe über Workbooks der Ansprache über Windows vor.
In dem Moment wo du eine neue leere Arbeitsmappe erstellst, durch Workbooks.Add, ist sie die aktive Arbeitsmappe und du kannst sie durch ActiveWorkbook.Name benennen.
Den Dialog zur Namens- und Pfadvergabe kannst du durch „Dialogs“ öffnen, wie er nun genau heißt weiß ich nicht auswendig.
Ich habe hier kein Vba, probiere mal sowas:

For each D in Application.Dialogs
 D.Show
 Msgbox D.Name 
Next D

Wenns nicht klappt melde dich nochmal hier.

Aber wenn ein anderer Nutzer zufällig schon ein
ungespeichertes Dokument geöffnet hat, heisst sie bei ihm
Mappe01 o.ä. und ich bekomme nen Runtime Error.

Verstehe ich nicht, wenn er schon eine ungespeicherte Mappe1 oder eine gespeicherte Mappe1.xls hat warum soll dann ein Fehler kommen bei
Windows(„Mappe.xls“).Activate
Der kommt doch dann wenn es keine geöffnete Mappe.xls gibt und da spielt es doch keine Rolle wieviele ateien der User offen hat.

Ich hab es jetzt erstmal so gelöst, dass ich die Tabelle B mit
einem Dummynamen speichere und sie dann im Code so auswähle:

Windows(".xls").Activate

Aber dann wird der Nutzer beim Schließen nur gefragt, ob er
die Datei speichern möchte oder nicht. Er
weiß aber nicht mal, wo sie liegt und findet sie nicht oder
nur mit Glück. Ich würde gern, dass nach dem Klicken auf „Ja“
der selbe Dialog aufgeht, als ob man ne ungespeicherte Datei
schließt. Also dass der Nutzer dann noch mal explizit Pfad und
Dateiname angeben muss.
Wenn es irgendwie möglich ist, ohne die Dummydatei
auszukommen, wär das super!

Anstatt die Datei per Vba als „Dummyname.xls“ abzuspeichern müßtest du an diesem Programmpunkt den Speicherdialog aufrufen.
Gruß
Reinhard

Hi Thorsten

Äh, ich versteh nur Bahnhof und werde wohl bei meiner
Dummy-Lösung bleiben. Aber trotzdem vielen Dank für den
prompten Hilfsversuch!

Hallo Micha!

Okay, dann wollen wir mal den Bahnhof abreißen! :smile:

Befehl zum Zwischenspeichern des Namens der Datei
VBA-Code:
'Variablendefinition
dim neuer_name as string 'oder wie auch immer du die Variable nennen willst.
dim register as string

'Variablendeklaration
neuer_name=activeworkbook.name 'speichert den Name der aktivierten Excel-Datei (in deinem Fall die Tabelle B) in die Variable
register=activesheet.name 'würde den Namen des Registers speichern, brauchst du aber wahrscheinlich eher nicht.

workbooks(„Tabelle A“).activate 'zum Aktivieren der Tabelle A

selection.copy 'dein Code

workbooks(neuer_name).activate 'Aktivieren des Tabelle B
…paste 'weiß nicht auswendig wie der Befehl zum Einfügen ist.

Soweit zu deinem angesprochenen Problem. Kannst du im übrigen 1:1 in VBA übernehmen, da die Kommentare auch als solche gekennzeichnet sind, dieses Hochkomma zeigt VBA, dass dies ein Kommentar ist.

Wenn du ohne die Dummydatei auskommen willst hatte ich ein fertiges Makro reinkopiert:
VBA-Code:
Public Sub Register_erzeugen(Aktsheetname As String, create As Boolean)
On Error Resume Next
Err.Clear
Worksheets([Aktsheetname]).Activate
If Err.Number = 0 Then
Application.DisplayAlerts = False
Worksheets([Aktsheetname]).Delete
Application.DisplayAlerts = True
End If
Err.Clear
If create=True Then
'Register wird erzeugt
Worksheets.Add
If Err.Number 0 Then
MsgBox [Err.Description]
Stop
End If
ActiveSheet.Name = [Aktsheetname]
End If
End Sub

Nämlich dieses, auch das kannst du 1:1 übernehmen, einfach unter dein bisheriges Makro kopieren. Zum Aufrufen:

Call Register_erzeugen(„Dummy_Register“, True) 'erzeugt ein Register mit dem Namen „Dummy_Register“
call Register_erzeugen(„Dummy_Register“, False) 'löscht das Register wieder

Ein Fehler hatte ich in meinem Posting:
Der Befehl zum öffnen einer Datei bei Workbooks ist:
Workbooks.Open Filename:=[Pfad] & [Datei] 'Pfad enthält dabei logischerweise den Pfad und Datei den Namen der Datei.

Anmerkung: Den Pfad kann man schön so auslesen:
Pfad = activeworkbook.path & „“

Wenn du eine Datei schließen willst und alle Veränderungen verwerfen, kannst du folgenden Befehl nutzen:
ActiveWorkbook.close (false)

Wenn du die Änderungen speichern willst
activeworkbook.close (true)

'allgemein Abspeichern
workbooks.SaveAs Filename:=[Pfad] & [Datei]

Wenn’s immer noch nicht hilft, darfst du gerne noch mal fragen.

Schönen Gruß Thorsten

hey Thorsten,

jetzt blick ich schon viel besser durch. Mein grober Fehler war, dass ich die Variable, die du neuer_name nennst, als Typ Workbook definiert habe. Aber die Eigenschaft „Name“ eines Workbooks ist und bleibt natürlich nur ein String.

Ich werde jetzt noch ein wenig tüfteln. Denn das Makro macht eigentlich schon alles, was es soll, nur dass auch alles fix im Code vorgegeben ist und der Nutzer nur den roten Knopf drücken kann. Jetzt bastel ich noch ein paar Auswahlmöglichkeiten und eine ansprechende Oberfläche, und ersetze dann Stück für Stück des Codes durch Interaktionsmöglichkeiten. Herrlich! Ich hab hier auch so ein „Excel-VBA in 14 Tagen“-Buch rumliegen, was mir in Bezug auf Userforms, Dialoge und Fehlerabfangen gut weiterhilft.

Danke erstmal und bei der nächsten größeren Verwerfung kann ich mein Problem vielleicht schon etwas genauer schildern.

ciao,
Micha