2017-03-05 3 views
0

Ich fragte mich, ob es eine (eingebaute/einfache) Option gibt, auf eine Arbeitsmappe mit einem Variablennamen zu verweisen/eine Verbindung herzustellen/zu verknüpfen?Referenz Arbeitsmappe zum Ändern von Namen in VBA

Mein xy-Problem ist, ich habe Arbeitsmappe b v45.xlsm und möchte Daten in die Arbeitsmappe a v34.xlsm exportieren, wo die Versionsnummern variieren. Daher habe ich mich gefragt, ob es für jede Arbeitsmappe eine Unter-ID gibt, auf die sich Excel unabhängig vom Namen beziehen kann, indem automatisch die neueste Version in diesem Ordner ausgewählt wird.

Natürlich ist die einfache Lösung, die zuletzt geänderte Excel-Datei im Ordnerpfad mit der Zeichenfolge "a v" auszuwählen, wobei ein identischer Ordnerpfad vorausgesetzt wird, aber ich war neugierig, ob es eine konventionelle/integrierte Option dafür gab.

Mit freundlichen Grüßen.

(Für zukünftige Menschen bei diesem Thema suchen, hier ist meine Hand-Lösung :)

Sub find_planner_name() 
Dim objFSO As Object 
Dim objFolder As Object 
Dim objFile As Object 
Dim i As Integer 
Dim string_object(0 To 2) As String 'saving the filenames as strings 
Dim count As Integer 'counting nr of files encountered 
Dim save_version_number(0 To 1) As Long 

'Create an instance of the FileSystemObject 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
'Get the folder object 
Set objFolder = objFSO.GetFolder(ThisWorkbook.Path) 
i = 1 
'loops through each file in the directory and prints their names and path 
For Each objFile In objFolder.Files 
    'print file name 
    'Cells(i + 1, 1) = objFile.name 
    count = count + 1 
    ReDim version_number(0 To count) As Long 

    string_object(0) = "" 
    string_object(1) = "" 
    string_object(2) = "" 


    string_object(0) = objFile.name 
    If Right(string_object(0), 5) = ".xlsm" Or Right(string_object(0), 5) = ".xlsb" Then 
     If Left(string_object(0), 10) = " planner v" Or Left(string_object(0), 10) = " planner v" Then 
      string_object(1) = Right(string_object(0), Len(string_object(0)) - 10) 
      MsgBox (string_object(1)) 
      Do While IsNumeric(Left(string_object(1), 1)) = True 
       If IsNumeric(Left(string_object(1), 1)) = True Then 
        string_object(2) = string_object(2) & Left(string_object(1), 1) 
        string_object(1) = Right(string_object(1), Len(string_object(1)) - 1) 
       End If 
      Loop 
      If version_number(count) < string_object(2) And string_object(2) > 0 Then 
       version_number(count) = string_object(2) 
       MsgBox (version_number(count)) 
       save_version_number(0) = version_number(count) 
       save_version_number(1) = count 

      End If 
     End If 
    End If 
    i = i + 1 
Next objFile 

count = save_version_number(1) 'rewrite maxima back 
version_number(count) = save_version_number(0) 'rewrite maxima back 
'MsgBox ("done " & version_number(count)) 

Dim myMax As Long 
Dim count_results As Long 

For count_results = LBound(version_number, 1) To UBound(version_number, 1) 
    If version_number(count_results) > myMax Then 
     myMax = version_number(count_results) 
     Findmax = count_results 
     'MsgBox (version_number(count_results)) 
    End If 
    'MsgBox (version_number(count_results) & " and count_results = " & count_results) 

Next count_results 

'the name of the planner = 
name_planner = " planner v" & version_number(Findmax) & ".xlsm" 
' check if xlsm or xlsb 

'MsgBox (name_planner) 

If Dir(ThisWorkbook.Path & "\" & name_planner) <> "" Then 
    MsgBox ("File exists. and name is " & name_planner) 
Else 
    name_planner = " planner v" & version_number(Findmax) & ".xlsb" 
End If 

End Sub 
+3

Es gibt keine eingebaute Funktion dafür - Sie müssen es tun, wie Sie beschrieben haben, basierend auf den Dateinamen. –

Antwort

1

Es sollte zuverlässiger Dateinamen zu analysieren, zu den Versionsnummern suchen und nicht auf der zuletzt geänderten Datei suchen. Schleife durch alle von ihnen die Überprüfung der Dateinamen mit so etwas wie:

strFile = Dir(DirectoryPath) 
Do while strFile <> "" 
    'Parse strFile for intNewVersionNumber 
    if intNewVersionNumber > intVersionNumber then intVersion Number = intNewVersionNumber 
    strFile = Dir 
Loop 
strFile = 'Reconstruct filename from intVersionNumber 

Aus Ihrer Frage, ich denke, das tatsächlich notwendig sein könnte, auch wenn es zum Hinzufügen/Überprüfung von Metadaten auf Excel-Dateien ein paar Möglichkeiten, sein kann.

Wenn Sie sagen, dass sich der Name der Arbeitsmappe ändert, wird buchstäblich die exakt gleiche Datei über Windows Explorer umbenannt, oder haben Sie mehrere Versionen im selben Ordner, der bei Verwendung von Speichern unter ... erstellt wurde? Das Problem der "automatischen Auswahl der neuesten Version" deutet darauf hin, dass neue Versionen in demselben Ordner erstellt werden. Wenn dies der Fall ist, bedeutet das, dass Sie tatsächlich die Arbeitsmappe ändern, mit der Sie verlinken, so dass jede Art von Link zu einer Datei nicht funktioniert. Auch wenn Sie eine Sub-ID eingeben, hat jede Version immer noch dieselbe Sub-ID. Während dies die Dateien, die unterschiedliche Versionen der gleichen Datei sind, immer noch identifizieren kann, müssen Sie alle Dateien durchsuchen, die nach der neuesten Version suchen. Eine Sub-ID würde helfen, wenn der Dateiname sich komplett ändert, aber die Notwendigkeit, die verschiedenen Versionen zu durchsuchen, wird nicht beseitigt. Wenn Sie also einen konsistenten Dateinamen beibehalten, bei dem nur die Versionsnummer geändert wird, können Sie die einfachste mögliche Lösung implementieren.

+0

Vielen Dank, der Basisname muss gleich bleiben, wobei nur die Versionsnummer geändert wird (mit mehreren Versionen im selben Ordner). Und ich frage mich, ob es ein System dafür gibt, das mit solchen Problemen entworfen wurde, wenn die Dinge etwas komplizierter werden, d. H. Mehrere Benutzer oder inkonsistente Dateinamen/andere Abhängigkeiten. (Ich verstehe, dass die Sub-ID immer noch zu einem Fehler führen würde, wenn sie sich auf mehrere verschiedene .xlsm-Dateien beziehen würde, aber vielleicht wurde ich über Vorschläge auf dieses Thema aufmerksam gemacht). Aber eine manuelle Lösung wird es sein. Danke für deine Ausarbeitung! –

Verwandte Themen