Externe Dateien aus Excel-Liste in Verzeichnis kop

Hallo zusammen,

ich habe mir mit MP3Tag eine Liste von Musiktiteln (MP3, FLAC, OGG etc)
für Excfel (2007 als *.xls und *.xlsx) erstellet.

Der Dateipfad jedes Titels steht in ZS16.

Ich habe vor, in ZS2 eine Funktion, Makro, Button o.ä. zu hintrerlegen, die bei „Mausklick“ die betreffende Datei in ein Verzeichnis L:MusicMyTracks kopiert.

Dazu soll als Quellpfad der Dateipfad der jeweiligen Zeile aus Spalte 16 (ZS16) verwendet werden.

Meine Frage, wie kann man das als Makro oder als Button für jede Zeile lösen?

Schon mal ganz herzlichen Dank für Antworten.

Bernd

Hallo zusammen,

hallo
ich würd „activecell“ probieren,
oder einen makro schreiben der mir den gewünschten bereich abfragt, welche zelle aktiv ist. Die zellnummer
in eine andere zelle schreibt. Die andere zelle mit den button auslöst.
LG Fred

ich habe mir mit MP3Tag eine Liste von Musiktiteln (MP3, FLAC,
OGG etc)
für Excfel (2007 als *.xls und *.xlsx) erstellet.

Der Dateipfad jedes Titels steht in ZS16.

Ich habe vor, in ZS2 eine Funktion, Makro, Button o.ä. zu
hintrerlegen, die bei „Mausklick“ die betreffende Datei in ein
Verzeichnis L:MusicMyTracks kopiert.

Dazu soll als Quellpfad der Dateipfad der jeweiligen Zeile aus
Spalte 16 (ZS16) verwendet werden.

Meine Frage, wie kann man das als Makro oder als Button für
jede Zeile lösen?

Schon mal ganz herzlichen Dank für Antworten.

Bernd

Hallo Bernd,

zur Zeit habe ich leider nicht ausreichend Zeit mich damit zu befassen, da ich demnächst ins Krankenhaus muss und hierfür einige Vorbereitungen notwendig sind.
Danach könnte ich mal sehen ob mir dazu etwas einfällt.

Gruß Hugo

Hallo Hugo,

dann alles Gute, sowas macht man ja nicht „einfach so“.

Mal sehen, ob es dann noch notwendig ist. Ein paar Codeschnipsel habe ich inzwischen bekommen, aber da muss ich npch ran.

Gruß

Bernd

Hallo Bernd,

ich würde nicht in jede Zeile einen Button machen, der den Kopiervorgang startet. Besser wäre m.E. ein Button und auch nur ein Makro.
Hinterlege hinter dem Makro eine Userform und trage hier in eine Textbox die Zeilennummer ein.
Mit einem Button startest Du dann folgendes Makro:

Private Sub CommandButton1_Click()
Zeile = UserForm1.TextBox1.Value
Pfadvon = Cells(Zeile, 16).Value

Dim strSourceFolder As String, strTargetFolder As String
Dim objFSO As Object

strSourceFolder = Pfadvon 'Quellordner
strTargetFolder = „L:\MusicMyTracks“ 'Zielordner

Set objFSO = CreateObject(„Scripting.FileSystemObject“)

objFSO.CopyFolder strSourceFolder, strTargetFolder

Set objFSO = Nothing
UserForm1.Hide
MsgBox „Datei(en) wurde(n) kopiert!“

End Sub

Gruß,
Ptonka

Hallo Bernd,
ich schlage folgendes vor:

  1. du schreibst in Spalte 2 irgendein Wort, z.B. Kopie, markierst das und fügst einen Hyperlink ein (Link zu aktuelles Dokument)
  2. du gehst zu der Tabelle, in der deine mp3-Dateien stehen,unten mit der re. MT auf den Tab (z.B. „Tabelle 1“) auf Code anzeigen
  3. der Code ist natürlich noch leer. Du fügst dort folgendes ein:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
ZeiNr = Target.Range.Row
Call kopieren
End Sub

  1. Jetzt musst du noch ein Makro „kopieren“ erstellen. Mit Alt+F11 öffnen des VBA-Editors
  2. Menü einfügen Modul - Modul 1 wird eingefügt
  3. Kopieren des folgenden Codes in das Modul:

Public ZeiNr As Integer

Sub kopieren()
Dim SourceFile As String, DestFile As String
Const Ziel = "L:\MusicMyTracks"
With ActiveSheet
SourceFile = .Cells(ZeiNr, 16) & "" & .Cells(ZeiNr, 1) & „.mp3“
DestFile = Ziel & .Cells(ZeiNr, 1) & „.mp3“
FileCopy SourceFile, DestFile
End With

End Sub

Wenn du jetzt in Spalte 2 „Kopie“ anklickst, wird über die Ereignisprozedur FollowHyperlink zunächst die Zeilennr. fixiert und dann das Makro „kopieren“ gestartet.

Probiers mal

Gruß Jürgen

Hallo Bernd,

gleich vorweg: ich weiß leider nicht, ob Excel Dateien verschieben kann, die von Excel nicht gelesen / geöffnet werden können.

