VBA中引用名称更改工作簿

时间:2017-03-05 22:19:46

标签: excel vba excel-vba reference

我想知道是否有一个(内置/简单)选项来引用/连接/链接到具有变量名的工作簿?

我的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

1 个答案:

答案 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将有所帮助,但不会消除搜索不同版本的需要。因此,如果只保留版本号更改的一致文件名,您就可以实现最简单的解决方案。