Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1092to1096
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

Teil des Dateinamens durch * ersetzen

Teil des Dateinamens durch * ersetzen
muggsman
Hallo User,
ich habe ein dummes Problem mit dem Dateinamen. Ich bekomme jeden Tag eine Datei per Mail, deren Name ungefähr so aussieht: "Pricecurve_d-2_2009_08_08.xls". Werte aus dieser Datei kopiere ich in eine andere. Im Namen der Pricecurve- Datei ändert sich jeden Tag das Datum und auch aus "d-2" wird mal "d-1".
Jetzt habe ich folgendes versucht:
Workbooks("Pricecurve_*.xls").Worksheets("Arkusz1").Activate
Range(Cells(3, 4), Cells(26, 4)).Select
Selection.Copy
Workbooks("Calc.xls").Worksheets("Data").Activate
Range(Cells(88, 15), Cells(111, 15)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
Mit dem Sternchen (*) möchte ich den ganzen Teil "d-2_2009_08_08" ersetzen, es funktioniet nicht, Error: "Subscript out of range".
Was könnte ich sonst machen?
Vielen Dank für Eure Hilfe
Gruß
Stefan

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Teil des Dateinamens durch * ersetzen
01.08.2009 15:51:12
Daniel
Hi
probiers mal so:
Sub test()
Dim wbQuelle As Workbook
For Each wbQuelle In Application.Workbooks
If wbQuelle.Name Like "Pricecurve_*" Then Exit For
Next
If wbQuelle Is Nothing Then
MsgBox "eine Datei mit dem Namen ""Pricecurve"" ist nicht geöffnet."
Else
wbQuelle.Sheets("Arkusz1").Range("D3:D26").Copy
Workbooks("Calc.xls").Worksheets("Data").Cells(88, 15).PasteSpecial  Paste:=xlPasteValues
End If
End Sub
zur Erläuterung:
die Schleife durchläuft alle geöffneten Exceldateien und prüft, ob eine davon mit dem Namen "Pricecurve" beginnt. Wenn ja, wird diese Datei der Objektvariablen "wbQuelle" zugeordnet.
dieses "wbQuelle" kannst du im folgenden immer verwenden, wenn du "Workbook("Pricecurve...")" verwenden wolltest
Die IF-Abfrage ist drin, damit es keinen Fehler gibt, falls es keine Datei mit diesem Namen gibt.
Beim Einfügen eines Kopierten Zellbereichs reicht es, die obere linke Zelle es Ziels anzugeben, der Einfügebereich muss nicht exakt angegeben werden, das kann Excel sich ja aus dem kopierten Bereich selber ableiten.
außerdem solltest du dashier lesen:
http://www.online-excel.de/excel/singsel_vba.php?f=78
Gruß, Daniel
Anzeige
ohne Copy und PasteSpecial
02.08.2009 00:05:20
Erich
Hi,
so kann man das auch einfacher schreiben:
(und spart auch noch "Application.CutCopyMode = False")

Option Explicit
Sub test()
Dim wbQuelle As Workbook
For Each wbQuelle In Application.Workbooks
If wbQuelle.Name Like "Pricecurve_*" Then Exit For
Next
If wbQuelle Is Nothing Then
MsgBox "eine Datei mit dem Namen ""Pricecurve"" ist nicht geöffnet."
Else
Workbooks("Calc.xls").Worksheets("Data").Range(Cells(88, 15), Cells(111, 15)) = _
wbQuelle.Sheets("Arkusz1").Range(Cells(3, 4), Cells(26, 4)).Value
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: ohne Copy und PasteSpecial
02.08.2009 09:55:12
muggsman
Daniel, Erich,
vielen Dank! Es hat geklappt. Der Like Operator ist hier der richtige Tool. Ein paar Details verstehe ich aber nicht:
1. Wenn ich diese Zeile:
wbQuelle.Sheets("Arkusz1").Range("D3:D26").Copy
in der Form:
wbQuelle.Sheets("Arkusz1").Range(Cells(3, 4), Cells(26, 4)).Copy
schreibe, dann bekomme ich die Fehlermeldung "Runtime error 1004: Application-defined or object-defined error". Es sollte doch egal sein ob ich den Range mit "D3:D26" oder mit "Cells(), Cells()" definiere.
2. die Logik des (*)-Operators.... Warum genau hat es nicht funktioniert wie ich es am Anfang probiert hatte? (*) soll doch jeden beliebigen Teil des Dateinamens ersetzen....
Daniel, ich weiß... von dem Makrorekorder sollte man weg. Es kommt hoffe ich mit der Zeit.
Vielen Dank und einen schönen Tag.
Gruß
Stefan
Anzeige
Vollständige Referenzierung usw.
02.08.2009 11:44:16
Erich
Hi Stefan,
zunächst: Mein Code war falsch. Hier eine hoffentlich richtige Version (ungetestet):

Option Explicit
Sub test()
Dim wbQuelle As Workbook
For Each wbQuelle In Application.Workbooks
If wbQuelle.Name Like "Pricecurve_*" Then Exit For
Next
If wbQuelle Is Nothing Then
MsgBox "eine Datei mit dem Namen ""Pricecurve"" ist nicht geöffnet."
Else
Workbooks("Calc.xls").Worksheets("Data").Cells(88, 15).Resize(24) = _
wbQuelle.Sheets("Arkusz1").Cells(3, 4).Resize(24).Value
End If
End Sub
Nun zu deiner Frage1: Wenn du in einem "normalen" Modul schreibst: Cells(1,2), wird damit
B1 auf dem (zufällig gerade) aktiven Blatt angesprochen.
Wenn man B1 auf Sheets(2) braucht, muss man Sheets(2).Cells(1, 2) schreiben.
Sheets(2).Range(Cells(1, 2), Cells(2, 2)) gibt deshalb einen Fehler, wenn Sheets(2) nicht aktiv ist.
(Hier würde man ja versuchen, mit Zellen des aktiven Blatts einen Bereich in Sheets(2) zu bauen.)
Hier müsste man korrekt schreiben:
Sheets(2).Range(Sheets(2).Cells(1, 2), Sheets(2).Cells(2, 2))
Das kann man mit einer With-Klammer verschönern und auch beschleunigen:

With Sheets(2)
    .Range(.Cells(1, 2), .Cells(2, 2))
End With
In der Schreibweise Sheets(2).Range("B1:B2") gibt es das Problem nicht.
zu Frage 2:
Workbooks("Pricecurve_*.xls") hätte nur dann evtl. Sinn, wenn es genau ein Workbook gibt,
dessen Name mit Pricecurve_ beginnt.
Was aber, wenn es kein solches Workbook oder gar mehrere gibt?
"Workbooks" ist eine Auflistung. Wenn man auf ein Element dieser Auflistung, also ein Workbook,
zugreifen will, muss man einen Index oder den Namen eines Workbooks angeben:
Workbooks(1) oder Workbooks("abc.xls"). Symbole wie "*" oder "?" sind hier nicht möglich.
Beim Like geht das natürlich - u. a. dafür ist Like da, es ist darauf vorbereitet (siehe VBA-Hilfe zu Like).
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: noch ein paar ergänzungen
02.08.2009 12:13:41
Daniel
HI
zur ersten Frage:
interessangerwerise kann man die Sheet-bezeichnung vor dem RANGE weglassen, wenn die Range über 2 Cells definiert wrid, dh.
Range(Sheets("xy").Cells(1,1), Sheets("xy").Cells(19,19)) reicht normalerweise aus, es muss nicht heißen Sheets("xy").Range(Sheets("xy").Cells(1,1), Sheets("xy").Cells(19,19))
Trotzdem ist es so umständlich, deswegen verwende ich nebend er WITH-Klammer mittlerweile gerne die Resize-Funktion: Sheets("xy").Cells(1,1).Resize(19,19) um Zellbereiche zu definieren, vorallem wenn ich mit mehren Sheets hantieren, da die WITH-Klammer ja immer nur ein Sheet gleichzeitg ersetzen kann.
zum Problem des Makrorecorders: der Makrorekorder ist schon ok, vorallem, wenn man noch icht alle Befehle und Parameter auswendig kenn, oder keine Lust hat, alles einzutippen, allerdings sollte man sich schon die Mühe machen, den aufgezeichneten Code anschließend zu überarbeiten.
Gruß, Daniel
Anzeige
und eine kleine Präzisierung
02.08.2009 13:38:48
Erich
Hi Daniel,
Range(Sheets("xy").Cells(1,1), Sheets("xy").Cells(19,19))
ist fehlerhaft, wenn der Code im (Klassen-)Modul eines anderen Tabellenblatts steht.
In diesem Fall muss man tatsächlich Sheets("xy").Range(...) schreiben
oder besser With verwenden.
In einem "normalen" Modul reicht das aus:
Range(Sheets("xy").Cells(1,1), Sheets("xy").Cells(19,19))
Klarer und sicherer ist aber immer die vollständige Refenzierung
(bei der oft auch die jeweilige Arbeitsmappe anzugeben ist).
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Danke für den Hinweis
02.08.2009 15:11:19
Daniel
Gruß, Daniel
Anzeige
AW: noch ein paar ergänzungen
02.08.2009 13:42:42
muggsman
Hi Daniel,
danke für Antwort. Ich finde Resize() jetzt auch am effizientesten. Wie gesagt, nur die Variante :
Workbooks("z").Sheets("xy").Range(Workbooks("z").Sheets("xy").Cells(1,1), Workbooks("z").Sheets("xy").Cells(19,19)).Value
hatte funktioniert, was ja super umständlich ist (und natürlich dein erster Vorschlag Range("D2:D22") hat auch gewirkt).
Danke und Gruß
Stefan
AW: Vollständige Referenzierung usw.
02.08.2009 13:34:32
muggsman
Hi Erich,
vielen Dank für deine Tips! Der Code mit .Resize() funktioniert super. Wenn ich auch die Spaltenanzahl definiere, kann mir einen Range bilden, top!
Ich hab die lange Ausschreibung innerhalb der Range() ausprobiert, es hat funktioniert und auch die With Schleife eingebaut:
With wbQuelle.Sheets("Arkusz1")
Workbooks("Calc.xls").Worksheets("Data").Cells(88, 15).Resize(24) = _
.Range(.Cells(3, 4), .Cells(3, 26)).Value
End With
hat auch funktioniert.
Vielen Dank nochmals und einen schönen Sonntag
Gruß
Stefan
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige