我想知道是否有一个(内置/简单)选项来引用/连接/链接到具有变量名的工作簿?
我的xy问题是,我有工作簿b v45.xlsm并希望将数据导出到工作簿v34.xlsm,其中版本号有所不同。所以我想知道是否每个工作簿都有一个子ID,excel可以独立于名称进行refence,自动选择该文件夹中的最新版本。
当然,简单的解决方案是在包含字符串" 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
答案 0 :(得分: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资源管理器重命名的完全相同的文件,或者您在使用另存为时创建的同一文件夹中有多个版本? &#34;自动选择最新版本的问题&#34;建议在同一文件夹中创建新版本。如果是这样,则意味着您实际上正在更改要链接到的工作簿,因此无论如何,任何类型的文件链接都无法正常工作。此外,即使您输入子ID,每个版本仍将具有相同的子ID。虽然这仍然可以识别同一文件的不同版本的文件,但您仍然需要遍历所有这些文件以查找最新版本。如果文件名完全改变,则子ID将有所帮助,但不会消除搜索不同版本的需要。因此,如果只保留版本号更改的一致文件名,您就可以实现最简单的解决方案。