Allerdings habe ich folgenden Vorschlag:
Setze nur einen Button ans obere Ende der Liste. Durch eine Zeilenfixierung behältst du diesen auch beim Scrollen immer im Blick / Zugriff.

Aktiviere durch einen Klick auf die gewünschte Zeile eine Zelle, deren Zeilenzahl durch folgenden Befehl ausgelesen werden kann:

zeile = activecell.row

Dann liest du den Pfad aus und wechselst dorthin:

pfad = cells(zeile, 16).value
laufwerk = left(pfad,3)
ChDrive (laufwerk)
ChDir (pfad)

Ab hier kann dann die Routine greifen, die die Datei verschiebt. Wie gesagt, hier kann ich aber leider nicht weiterhelfen. Sorry!

Schönen Gruß
Norman

Haloo Jürgen,

Danke für das Skript und die genaue Anweisung.

Es kommt die Meldung, dass der Dateipfad nicht gefunden werden kann.

Dazu nochmals die genaue Info:

Der komplette Dateipfad steht inj der Zelle Spalte 16, also

LW|Verzeichnisse|Dateiname|Dateiendung

mit unterschiedlicher Verzeichnistiefe.

was bspw. so aussieht:

L:\Music\Blues\Sampler\Snatch And Grab It!\23 - Cadillacs - Zoom.mp3

Das steht für jeden Titel in Spalte 16

Ein Titel belegt jeweils genau eine Zeile.

Es braucht die Zufügung von Backslash und Dateieindung nicht, da diese bereits im Dateipfad enthalten sind.

Bei der Zieldatei sehe ich den Umstand, dass hier garnicht auf den Dateipfad aus Spalte 16 verwiesen werden kann, da steht die Datei ja bereits.

Es gibt zwar in Spalte 15 eine Zelle mit dem reinen Dateinamen, aber leider ohne Dateiendung. Da es sich nicht nur um mp3 handelt, sondern auch um flac , ogg, ape, Frage, ob es nicht reicht, wenn man dem Sourcefile einfach Zielpfad als Ziel mit auf den Weg gibt. Das weiss ich eben nicht, ob das so geht.

Ich habe von der Umsetzung in Makro usw. selbst leider überhaupt keine Ahnung, daher Frage:

WIE???

Danke schon mal im Voraus.

Gruß

Bernd

Hallo skalarium!

Habe das selbst noch nicht ausprobiert.
Hier ein Hinweis:

schau mal unter www.herber.de
vielleicht gibt es dort ein vorbereitetes Skript…

gruß
Dagmar

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Hier Spalte filtern
If Selection.Column = 4 Then
'und die Dateien kopieren
Cancel = True
end if
End Sub

Hallo Bernd,
gut, diese Details wusste ich nicht. Bis einschl. Punkt 3 meiner 1. Antwort bleibt alles so. Das Makro „kopieren“ würde dann so aussehen:

Sub kopieren()
Dim SourceFile As String, DestFile As String, FileName As String
Dim L As Integer
Const Ziel = "L:\MusicMyTracks"
With ActiveSheet
SourceFile = .Cells(ZeiNr, 16)
'Filename finden (Zeichen nach dem letzten Backslash in Sp. 16)
L = Len(SourceFile)
j = 0
For i = 1 To L
If Mid(SourceFile, i, 1) = "" Then
j = i
End If
Next
'j ist die Position des letzten gezählten "" in der Zeichenkette SourceFile
FileName = Right(SourceFile, L - j)
DestFile = Ziel & FileName
FileCopy SourceFile, DestFile
End With
End Sub

Das müsstest du dann in Modul 1 reinkopieren. Der SourceFile einschl. Pfad und Dateiname steht in Sp. 16. Der Dateiname selbst steht ab dem letzten Backslash in der Zeichenkette SourceFile. DestFile ist dann Ziel (also L:...) + FileName. FileCopy ist eine Funktion von VBA und erfordert, dass DestFile sowohl den Zielpfad als auch den Dateinamen enthält.

Ciao
Jürgen

Hallo Jürgen,

erstmal vielen Dank, das Makro kopiert. Da erstarre ich schon fast in Ehrfurcht.

Was allerdings leider passiert, ist, dass - egal auf welcher Zeile ich in Spalte 2 auf klicke, es wird immer der Track aus Zeile 2 kopiert, also immer der gleiche. Wenn ich mit der Maus über bin, wird angezeigt File///… !Z2S2 bzw. A2, wenn ich diese Darstellu ng vcerwende. Also alle Zeilen verweisen auf die Zeile 2 und die führt dann anscheinend das Makro aus.

Ich habe das mit StrgU nach unten ausgefüllt und danach für den ganzen Bereich von ca. 10.000 Zeilen den Hyperlink gesetzt und danach den Code eingetragen. Mach ich da irgendwas falsch?

Oder muss ich einen bestimmten Zellbeztug eintragen, default steht da Z1S1, wenn ich den Hyperlink einfüge. Da hab ich auch schon alle Varianten probiertr, ohne jede Veränderung.

