根据 VBA 中的另一个工作簿名称保存我的 WB

Save my WB based on another workbook name in VBA

我有一个代码正在执行以下操作:

我只需要(如果可能的话)将我的 wb 保存为与我从中获取数据的外部 wb 相同的名称,并在末尾添加 date/time。

示例:

MainWB1.xlsm + ExternalWB1.xlsx >>> MainWB1.xlsx (这是现在)

MainWB1.xlsm + ExternalWB1.xlsx >>> ExternalWB1_today().xlsx(这就是我想要的)

fn = Replace(.FullName, ".xlsm", ".xlsx")



fn = Replace(.FullName, ".xlsm", date & ".xlsx")

您有两种不同的方法:

  • CopySheetFromClosedWorkbook2
  • SaveNoMacro

源工作簿的名称仅在 CopySheetFromClosedWorkbook2 的范围内可用,因为这是您打开和关闭它的地方。所以,你有两个选择:

  1. 在退出 CopySheetFromClosedWorkbook2 方法的范围之前保存主工作簿,即当源书的名称可用时
  2. 将源书的名称保存在某处(全局变量、命名范围、注册表、自定义 xml 部分等),甚至 return 结果(Function Sub) 以便您可以在稍后阶段调用 SaveNoMacro 方法

退出范围前保存

这里有两种方法:

  1. 将您的保存代码放在 src.Close False 行之前,这样您就可以使用 src.Name 属性 ,即将两种方法合二为一。不确定是否要这样做
  2. 将名称作为参数传递给第二个方法。在 CopySheetFromClosedWorkbook2 中替换为:
src.Close False

有了这个:

SaveNoMacro src.Name
src.Close False

并将 SaveNoMacro 更新为:

Sub SaveNoMacro(ByVal newName As String)
    Dim fn As String
    With ThisWorkbook
        fn = Replace(.FullName, .Name, Left(newName, InStrRev(newName, ".") - 1)) _
           & Format$(Date, "_yyyy-mm-dd") & ".xlsx"
        Application.DisplayAlerts = False
        .SaveAs fn, FileFormat:=xlWorkbookDefault
        Application.DisplayAlerts = True
    End With
    MsgBox "Saved as " & fn
End Sub

保存名称以备后用

如果您不想 运行 序列中的 2 个方法,那么您可以保存名称以备后用。使用全局变量不是一个好主意,因为在您 运行 保存方法时状态可能会丢失。只要您的工作簿没有受到保护,就可以使用命名范围,即您可以创建一个命名范围。

有很多选项,但最容易使用的是使用内置 SaveSetting 选项写入注册表。替换为:

src.Close False

有了这个:

SaveSetting "MyApp", "MySection", "NewBookName", src.Name
src.Close False

并将 SaveNoMacro 更新为:

Sub SaveNoMacro()
    Dim fn As String: fn = GetSetting("MyApp", "MySection", "NewBookName")
    If LenB(fn) = 0 Then
        MsgBox "No name was saved", vbInformation, "Cancelled"
        Exit Sub
    Else
        DeleteSetting "MyApp", "MySection", "NewBookName"
    End If
    With ThisWorkbook
        fn = Replace(.FullName, .Name, Left(fn, InStrRev(fn, ".") - 1)) _
           & Format$(Date, "_yyyy-mm-dd") & ".xlsx"
        Application.DisplayAlerts = False
        .SaveAs fn, FileFormat:=xlWorkbookDefault
        Application.DisplayAlerts = True
    End With
    MsgBox "Saved as " & fn
End Sub

我只需要(如果可能的话)将我的 wb 保存为与我从中获取数据的外部 wb 相同的名称,并在末尾添加 date/time

您在变量 FilePath 中获得了外部 wb 的完整路径,因此您可以使用它来保存工作簿。你可以像这样保存它(在你的子 CopySheetFromClosedWorkbook2 的末尾):

Dim SaveName As String


SaveName = src.Path & "\" & Replace(Split(Filepath, "\")(UBound(Split(Filepath, "\"))), ".xlsm", Format(Date, "dd_mm_yyyy") & ".xlsx")


With ThisWorkbook
    Application.DisplayAlerts = False
    .SaveAs SaveName, FileFormat:=xlWorkbookDefault
    Application.DisplayAlerts = True
End With

请注意,我正在使用对象 src 来获取您要保存新工作簿的路径,因此您需要在执行 [=15= 之前的任何位置分配行 SaveName = .... ].