PDA

Vollständige Version anzeigen : Name der Arbeitsmappe in Makro


Schruppi
04.04.2012, 14:29
Guten Tag

Ich habe diese Anfrage schon vor einiger Zeit in der Schweiz in ein Forum gestellt, aber gar keine Anfrage erhalten. Jetzt hoffe ich natürlich, dass ich hier mehr Glück habe ;)

Ich möchte gerne in folgendem Makro (ist nur ein Auszug)

Private Sub auto_open()
Sheets("Vertretungen").Visible = True
Sheets("Vertretungen").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
ChDir _
"C:\Daten\Maschinenlaufkarten"
Workbooks.Open Filename:= _
"C:\Daten\Maschinenlaufkarten\Vertretungen.xlsx"
Range("A2").Select
Range("A1:A50").Select
Selection.Copy
Windows("Maschine_1.xlsx").Activate
Sheets("Vertretungen").Select
ActiveSheet.Paste
ActiveWindow.SelectedSheets.Visible = False
Windows("Vertretungen.xlsx").Activate
Range("A1").Select
ActiveWindow.Close
Windows("Maschine_1.xlsx").Activate

einen weiteren Befehl einfügen, der mir den Namen der Arbeitsmappe in dieses Makro schreibt.

Der Hintergrund ist der, dass der User diese Arbeitsmappe (schreibgeschützt ohne Passwort) mit dem Namen "Maschine_1.xlsx" öffnen und ausfüllen soll. Danach soll er diese Arbeitsmappe zum Beispiel unter dem Namen "Maschine_2.xlsx" abspeichern und schliessen. Die Original-Datei bleibt also ohne Änderungen erhalten. Der Name der neuen Arbeitsmappe (Maschine_2.xlsx) soll dann entweder beim Speichern, beim Schliessen oder beim Öffnen in das Makro hineingeschrieben werden, damit das Makro auch mit geändertem Arbeitsmappen-Namen ohne Störung ablaufen kann.

Hat jemand eine Idee, wie ein solcher Befehl aussehen könnte??

Vielen herzlichen Dank im Voraus und allen einen wunderschönen Feierabend ! ! !

Ruppi

DeBabba
04.04.2012, 14:38
hi Ruppi
habe mal ein paar Dateiinfos in variablen geschrieben und schau mal was Du hier verwenden kannst
Sub kutan()
a = ActiveWorkbook.FullName
b = ActiveWorkbook.Name
c = ActiveWorkbook.Path
' zum Speichern einfach noch was dranhängen
NeuerdateiName = "\2-" & b
ActiveWorkbook.SaveAs c & NeuerdateiName
End Sub

Probier das halt mal aus Du kannst hier einen ganz neuen Pfad und Dateinamen kreeiren.
Ach ja.... wenn Die Datei Makros enthält ist die Endung XLSM

Gruß
DeBabba

haklesoft
04.04.2012, 14:47
Hallo Ruppi,

mit Workbooks(1).Name bekommst Du den Dateinamen der ersten Arbeitsmappe.
Falls Du es inklusive Speicherort wissen willst, hilft Dir Workbooks(1).FullName.

Ansonsten klingt Deine Beschreibung eher nach dem typischen Einsatz einer Vorlage und dem daraus entstehenden ExcelFile, dass der Anwender unter beliebigem Namen speichern kann ohne Einfluss auf die Vorlage zu nehmen.

Hang loose, haklesoft

Schruppi
05.04.2012, 08:29
Guten Morgen