Wäre wirklich toll, wenn sich das noch ausräumen ließe.

Danke und Gruß

Bernd

ich vermute, woran das liegt. Hast in Modul 1 noch oben die Zeile:

Public ZeiNr As Integer

stehen? Wenn nicht, füge sie über Sub kopieren() usw. ein.

Damit wird die Variable ZeiNr initialisiert. Sie wird in Worksheet_FollowHyperlink(…) ermittelt und dann in kopieren() wieder verwendet.

Jürgen

Hallo Jürgen,

Danke für deine Antwort. Im Modul11 steht Folgenbdes dort rauskopiert)

Public ZeiNr As Integer
Sub kopieren()
Dim SourceFile As String, DestFile As String, FileName As String
Dim L As Integer
Const Ziel = "L:\MusicMyTracks"
With ActiveSheet
SourceFile = .Cells(ZeiNr, 16)
'Filename finden (Zeichen nach dem letzten Backslash in Sp. 16)
L = Len(SourceFile)
j = 0
For i = 1 To L
If Mid(SourceFile, i, 1) = "" Then
j = i
End If
Next
'j ist die Position des letzten gezählten "" in der Zeichenkette SourceFile
FileName = Right(SourceFile, L - j)
DestFile = Ziel & FileName
FileCopy SourceFile, DestFile
End With
End Sub

Es wurde nichts verändert.

Wenn ich Hyperlinks Zeilenweise einfüge, klappt das, dass genau die Datei dieser Zeile kopiert wird.
Das ist aber auf Dauer etwas mühsam.

Es sieht immer noch so aus, dass er genau die Datei kopiert, aus deren Zeile heraus der Hyperlink herrührt, als Zeile 2, wenn ich alle in der Spalte 2 ausgewählt habe beim Einfügen des Hyperlinks.

Er hat mir bei der Einhaltung der Reihenfolge den Fehler ausgegeben, dass er das Modul nicht findet und daher nicht Kompilieren könne. Danach habe ich die Reihenfolge geändert und davor erst das Modul erstellt. Danach war diese Meldung dann auch weg.

Ich hoffe, du hast noch eine Idee auf Lager.

Einen schönben Abend

Gruß

Bernd

ja, so habe ich deine Frage verstanden: wenn du in Zeile 2 oder 7 oder 9 den Hyperlink anklickst, soll die in dieser Zeile stehende Datei ins Zielverz. kopiert werden. Mehrere auf einmal geht auf diese Weise natürlich nicht. Da müsste man anders programmieren, z.B. so, dass eine Userform geöffnet wird, wo du gefragt wirst, welche Zeile einzeln, oder welche Zeilengruppe (oder alles) kopiert werden soll. Wenn das so ist, dann antworte mir auf meine Email-Adresse. Da kann man auch mal ne Datei hin und her schicken.

Gruß Jürgen
[email protected]

Sorry, war ein paar Tage auf Geschäftsreise. Ich kann dir aber so nicht helfen, da ich das Problem leider nicht verstanden hab’.

Hallo,
so leid es mir Momentan tut, aber ich habe keine Zeit dafür, da ich private Probleme bewältigen muss.
Entschuldige.

mfg
Wolfgang

UIch wollte mich auch hier nochmals ganz herzlich bei Jürgen bedanken, der die Frage perfekt gelöst hat.

Damit ist das Thema ja wohl abgeschlossen.

Nochmals Dank an Alle, vor allem aber an Jürgen.

Gruß

Bernd

Hallo Bernd,

etwas verspätet meine Antwort. Kopiervorgang wird per Doppelklick in eine Zelle der Spalte B gestartet.

Den Code muss du im VBA-Editor unter dem Tabellenblatt mit der Dateiliste einfügen.

Gruß
Franz

Private Sub Worksheet\_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 'Per Doppelklick in Zelle Kopiervorgang starten
 Dim DateiPfad As String
 Const SpalteKlick As Long = 2 'Spalte B - Nr. der Spalte für Doppelklick- ggf. anpassen
 Const SpalteDateiname As Long = 16 'Spalte P - Nr. der Spalte mit Pfad\Dateiname-ggf. anpassen
 Const Zeile1 As Long = 2 '1. Zeile mit einem Pfad\Dateinamen
' Const ZielPfad As String = "L:\Music\MyTracks" 'Zielverzeichnis - ggf. anpassen
 Const ZielPfad As String = "C:\Users\Public\Test\Daten" '---- ggf. anpassen
 If Target.Column = SpalteKlick And Target.Row \>= Zeile1 And Target.Value "" Then
 Cancel = True 'Doppelklick abbrechen
 DateiPfad = Cells(Target.Row, SpalteDateiname).Value
 'Prüfen, ob Datei vorhanden
 If Dir(PathName:=DateiPfad) "" Then
 'Datei in Zielverzeichnis kopieren
 VBA.FileCopy Source:=DateiPfad, Destination:=ZielPfad & "\" \_
 & Mid(DateiPfad, InStrRev(DateiPfad, "\"))
 End If
 End If
End Sub

Hi, muss passen!