Dateinamen in Makro übernehmen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Dateinamen in Makro übernehmen
von: Maik Ludat
Geschrieben am: 02.12.2015 08:02:25

Hallo liebe User,
heute mal ein neues Problemchen ;)
ich habe ein Makro welches mir über einen Dateidialog eine zweite Datei öffnet und aus dieser Daten in die geöffnete Datei kopiert. Dies funktioniert auch reibungslos solange es die beiden Dateinamen im Makro auch gibt. Hier mal der Code:


Sub DateiÖffnenMitFehlerroutine()
Dim Dateiauswahl As Variant
erneut:
    Dateiauswahl = Application.GetOpenFilename
        If Dateiauswahl <> False Then
        Workbooks.Open Filename:=Dateiauswahl
        Else
            If MsgBox("Es wurde keine Datei ausgewählt. Klicken Sie 'OK' um eine Datei auszuwä _
hlen, oder 'Abbrechen' um den Vorgang abzubrechen und das Makro zu beenden.", (vbOKCancel)) = vbOK Then
            GoTo erneut
            Else
            Exit Sub
            End If
        End If
    Windows("Schichten.xlsx").Activate
    Columns("A:BA").Select
    Selection.Copy
    Windows("Arbeitszeit Maik.xlsm").Activate
    Range("JF1").Select
    ActiveSheet.Paste
    Range("JH1").Select
End Sub

1. Problem:
Der Dateiname "Schichten" ist von mir vorgegeben und soll auch so verwendet werden. Es wäre nur schön wenn eine andere (falsche) Datei geöffnet wurde nicht das Makro mit einer Fehlermeldung abbricht sondern eine Msg-Box aufpoppt die wieder zum Punkt "erneut:" oder zum Makroende springt. Also müsste der Code den Namen der geöffneten Datei mit dem Namen im Makro (hier "Schichten.xlsx") vergleichen.
2. Problem:
Aus der Datei "Arbeitszeit Maik.xlsm" wird das Makro gestartet. Nun möchte ich aber das sich dieser Eintrag je nach vergebenen Dateinamen automatisch aktualisiert, denn ich habe mehrere Kollegen welche sich diese Arbeitsmappe unter anderen Namen abspeichern.
Vielen Dank für Eure Bemühungen.
LG Maik

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Rudi Maintaire
Geschrieben am: 02.12.2015 09:34:27
Hallo,

Sub DateiÖffnenMitFehlerroutine()
  
  Dim Dateiauswahl As Variant, wkb As Workbook
  
erneut:
  Dateiauswahl = Application.GetOpenFilename
  If Dateiauswahl <> False Then
    Set wkb = Workbooks.Open(Filename:=Dateiauswahl)
  Else
    If MsgBox("Es wurde keine Datei ausgewählt. " _
      & "Klicken Sie 'OK' um eine Datei auszuwählen oder 'Abbrechen' " _
        & "um den Vorgang abzubrechen und das Makro zu beenden.", (vbOKCancel)) = vbOK Then
      GoTo erneut
    Else
      Exit Sub
    End If
  End If
  wkb.ActiveSheet.Columns("A:BA").Copy _
    ThisWorkbook.ActiveSheet.Range("JF1")
End Sub
Gruß
Rudi

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Maik Ludat
Geschrieben am: 02.12.2015 17:49:15
Hallo Rudi,
vielen Dank erst einmal, aber leider ist das erste Problem nicht gelöst.
zu 1.
Nun wird die im Dialog geöffnete Datei OHNE PRÜFUNG des Dateinamens verwendet. Diese Prüfung ist aber zwingend notwendig da die Daten ausschließlich in der Datei "Schichten.xlsx" stehen. Bei deiner Änderung kann man aber auch eine Datei z.B. mit dem Namen "Orte.xlsx" öffnen und das Makro wird bis zum Ende ausgeführt.
Gruß Maik

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Michael
Geschrieben am: 03.12.2015 01:01:57
Hi zusammen,
warum überhaupt einen Dialog zum Öffnen, wenn es nur *eine* feste Datei gibt?
Ein unbedarfter Anwender kriegt die Krise, wenn er in einer Endlosschleife hängt und nicht weiß, was er nun öffnen soll...

Sub AusSchichtenKopieren()
  
  Dim wkb As Workbook
  Set wkb = Workbooks.Open(Filename:="C:\Pfad\Schichten.xlsx")
  wkb.ActiveSheet.Columns("A:BA").Copy _
    ThisWorkbook.ActiveSheet.Range("JF1")
  wkb.close SaveChanges:=False
End Sub
Schöne Grüße,
Michael

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Maik Ludat
Geschrieben am: 03.12.2015 13:28:42
Hallo Michael,
danke für die Antwort, naja, die "feste" Datei bezieht sich nur auf dem Namen der Datei, nicht aber den Speicherort da ich die Datei zum Download anbiete und nicht weiß wo der Anwender diese abspeichert. Deshalb ist der Dialog notwendig, der Anwender kennt aber den Namen der Datei. Ich möchte trotzdem das versehentliche öffnen einer anderen Datei ausschließen. Dies hätte dann ungeahnte Auswirkungen beim anschließenden Kopiervorgang ;)
Was ich erreichen möchte ist das der Dateiname überprüft wird. Ich lege den Namen im Makro fest, nur der Pfad müsste nach dem öffnen übernommen werden.
Set wkb = Workbooks.Open(Filename:="C:\Pfad\Schichten.xlsx")
Hier bleibt dein Code stehen weil der Pfad zur Datei "Schichten.xlsx" nicht stimmt da dieser sich verändert. Und wenn ich eine andere Datei öffne bricht das Makro mit einer Fehlermeldung ab. An dieser Stelle sollte aber eine Msg-Box kommen mit der Auswahl zum erneuten öffnen der richtigen Datei oder Abbruch des Vorganges.
LG Maik

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Maik Ludat
Geschrieben am: 03.12.2015 13:30:11
sorry, hatte vergessen als nicht gelöst zu markieren :)

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Michael
Geschrieben am: 03.12.2015 17:01:53
Hallo Maik,
na wenn das so ist...
Ich habe solche Sachen in meinen eigenen Datein so gelöst: es gibt einen Button, der quasi der grundsätzlichen Konfiguration des Programms dient, d.h. zunächst wird der Pfad zur gewünschten Datei ermittel und (auch für den Anwender sichtbar) in Excel gespeichert.
Die eigentliche Kopieraktion wird dann mit dem einmal als "Konfiguration" gespeichertem Pfad+Namen ausgeführt.
Ich meine, jedes Programm ermittelt oder definiert erst Mal irgendwelche Pfade zu den beteiligten Datein, siehe z.B. Excel:
Userbild
Schöne Grüße,
Michael

Bild

Betrifft: AW: Dateinamen in Makro übernehmen
von: Maik Ludat
Geschrieben am: 03.12.2015 19:30:54
Hallo Michael,
das stimmt ja alles so lang es meinen Rechner betrifft, aber ich kenne doch nicht die Ordnerstruktur meiner Kollegen, deshalb sollte der Pfad zur Datei ausgelesen werden
LG Maik

Bild

Betrifft: ja, richtig,
von: Michael
Geschrieben am: 03.12.2015 21:29:21
Maik,
aber doch nur *einmal*, nicht jedesmal, wenn er das Programm benutzt.
D.h. er bekommt die Kopie von Dir, und als allererstes klickt er den Button "konfigurieren", wo er sich den Pfad zusammensucht, und dann ist er wo auch immer gespeichert und ändert sich ja nicht laufend.
Das könnte man zur Not noch abfragen: if dir (pfad&datei)="" then abfragen else kopieren.
Verstehst, wie ich mein?
LG Michael

Bild

Betrifft: AW: ja, richtig,
von: Maik Ludat
Geschrieben am: 03.12.2015 22:21:55
Hallo,
in einem Einzelfall mag das stimmen, jedoch kommt es im Jahr bis zu 7 mal vor das ich eine aktualisierte Datei anbiete. Ich wollte nur hier nicht alles noch komplizierter machen. Ich wollte dann den Code für die Dateien abändern und per Button die jeweiligen Dateien kontrolliert in die Arbeitsdatei einkopieren. Es gibt also ein Tabellenblatt mit 7 Bereichen in die eine bestimmte Datei kopiert werden soll ( Schichten 1 ; Schichten 2 ; usw ). Für mich am einfachsten wäre das nach dem auswählen der Datei im Makro der geöffnete Dateiname mit einem im Makro festgelegten (weil von mir vergeben) Dateinamen verglichen wird und nur bei Übereinstimmung kopiert wird. Und wenn der Name nicht übereinstimmt soll eine Msg-Box aufgehen.
Ich glaub ich kann mich nicht so gut ausdrücken, hoffe aber du verstehst jetzt.
LG Maik

