Dateien nach einem bestimmten Schlüssel umbennen

Hallo Zusammen,

ich habe ca 2000 Bild Dateien die mit einer eindeutigen Nummer versehen sind und im folgenden Format vorliegen:

ID.jpg

Um das ganze aussagekräftiger zu machen, will ich die Nummern in einen Text ändern. Das heißt jeder alten ID habe ich in einen Text(IDnew)zugeordent.Dieser Text besteht schon.Der Schlüssel dazu liegt in einer Excel Tabelle, wie folgt:

ID1 IDnew1
ID2 IDnew2
.
.
IDn IDnewn

Gibt es jetzt eine Möglichkeit die alte ID aus dem Dateinamen auszulesen und wie eine Art Schleife über alle Dateien laufen zu lassen, sodass ich am Ende folgendes Ergebnis habe:

IDnew1.jpg
.
.
Jeder Nummer also der richtige Text zugeordnet wurde und die Datei umbennant wurde ?

Ich hoffe ich habe mein Problem gut erklären können.

VG und danke für Eure Hilfe.

Marcel

jup

zum umbennen der Befehl

Name „C:\test\mappe1.csv“ As „C:\test\mappe1.txt“

Dann muss man einfach eine schleife uber deine tabelle laufen lassen

also sowas wie

Dim intRow As Integer
For intRow = 1 To 100
Name „C:\test“ & Cells(intRow, 1) AS „C:\test“ & Cells(intRow, 2)
Next intRow

Cells(intRow, 1) = 1 für die spalte mit dem alten namen

Cells(intRow, 2) = 2 für die spalte mit dem den neuen namen

For intRow = 1 To 100 = 1 von zeile , 100 bis zeile

alles entsprechend anpassen

Hey,

vielen Dank das war ja einfacher als ich dachte. Mit ein paar Anpassungen klappt das super.

Jetzt ist mir aber folgendes Problem aufgefallen. Meine Listen stimmen nicht genau über ein, ich bräuchte also folgendes (in Pseudocode).

Public Sub Rename()

Dim intRow As Integer

For intRow = 1 To 100 'Schleife die über meine Tabelle läuft

lese die nächste ID aus
speichere diese temporär in variable
suche die Datei in „C:\test“

if datei gefunden
Name „C:\test“ & Cells(intRow, 1) AS „C:\test“ & Cells(intRow, 2)

Next intRow

else

MsgBox („ID“ & ID & " nicht gefunden")
Next intRow ’ Mache nichts und springe zur nächsten ID

End if

End sub

Bisher ist das Problem, dass die Schleife abbricht,sobald eine Datei nicht gefunden wird. Wie lese also Datei Namen aus ?

VG und vielen Dank im voraus.

marcel

End Sub

lese die nächste ID aus
speichere diese temporär in variable
suche die Datei in „C:\test“
if datei gefunden
Bisher ist das Problem, dass die Schleife abbricht,sobald eine
Datei nicht gefunden wird. Wie lese also Datei Namen aus ?

Hallo Marcel,

