2017-03-05 5 views
0

変数名を持つブックへの参照/接続/リンクの(組み込み/シンプル)オプションがあるかどうか疑問に思っていましたか?VBAの参照名変更ブック

私のxy-problemは、ワークブックb v45.xlsmがあり、バージョン番号が異なるワークブックv34.xlsmにデータをエクスポートしたいと考えています。だからエクセルは名前から独立してリフレクションできる、各ブックのサブIDがあるかどうか疑問に思っていました。自動的にそのフォルダー内の最新バージョンが選ばれました。

もちろん、単純な解決策は、同じフォルダパスを仮定して、文字列 "a v"を含むフォルダパス内の最も最近修正されたExcelファイルを選択することですが、もっと慣習的な/統合されたオプションがあるかどうか不思議でした。

大切にしてください。

(この問題を見て、将来の人々のために、ここで私のマニュアルソリューションです:)

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

このための組み込み関数はありません。ファイル名に基づいて記述したとおりに行う必要があります。 –

答えて

1

ファイル名、バージョン番号を見ているのではなく、最近変更されたファイルを見てを解析する方が信頼できるものでなければなりません。以下のようなもので、ファイル名を確認し、それらのすべてをループ:あなたの質問から

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 

、私が追加/ Excelファイルにメタデータをチェックするいくつかの方法があっても、これは実際には必要かもしれないと思います。

ブック名が変更されると、Windowsエクスプローラで名前が変更されるのとまったく同じ名前になりますか?名前を付けて保存...を使用すると同じフォルダに複数のバージョンが作成されますか? 「最新のバージョンを自動的に選ぶ」問題は、同じフォルダに新しいバージョンが作成されていることを示しています。もしそうなら、実際にあなたがリンクしているワークブックを変更しているので、ファイルへのあらゆるリンクはとにかく動作しません。また、サブIDを入力しても、各バージョンには同じサブIDが割り当てられます。これにより、同じファイルの異なるバージョンであるファイルは引き続き識別できますが、最新のバージョンを探しているすべてのファイルをループする必要があります。サブIDは、ファイル名が完全に変更されている場合に役立ちますが、異なるバージョンを検索する必要はありません。したがって、バージョン番号だけを変更して一貫したファイル名を保持できる場合、可能な限り簡単な解決方法を実装することができます。

+0

ありがとうございました。基本的な名前は、同じ番号を変更するだけで(同じフォルダ内に複数のバージョンがある)、同じままでなければなりません。私は、このような問題があるように設計されたシステムがあるかどうか、もう少し複雑になったとき、つまり複数のユーザーまたは一貫性のないファイル名/その他の依存関係があるかどうか疑問に思っていました。 (複数の異なる.xlsmファイルを参照する場合、サブIDがまだエラーになることは理解していますが、おそらく私は提案を通じてこの問題について紹介したことがあります)。しかし、それは手作業の解決策です。あなたの精巧さに感謝します! –

関連する問題