Erst mal vielen Dank für die Hilfe! Aber entweder ist es noch zu früh oder ich bin gedanklich schon zu tief im Osterwochenende oder ich stehe mal wieder völlig auf dem Schlauch. Ich muss dazu auch sagen, dass ich von Makros nur wenig Ahnung habe :(

Ich habe also versucht, das Makro von DeBabba irgendwo unterzubringen, ohne Erfolg.

Dann habe ich versucht, den Dateinamen unter ""Windows("Maschine_1.xlsm").Activate"" durch "Windows(ActiveWorkbook.Name).Activate" oder durch "Windows(ActiveWorkbook.FullName).Activate" zu ersetzen, was aber auch nicht gefällt, d.h. es ergibt einen "Laufzeitfehler 1004: Die Arbeitsmappe muss mindestens ein sichtbares Arbeitsblatt enthalten. Um das ausgewählte Blatt (oder Blätter) auszublenden, zu löschen oder zu verschieben, müssen Sie zuerst ein neues Blatt einfügen oder ein ausgeblendetes Blatt wieder einblenden." bei ""ActiveWindow.SelectedSheets.Visible = False"".

Am liebsten wäre es mir eigentlich schon, wenn ich den Dateinamen unter ""Windows("Maschine_1.xlsm").Activate"" generell durch etwas wie "ActiveWorkbook.Name" ersetzen könnte. Dann ist es doch egal, wie die Arbeitsmappe heisst, oder? Aber dann scheint das mit dem ein- und ausblenden von Vertretungen.xlsx nicht mehr zu funktionieren.

Hilfe!! Kann mir jemand sagen, was ich wo hinschreiben muss, damit das läuft???????

Vielen herzlichen Dank im Voraus!!!
Ruppi

Schruppi
10.04.2012, 14:47
Einen wunderschönen guten Nachmittag

Hat denn niemand eine Idee? Keinen "nachösterlichen" Einfall? Oder eine Eingebung?

Würde mich wirklich sehr freuen!!

Gruess
Ruppi

EarlFred
10.04.2012, 15:21
Hallo Ruppi,

dass ich von Makros nur wenig Ahnung habe
dann fang an, das zu ändern ;) Lerne als erstes, dass Du Select und Activate NIE!!! wieder benutzt und Dir stattdessen mal den Link "Makrorekorder-Code entschlacken" in meiner Signatur durchliest.

Der Code könnte dann so aussehen:
Option Explicit

Private Sub Workbook_Open()
Dim wb2 As Workbook 'Das Workbook, das geöffnet wird

With ThisWorkbook.Worksheets("Vertretungen")
.Visible = True
.Cells.ClearContents
End With

Set wb2 = Workbooks.Open(Filename:="C:\Daten\Maschinenlaufkarten\Vertretungen.xlsx")

With wb2
.Worksheets("Name?????" / Nummer).Range("A1:A50").Copy _
Destination:=ThisWorkbook.Worksheets("Vertretungen").Range("A1:A50")

.Close savechanges:=False '/ True : Ändeerungen speichern?
End With

Set wb2 = Nothing

End Sub

Den Namen brauchst Du nicht zu wissen, Du brauchst nur das Objekt selbst - was einfacher herauszufinden ist und besser nutzbar:
ThisWorkbook - das Workbook, in dem der Code selbst steht
ActiveWorkbook - das zum Zeitpunkt des Durchlaufs dieser Zeile aktive Workbook - das ist also veränderbar!
Workbooks, die Du während der Codeausführung erst öffnest, schreibst Du in eine Variable und nutzt diese Variable. Gleiches auch bei "ActiveWorkbook", da im Codeverlauf (auch ohne "Activate") veränderbar.

Grüße
EarlFred

Schruppi
11.04.2012, 15:58
Hallo EarlFred

Erstmal vielen Dank für Deine Antwort und auch für Deinen Link. Sehr interessant. Ich denke, ich habe einiges daraus gelernt. Danke!!

Wenn ich Deinen Code richtig verstanden habe, schreibt er die zu öffnende Arbeitsmappe (Maschine-1.xlsm) in die Variable wb2 und macht danach das unsichtbare Register "Vertretungen" sichtbar.

Danach sollte die Arbeitsmappe "Vertretungen.xlsx" geöffnet und deren Inhalt in das Register "Vertretungen" der Arbeitsmappe "Maschine-1.xlsm" geschrieben werden. Die Arbeitsmappe "Vertretungen.xlsx" wird danach ohne speichern wieder geschlossen und das Register "Vertretungen" in der Arbeitsmappe "Maschine-1.xlsm" wieder auf unsichtbar gestellt. Das wäre soweit schön, nur macht Excel bei mir überhaupt nichts.

Wie kann ich dann den Namen der Arbeitsmappe, wie auch immer der lautet, in die Variable wb2 schreiben??

Oder kann ich das Register direkt "ansprechen"??

Danke, vielen Dank im Voraus!!
Und einen wunderschönenen Feierabend! Ich gehe jetzt zum nächsten Job!
Ruppi

EarlFred
11.04.2012, 16:21
Hallo Ruppi,

Wenn ich Deinen Code richtig verstanden habe, schreibt er die zu öffnende Arbeitsmappe (Maschine-1.xlsm) in die Variable wb2
Nein. Welche Codezeile sollte das Deiner Meinung nach tun?

Der Variable wb2 wird das Workbook "Vertretungen.xlsx" zugewiesen:
Set wb2 = Workbooks.Open(Filename:="C:\Daten\Maschinenlaufkarten\Vertretungen.xlsx")

Nochmal (ich weiß, ich nicht leicht zu verstehen):
Wie kann ich dann den Namen der Arbeitsmappe, wie auch immer der lautet, in die Variable wb2 schreiben??
Der Variable wb2 wird KEIN NAME zugewiesen, sondern die Mappe selbst!
wb2 ist vom Typ Workbook - also eine Arbeitsmappe.

Ich bin davon ausgegangen, dass die Mappe "Maschine-1.xlsm" gleichzeitig die Mappe ist, in der auch der Code steht - dann wäre dies ThisWorkbook.
Muss die Mappe allerdings auch erst geöffnet werden, dann mach es analog zu dieser Zeile:
Dim wb1 as Workbook
Set wb1 = Workbooks.Open(Filename:="C:\usw.....\Maschine-1.xlsm")
Sprich die Mappe "Maschine-1.xlsm" dann über wb1 an.

Auch hier: Der Name der Mappe ist im weiteren Code völlig belanglos - allein das Objekt musst Du kennen. Veränderst Du den Code eines Tages (weil sich der Mappenname ändert, der Code auch für andere Mappen gelten soll, der Pfad geändert wird, was weiß ich....), dann musst Du nur einmal den neuen Pfad angeben - der Rest des Codes bliebe dann unverändert.

Grüße
EarlFred

Schruppi
13.04.2012, 12:40
Einen wunderschönen guten Nachmittag lieber EarlFred

Vielen herzlichen Dank für Deine Antwort und für Deine Bemühungen!!

Leider, leider bin ich wohl noch seeeeeeeehhhhhr weit von einem "anständigen" Makro entfernt :(

Aber trotzdem habe ich es so hinbekommen, dass es läuft und seinen Zweck erfüllt. Nur dank Deiner Hinweise, die mich erst auf die richtige Spur gebracht haben. Es sieht nun wie folgt aus:

Private Sub auto_open()
Sheets("Maschine1").Select
Sheets("Vertretungen").Visible = True
Sheets("Vertretungen").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
Workbooks.Open Filename:="C:\Daten\Maschinenlaufkarten\Vertretungen.xlsx"
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ActiveWindow.Close
Sheets("Vertretungen").Select
ActiveSheet.Paste
ActiveWindow.SelectedSheets.Visible = False
Range("H4:AW4").Select
End Sub

Aber bitte, bitte entschuldige, es enthält noch einige Selects und Activates!! Aber so habe ich es mit meinem geringen Wissen und mit der Aufzeichnungsfunktion hinbekommen - und bin fast ein bisschen stolz auf mich ;) Ich werde das Makro bei Gelegenheit gerne anhand Deiner Abhandlung überarbeiten und daraus lernen.

Ich danke Dir und allen anderen, die sich meines Problemes angenommen haben, von ganzem Herzen und wünsche Euch allen einen schönen Nachmittag und ein noch viel schöneres Wochenende!! Hoffentlich regnet es nicht dauernd . . .

Ruppi