Public Sub Rename()
Dim lngRow As Long
For lngRow = 1 To 100
 If Dir("C:\test\" & Cells(lngRow, 1).Value) "" Then
 Name "C:\test\" & Cells(lngRow, 1) As "C:\test\" & Cells(lngRow, 2)
 Else
 MsgBox "Datei " & "C:\test\" & Cells(lngRow, 1).Value & " nicht gefunden"
 End If
Next lngRow
End Sub

Änderung von Integer auf Long weil:
.Cells(Zahl1,Zahl2) sowieso innerbetrieblich erst beide Zahlen in Long wandelt BEVOR es quasi loslegt.
Zeitverlust wird bei 100 Zellen logisch nicht fühlbar, was ist aber mit 100 Milliarden Zellen!

Und, an sich der Hauptgrund warum ich mir das angewöhnt habe es ist für mich viel einfacher grundsätzlich immer alles was mit zeilen und Spalten zu tun hat als Long zu deklarieren.

Was anderes, wegen Sortierungsgründen empfiehlt es sich sehr großzügig abzuschätzen wieviele Bilder oder was das war mal geben KÖNNTE.

Dementsprechend dann nicht so
ID1.pic --> IDNeu1.pic
sondern so
ID1.pic --> IDNeu00001.pic

Wenn du noch nicht weißt wie man das macht frag gern nach, sag dann ob es in Vba oder Excel geschehen soll.

Für Vba —> schau nach Format
In Excel —> schau nach Text

Gruß
Reinhard

Änderung von Integer auf Long weil:
.Cells(Zahl1,Zahl2) sowieso innerbetrieblich erst beide Zahlen
in Long wandelt BEVOR es quasi loslegt.
Zeitverlust wird bei 100 Zellen logisch nicht fühlbar, was ist
aber mit 100 Milliarden Zellen!

Und, an sich der Hauptgrund warum ich mir das angewöhnt habe
es ist für mich viel einfacher grundsätzlich immer alles was
mit zeilen und Spalten zu tun hat als Long zu deklarieren.

Naja, das ist nun gar kein grund.

soll ich auch mal so virtuelle argumente bringen die hier ech nicht zutreffen aber irgentwann mal zutreffen könnte .

Also ich hab ein speicher mit 1kilobyte für meine Daten.

wenn ich die zahlen alle in int speicher dann brauch ich
2-byte

mit long
4 bytes long

wenn ich also kein platz habe ist es mit int besser .

Da kann von mir aus auch intern mal 4 bytes temporär genutz werden ,
das ändert aber nichts an meinem speicherverbrauch.

Das du besser mit long umgehst ist ein ganz anderes problem .
VBA würd schon ein fehler schmeissen wenns den ein Problem wäre .

Also billionen longs sind grösser als billionen ints , und wenn temporär long genommen wird ist das ok , hat aber nix mit dem was er dort tut zu tun .

Nun weisst du warum ich NICHT long nehme wenn meine zahlen nie den bereich verlassen .

P.S. man kann alles so oder so argumentieren, man sollte aber irgentwie beim thema bleiben und nicht sein eigenes vorgehen in ganz anderer situation profilieren .

zu Long Integer Byte Deklaration bei z.B. Cells(,)
Hallo Lae,

Änderung von Integer auf Long weil:
.Cells(Zahl1,Zahl2) sowieso innerbetrieblich erst beide Zahlen
in Long wandelt BEVOR es quasi loslegt.
Zeitverlust wird bei 100 Zellen logisch nicht fühlbar, was ist
aber mit 100 Milliarden Zellen!

Und, an sich der Hauptgrund warum ich mir das angewöhnt habe
es ist für mich viel einfacher grundsätzlich immer alles was
mit zeilen und Spalten zu tun hat als Long zu deklarieren.

Naja, das ist nun gar kein grund.
soll ich auch mal so virtuelle argumente bringen die hier ech
nicht zutreffen aber irgentwann mal zutreffen könnte .

von mir ignoriert da es persönlicher Angriff also OT ist.

Also ich hab ein speicher mit 1kilobyte für meine Daten.
wenn ich die zahlen alle in int speicher dann brauch ich
2-byte
mit long
4 bytes long

Bekannt.

wenn ich also kein platz habe ist es mit int besser .

Korrekt.

Da kann von mir aus auch intern mal 4 bytes temporär genutz
werden ,
das ändert aber nichts an meinem speicherverbrauch.

Nur teilweise richtig, ich bezog mich auf die Benutzung der Variablen in Cells(intA , intB)

Nachstehend ist dazu eine Aussage von Nepu und der spielt in der Königsliga der Excel-Vbaler.

Wenn du ihn anzweifelst naja *Schulterzuck*

P.S. man kann alles so oder so argumentieren, man sollte aber
irgentwie beim thema bleiben und nicht sein eigenes vorgehen
in ganz anderer situation profilieren .

Aus OT Gründen sag ich zu „profilieren“ nix
Ich blieb/war nur beim Thema und teilte mit wie ich in diesem Fall deklarieren würde.

Du „argumentierst“ daß du es anders deklarieren würdest.
Bitteschön.
Wie geschrieben finde ich es bei meinem Vorgehen sehr angenehm nicht jedes Mal aufs neue mir Gedanken zu machen, also kostbare Zeit verschleudern um darüber nachzudenken ob nun Zeilenanzahlen größer als 32xxx werden können oder ob ich für Spalten Byte oder Integer nehme.

Und wenn mein Code auch auf Fremdrechnern laufen soll so weiß ich ja nicht ob dort XL97 läuft oder XL 2010 wenn ich eine Variable im Code habe die dort die maximal mögliche Zeilen/Spaltenanzahl ausliest.

Gruß
Reinhard

Hallo an Alle,

nachdem ich das immer wieder sehe, muss ich das mal ansprechen.

Dim ByI As Byte, ByX As Byte

Rows(ByI) …
Columns(ByI) …
Cells(ByI, ByX) …

Das bringt nix.

Ok, an Stelle von 4 Byte für einen Long-Datentyp benötigt man
anscheinend nur 1 Byte.

Toll 3 Byte gespart. Aber bei 512 Megabyte = 536.870.912 Byte
Stackframe pro geöffneter Excelmappe spielen die 3 Byte nun wirklich
keine große Rolle.

Was viel entscheidender ist, die Rows -, Columns- und Cells -
Eigenschaft des Range - Objektes verlangt als numerischen Wert eine
Zahl vom Typ Long. Was passiert nun, wenn ich dem eine Zahl im
Byte-Format gebe?

Der Datentyp wird automatisch in einen Typ Long konvertiert.

Dazu wird der Byte-Wert in einen neuen Speicherbereich geschrieben,
welcher das gewünschte 4 Byte Format hat. Also nix gespart, sondern
sogar 1 Byte zusätzlich verbraten.

Außerdem kostet es natürlich etwas Zeit den Speicher zu reservieren,
und den Wert im richtigen Format reinzuschreiben.

Das mag ja alles kleinlich erscheinen, da man als User von der ganzen
Sache überhaupt nichts mitbekommt und auch der zusätzliche
Zeitaufwand ist eigentlich minimal (ich schätz mal weniger als eine
Sekunde wenn ich das 1.000.000mal mache). Aber ich hab halt mit
Assembler angefangen und da gab’s keine automatische Konvertierung,
sondern einen Programmabsturz wenn man auch nur ein Byte daneben lag.

Gruß
Nepumuk