Bild

Betrifft: ein Versuch
von: Michael
Geschrieben am: 04.12.2015 00:03:17
Hi Maik,
ich habe Rudis Schnipsel etwas erweitert, teste bitte mal:

Option Explicit
Sub DateiÖffnenMitFehlerroutine()
Dim Dateiauswahl As Variant, wkb As Workbook
Dim test As String
erneut:
  Dateiauswahl = Application.GetOpenFilename("Excel-Datein (*.xlsx), *.xlsx")
  If Dateiauswahl <> False Then
    test = Mid(Dateiauswahl, InStrRev(Dateiauswahl, "\") + 1)
    If InStr(1, test, "Schichten", vbTextCompare) > 0 Then
      Set wkb = Workbooks.Open(Filename:=Dateiauswahl)
      wkb.ActiveSheet.Columns("A:BA").Copy _
      ThisWorkbook.ActiveSheet.Range("JF1")
      wkb.Close
     Else
    If MsgBox("Bitte suchen Sie nach der Datei: Schichten*.xlsx" & vbLf _
      & "Klicken Sie 'OK' um eine Datei auszuwählen oder 'Abbrechen' " _
        & "um den Vorgang abzubrechen und das Makro zu beenden.", (vbOKCancel)) = vbOK Then
       GoTo erneut
     Else
       Exit Sub
    End If
     
    End If
  Else
    If MsgBox("Es wurde keine Datei ausgewählt. " & vbLf _
      & "Klicken Sie 'OK' um eine Datei auszuwählen oder 'Abbrechen' " _
        & "um den Vorgang abzubrechen und das Makro zu beenden.", (vbOKCancel)) = vbOK Then
       GoTo erneut
     Else
       Exit Sub
    End If
  End If
End Sub
LG,
Michael

Bild

Betrifft: AW: ein Versuch
von: Maik Ludat
Geschrieben am: 04.12.2015 11:03:51
Hallo,
WWWOOOOOWWWW, Suupiii !!!

jetzt funktioniert es so wie ich es mir vorgestellt habe. Das hätte ich mit meinen "Makrorecorderkenntnissen" niemals hinbekommen.
Vielen Dank an alle.
Eine Kleinigkeit noch, wbk.close wird mit einer Frage nach speichern der Datei "Schichten" beendet, kann man diese Abfrage noch umgehen? Es soll definitiv nicht gespeichert werden. Das ist aber nur noch das Bonbon ;)
LG Maik

Bild

Betrifft: freut mich erst Mal, und: klar doch!
von: Michael
Geschrieben am: 04.12.2015 11:45:18
Hallo Maik,
Du kannst ja mal die Hilfe zum .Close recherchieren; es gibt hier z.B. die Möglichkeit, zusätzlich Parameter anzugeben wie z.B. den hier:

wkb.Close SaveChanges:=False
Weiterhin gibt es das display alerts, nachzulesen etwa hier:
http://www.online-excel.de/excel/singsel_vba.php?f=129
Kannst ja mal ein bißchen herumprobieren...
Happy Exceling,
Michael

Bild

Betrifft: AW: freut mich erst Mal, und: klar doch!
von: Maik Ludat
Geschrieben am: 04.12.2015 13:13:57
na denn
ein besinnliches Weihnachten und Dank an alle für dieses tolle Forum :)
LG Maik

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Dateinamen in Makro übernehmen"