Anzeige
Archiv - Navigation
496to500
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
496to500
496to500
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 14:49:40
Eleni
Hi Leute,
Habe mich heut schon mal damit ans Forum gewandt. Wer kann mir helfen? Habe eine automatische Speicherung beim Öffnen einer Excel-Datei programmiert:
SaveAs Left(ThisWorkbook.FullName, Len(ThisWorkbook.FullName) - 4) & "_" & Format(Date, "dd-mm-yy")
Jetzt will ich, dass eine zweite Excel-Datei per Makro auf die aktuellste Version der ersten Datei zugreift. Da sich aber der Name der ersten Datei immer um das aktuelle Datum verändert, funktioniert das Makro nicht. Wer kann mir helfen? Ist wircklich dringend.
Danke, Eleni

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
Wolfgang
Die Schleife durchläuft alle Dateien im angegebenen Pfad.
dim objFolder As Object, objFile as Object
Set objFolder = objFso.GetFolder(strPath)
For Each objFile In objFolder.Files
objFile.Name
...
Next
objFile.Name gibt dir den Namen, den kannst du dann mit den anderen vergleichen und den aktuellen suchen...
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 15:23:17
Eleni
Hi Wolfgang,
Danke fürs Antworten. Irgendwie steh ich auf dem Schaluch. Ich muss doch als objFile.name den Namen der Datei, also z.B. "Datenerfassung.xls" eingeben und ihn dann mit den anderen (die z.B. "Datenerfassung_12-10-04.xls" heißen) am selben Ort vergleichen, oder? Irgendwie klappt es nicht.
Eleni
Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
Wolfgang
Ich hab leider auch noch was vergessen

Sub a()
Dim objFolder As Object, objFile As Object, objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder("C:\Temp")
For Each objFile In objFolder.Files
MsgBox objFile.Name
Next
End Sub

Das bringt dir alle Dateien im Ordner C:\Temp.
Du kannst nun die Namen untersuchen und so über das Datum im Dateinamen den Namen der neuesten Datei rausfinden.
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 16:07:30
Eleni
Hi Wolfgang,
Danke, für den Code. Hat ein wenig weitergeholfen. Die MsgBox ist ok, aber so muss ich doch jedesmal dem Makro den aktuellen Dateinamen, der in der MsgBox ausgegeben wird, manuell eingeben. Gibt es keine elegantere Lsg?
Eleni
Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 16:50:54
Nepumuk
Hallo Eleni,
das Problem ist das Datum im Dateinamen, das muss erst herausgefiltert werden um danach zu sortieren.


Option Explicit
Public Sub Eleni()
    Dim strArray() As String, intIndex As Integer
    With Application.FileSearch
        .Filename = "Datenerfassung*"
        .FileType = msoFileTypeExcelWorkbooks
        .LookIn = "D:\Eigene Dateien\Testordner" 'hier den Pfad anpassen!!
        If .Execute > 0 Then
            ReDim strArray(1 To .FoundFiles.Count, 1 To 2)
            For intIndex = 1 To .FoundFiles.Count
                strArray(intIndex, 1) = .FoundFiles(intIndex)
                strArray(intIndex, 2) = Left$(StrReverse(Mid$(.FoundFiles(intIndex), InStrRev(.FoundFiles(intIndex), "\") + 1, Len(.FoundFiles(intIndex)) - InStrRev(.FoundFiles(intIndex), "\") - 4)), 8)
                strArray(intIndex, 2) = StrReverse(Right$(strArray(intIndex, 2), 2)) & "." & StrReverse(Mid$(strArray(intIndex, 2), 4, 2)) & "." & StrReverse(Left$(strArray(intIndex, 2), 2))
            Next
        End If
        Call sortieren(1, .FoundFiles.Count, strArray())
        Workbooks.Open strArray(1, 1)
    End With
End Sub
Private Sub sortieren(intUGrenze As Integer, intOGrenze As Integer, strArray() As String)
    Dim intIndex1 As Integer, intIndex2 As Integer, strElement1 As String, strElement2 As String, strSpeicher As String
    intIndex1 = intUGrenze
    intIndex2 = intOGrenze
    strSpeicher = strArray(Fix(intUGrenze + intOGrenze) / 2, 2)
    Do
        Do While CDate(strArray(intIndex1, 2)) > CDate(strSpeicher)
            intIndex1 = intIndex1 + 1
        Loop
        Do While CDate(strSpeicher) > CDate(strArray(intIndex2, 2))
            intIndex2 = intIndex2 - 1
        Loop
        If intIndex1 <= intIndex2 Then
            strElement1 = strArray(intIndex1, 1)
            strElement2 = strArray(intIndex1, 2)
            strArray(intIndex1, 1) = strArray(intIndex2, 1)
            strArray(intIndex1, 2) = strArray(intIndex2, 2)
            strArray(intIndex2, 1) = strElement1
            strArray(intIndex2, 2) = strElement2
            intIndex1 = intIndex1 + 1
            intIndex2 = intIndex2 - 1
        End If
    Loop Until intIndex1 > intIndex2
    If intUGrenze < intIndex2 Then Call sortieren(intUGrenze, intIndex2, strArray())
    If intIndex1 < intOGrenze Then Call sortieren(intIndex1, intOGrenze, strArray())
End Sub


Gruß
Nepumuk
Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 16:59:06
Eleni
Hi Nepomuk,
Erstmal Riesen-Dankeschön für die viele Mühe, bekomme aber in der markierten Zeile *** *** die Fehlermeldung "Index außerhalb des gültigen Bereichs". Was tun?
Danke, Eleni

Private Sub sortieren(intUGrenze As Integer, intOGrenze As Integer, strArray() As String)
Dim intIndex1 As Integer, intIndex2 As Integer, strElement1 As String, strElement2 As String, strSpeicher As String
intIndex1 = intUGrenze
intIndex2 = intOGrenze
*** strSpeicher = strArray(Fix(intUGrenze + intOGrenze) / 2, 2) ***
Do
Do While CDate(strArray(intIndex1, 2)) > CDate(strSpeicher)
intIndex1 = intIndex1 + 1
Loop
Do While CDate(strSpeicher) > CDate(strArray(intIndex2, 2))
intIndex2 = intIndex2 - 1
Loop
If intIndex1 <= intIndex2 Then
strElement1 = strArray(intIndex1, 1)
strElement2 = strArray(intIndex1, 2)
strArray(intIndex1, 1) = strArray(intIndex2, 1)
strArray(intIndex1, 2) = strArray(intIndex2, 2)
strArray(intIndex2, 1) = strElement1
strArray(intIndex2, 2) = strElement2
intIndex1 = intIndex1 + 1
intIndex2 = intIndex2 - 1
End If
Loop Until intIndex1 > intIndex2
If intUGrenze < intIndex2 Then Call sortieren(intUGrenze, intIndex2, strArray())
If intIndex1 < intOGrenze Then Call sortieren(intIndex1, intOGrenze, strArray())
End Sub

Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 17:07:07
Eleni
Hi Nepomuk,
Nach dem 2. Durchlaufen des Makros bekomme ich nun bei *** *** die Fehlermeldung "Typen unverträglich". Ich seh vor lauter Bäumen den Wald nicht mehr.
Danke, Eleni

Private Sub sortieren(intUGrenze As Integer, intOGrenze As Integer, strArray() As String)
Dim intIndex1 As Integer, intIndex2 As Integer, strElement1 As String, strElement2 As String, strSpeicher As String
intIndex1 = intUGrenze
intIndex2 = intOGrenze
strSpeicher = strArray(Fix(intUGrenze + intOGrenze) / 2, 2) ***
Do
*** Do While CDate(strArray(intIndex1, 2)) > CDate(strSpeicher) ***
intIndex1 = intIndex1 + 1
Loop
Do While CDate(strSpeicher) > CDate(strArray(intIndex2, 2))
intIndex2 = intIndex2 - 1
Loop
If intIndex1 <= intIndex2 Then
strElement1 = strArray(intIndex1, 1)
strElement2 = strArray(intIndex1, 2)
strArray(intIndex1, 1) = strArray(intIndex2, 1)
strArray(intIndex1, 2) = strArray(intIndex2, 2)
strArray(intIndex2, 1) = strElement1
strArray(intIndex2, 2) = strElement2
intIndex1 = intIndex1 + 1
intIndex2 = intIndex2 - 1
End If
Loop Until intIndex1 > intIndex2
If intUGrenze < intIndex2 Then Call sortieren(intUGrenze, intIndex2, strArray())
If intIndex1 < intOGrenze Then Call sortieren(intIndex1, intOGrenze, strArray())
End Sub

Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 17:21:41
Eleni
Hi Nepomuk,
Bin etwas ungeduldig, sorry. Mit "*Datenerfassung*" gehts. Aber nach dem 2. Durchlaufen des Makros bekomme ich nun bei *** *** die Fehlermeldung "Typen unverträglich".
Danke, Eleni

Private Sub sortieren(intUGrenze As Integer, intOGrenze As Integer, strArray() As String)
Dim intIndex1 As Integer, intIndex2 As Integer, strElement1 As String, strElement2 As String, strSpeicher As String
intIndex1 = intUGrenze
intIndex2 = intOGrenze
strSpeicher = strArray(Fix(intUGrenze + intOGrenze) / 2, 2) ***
Do
*** Do While CDate(strArray(intIndex1, 2)) > CDate(strSpeicher) ***
intIndex1 = intIndex1 + 1
Loop
Do While CDate(strSpeicher) > CDate(strArray(intIndex2, 2))
intIndex2 = intIndex2 - 1
Loop
If intIndex1 <= intIndex2 Then
strElement1 = strArray(intIndex1, 1)
strElement2 = strArray(intIndex1, 2)
strArray(intIndex1, 1) = strArray(intIndex2, 1)
strArray(intIndex1, 2) = strArray(intIndex2, 2)
strArray(intIndex2, 1) = strElement1
strArray(intIndex2, 2) = strElement2
intIndex1 = intIndex1 + 1
intIndex2 = intIndex2 - 1
End If
Loop Until intIndex1 > intIndex2
If intUGrenze < intIndex2 Then Call sortieren(intUGrenze, intIndex2, strArray())
If intIndex1 < intOGrenze Then Call sortieren(intIndex1, intOGrenze, strArray())
End Sub

Anzeige
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 17:28:45
Nepumuk
Hallo Eleni,
das wird schwierig, da ich nicht in deinen Ordner sehen kann. Nimm mal eine leere Excelmappe und lass darin folgendes Programm laufen. Lade diese Mappe mal auf den Server, dann komm ich schon dahinter.


Public Sub test()
    Dim intIndex As Integer
    With Application.FileSearch
        .Filename = "Datenerfassung*"
        .FileType = msoFileTypeExcelWorkbooks
        .LookIn = "D:\Eigene Dateien\Testordner" 'hier den Pfad anpassen!!
        .Execute
        For intIndex = 1 To .FoundFiles.Count
            Cells(intIndex, 1) = .FoundFiles(intIndex)
        Next
    End With
End Sub


Gruß
Nepumuk
Anzeige
AW: Nächste Fehlermeldung!
13.10.2004 08:32:33
Eleni
Hi Nepomuk,
Sorry, dass ich erst heute antworte, ging nicht anders. Habe den Fehler gefunden. Da ich vor lauter Bäumen den Wald nicht mehr sah, bemerkte ich nicht, dass ich im zu ändernden Pfad ein \ am Ende stehen ließ. Peinlich! Vielen Dank für deine Mühen.
Habe es nun in meine Mappe integriert und dem Makro gesagt, dass es sich den aktuellen Dateinamen in Tabelle1, letzte beschriftete Zelle in Spalte A holen kann. Aber in der letzten Zeile des unten aufgeführten Codes, kommt die "Index außerhalb des gültigen Bereichs"-Fehlermeldung. Fahre ich mit dem Cursor über "Windows(Name)", wird aber der richtige Dateiname angezeigt. Kommt die Fehlermeldung evtl. weil der Name der zu aktivierende Datei den kompletten Pfad mit Laufwerksangabe übernimmt? Für deine bisherige Hilfe bin ich dir überaus dankbar.
Eleni
ActiveWorkbook.Sheets("Tabelle1").Select
Cells(Rows.Count, 1).End(xlUp).Select
Name = ActiveCell.Value
Windows(Name).Activate
Anzeige
AW: Nächste Fehlermeldung!
13.10.2004 16:26:10
Nepumuk
Hallo Eleni,
jetzt bin ich etwas verwirrt. Ist denn die Mappe schon offen? Wenn nicht, dann muss dein Versuch fehlschlagen. Das letzte Makro war auch nur dazu da, den Ordnerinhalt aufzulisten, damit ich sehe, warum die Sortierroutine auf einen Fehler läuft. Ich nehme an, das in dem Ordner eine Datei ist, die "Datenerfassung" heißt, aber kein Datum im Dateinamen hat. Die Methode die Dateien aufzulisten und den letzten Namen zu benutzen, ist auch falsch, da z.B. Datenerfassung_13-09-04.xls auf alle Fälle hinter Datenerfassung_12-10-04.xls steht, aber im Datum eindeutig niedriger ist. Lade doch einfach mal eine Mappe mit dem aufgelisteten Ordnerinhalt auf den Server. Dann kann ich das erste Makro welches bei mir einwandfrei arbeitet so hinbiegen, dass es auch bei dir funktioniert.
Gruß
Nepumuk
Anzeige
AW: Nächste Fehlermeldung!
14.10.2004 10:11:16
Eleni
Hi Nepumuk,
Erstmal sorry, dass ich immer deinen Namen falsch geschrieben habe.
Jetzt zum Makro: das Makro ist umfangreicher, als nur die von mir gesuchte Funktion. Die Datei "Datenerfassung" macht beim Öffnen 3 Dinge: die Datei "Datenerfassung" wird automatisch mit aktuellem Datum und Uhrzeit abgespeichert, die Datei "Zeiterfassung" wird automatisch geöffnet und in der Datei "Datenerfassung" wird eine Userform geladen.
Nachdem man in der Datei "Datenerfassung" alle Daten eingegeben hat, sollen nun in der Datei "Zeiterfassung" per Makro bestimmte Daten aus der Datei "Datenerfassung" übernommen und aufsummiert werden. Hierzu sollen zuerst alle Tabellenblätter der Datei "Datenerfassung" nach Datumseinträgen in der Spalte F durchsucht und in "Übersicht" der Datei "Zeitaufschreibung" transferiert werden. Dazugehörige Werte aus benachbarten Zellen sollen ebenfalls übernommen werden. Um dies alles tun zu können, muss ich dem Makro den Namen der aktuellen Mappe "Datenerfassung_[Datum]_[Uhrzeit]" irgendwie sagen, damit er sich da die Daten herholen kann. Oder ich muss mir ein anderes Prinzip überlegen. Anschließend müssen alle Einträge noch in separate Tabellenblätter nach Monat sortiert kopiert werden. Das ist das gesamte Problem.
Habe die Datei "Zeierfassung" hochgeladen und Komentare eingefügt, wo ich immer dieses Namens-Problem habe. Die Datei "Datenerfassung" bekomme ich nicht auf den Server, da diese zu groß ist.
https://www.herber.de/bbs/user/12092.xls
Hoffe, du bist jetzt nicht von soviel Text erschlagen. Danke, Eleni
AW: Nächste Fehlermeldung!
14.10.2004 16:03:14
Nepumuk
Hallo Eleni,
jetz wird die Sache schon klarer. Wenn die aktuell geöffnete Datei "2004_Datenerf....." die ist, welche du anprechen möchtest, dann einfach so:


Option Explicit
Public strWorkbookname As String
Public Sub Eleni()
    Dim myWorkbook As Workbook
    For Each myWorkbook In Application.Workbooks
        If InStr(1, myWorkbook.Name, "Datenerfassung") <> 0 Then strWorkbookname = myWorkbook.Name: Exit For
    Next
End Sub


Damit steht dir der Name der Mappe in der Variablen "strWorkbookname" im kompletten Projekt zur Verfügung.
Gruß
Nepumuk
AW: Nächste Fehlermeldung!
15.10.2004 09:58:53
Eleni
Hi Nepumuk,
Jetzt habe ich deinen Code bei mir integriert. Aber irgendwie funktioniert das nicht mit
Windows(strWorkbookname).Activate
und ich kenne keine andere Möglichkeit ein Fenster zu aktivieren. Ich erhalte die Fehlermeldung "Typen unverträglich" und strWorkbookname ist leer. Die Lsg muss doch total einfach sein, oder?
Danke, Eleni
AW: Nächste Fehlermeldung!
15.10.2004 19:26:42
Nepumuk
Hallo Eleni,
du hast doch eine Mappe mit dem Namen "Datenerfassung...." geöffnet und das Makro befindet sich in der Mappe, welches das Fenster aktivieren soll (geht übrigens auch mit Workbooks(strWorkbookname).Activate). Setze mal den Cursor in das Makro, gehe mit F8 Zeile für Zeile durch und schau was in der Variablen myWorkbook.Name steht. Da muss doch dieser Name einmal auftauchen.
Gruß
Nepumuk
AW: Nächste Fehlermeldung!
18.10.2004 08:43:14
Eleni
Hi Nepumuk,
Danke für deine Hilfe. Im Public Sub stand in "strworkbookname" immer das Richtige, nur nicht im folgenden Sub, da war "strworkbookname" immer leer. Keine Ahnung, warum es anfangs nicht funktioniert hat. Nachdem ich das Public Sub ein paar Mal durchlaufen ließ, ging es auf einmal. Nur wenn ich diesen Ausdruck habe, nimmt er es nicht an:
ActiveCell.FormulaR1C1 = "=SUM(Workbooks(strWorkbookname).Activesheet!R3C13:R3C15)"
Will dich ja nicht nerven, aber evtl. hast du noch nen klitzekleinen Tip diesbezüglich für mich? Bin dir für deine Mühen äußerst dankbar.
Eleni
AW: Nächste Fehlermeldung!
18.10.2004 15:30:11
Nepumuk
Hallo Eleni,
das Forum ist doch zum Fragen da.
Die Formel kann so nicht funktionieren, da du dieser ein Objekt und keinen Namen übergibst. Wenn das eine Verweisformel von einer Mappe in eine andere sein soll, dann müsste sie so lauten:
ActiveCell.FormulaR1C1 = "=SUM([" & strWorkbookname & "]" & Workbooks(strWorkbookname).ActiveSheet.Name & "!R3C13:R3C15)"
Gruß
Nepumuk
DANKE
18.10.2004 16:20:43
Eleni
Hi Nepumuk,
Danke vielmals für deine Hilfe. Als Nichtprogrammierer sieht man nach einer gewissen Zeit Nur-VBa-Code-Angucken vor lauter Bäumen den Wald nicht mehr. Jetzt klappt es.
Danke, Eleni
AW: Dringend!! SaveAs Left(ThisWorkbook.FullName...
12.10.2004 17:08:26
Nepumuk
Hallo Eleni,
dann hat der Filesearch keine Datei gefunden. Das Programm war auf die schnelle hingeschmiert und deswegen ist es nicht fehlerfrei. Ändere den Code des 1. Makros so:


Public Sub Eleni()
    Dim strArray() As String, intIndex As Integer
    With Application.FileSearch
        .Filename = "Datenerfassung*"
        .FileType = msoFileTypeExcelWorkbooks
        .LookIn = "D:\Eigene Dateien\Testordner" 'hier den Pfad anpassen!!
        If .Execute > 0 Then
            ReDim strArray(1 To .FoundFiles.Count, 1 To 2)
            For intIndex = 1 To .FoundFiles.Count
                strArray(intIndex, 1) = .FoundFiles(intIndex)
                strArray(intIndex, 2) = Left$(StrReverse(Mid$(.FoundFiles(intIndex), InStrRev(.FoundFiles(intIndex), "\") + 1, Len(.FoundFiles(intIndex)) - InStrRev(.FoundFiles(intIndex), "\") - 4)), 8)
                strArray(intIndex, 2) = StrReverse(Right$(strArray(intIndex, 2), 2)) & "." & StrReverse(Mid$(strArray(intIndex, 2), 4, 2)) & "." & StrReverse(Left$(strArray(intIndex, 2), 2))
            Next
            Call sortieren(1, .FoundFiles.Count, strArray())
            Workbooks.Open strArray(1, 1)
        Else
            MsgBox "Keine Datei gefunden.", 48, "Hinweis"
        End If
    End With
End Sub


Damit kann die Fehlermeldung nicht mehr erzeugt werden. Warum das Programm keine Daten gefunden hat, liegt wahrscheinlich am abweichenden Dateiname, oder dem Pfad. Prüfe das mal.
Gruß
Nepumuk

147 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige