如果打开两个具有相同宏的类似xls文件,则全局变量为空

NJM*_*JMR 7 excel vba excel-vba

在Excel中有一个已经编写的宏,并且有关于此的报告错误,我必须解决这个问题.初步调查如下......有ABC.xls文件有macro.

现在,宏有一个sub命名changeTheCode,当我按下时它被调用Ctrl + M.

该子程序将打开一个Open File Dialog用户可以选择CSV文件的位置.我存储在全局变量中的CSV文件的路径声明在所有函数之外...

Public txtFileNameAndPath As String
Run Code Online (Sandbox Code Playgroud)

当用户关闭excel时,此全局变量将用于将更改保存到CSV文件中.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call saveUnicodeCSV
    Call deleteXLS
End Sub
Run Code Online (Sandbox Code Playgroud)

我用这个ABC.xls文件打开一个ABC123.CSV文件.

我用这个DEF.xls(ABC.xls的副本)文件来打开DEF123.CSV文件.但是,当我打开DEF123.CSV使用Ctrl + M,子changeTheCode的ABC.xls获取调用和全局变量txtFileNameAndPath的DEF.xls是空的,当我关闭Excel,事情没有得到因为这个保存.

在此输入图像描述

设置全局变量的代码.

Public txtFileNameAndPath As String
Sub CodePageChange()
    Dim SheetName As Worksheet
    Dim fd As Office.FileDialog
    Dim sheetName1 As String
    Dim tabSheetName As String

    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        '....
        '....
        '....
        If .Show = True Then
          txtFileNameAndPath = .SelectedItems(1)
        Else
            MsgBox "Please start over.  You must select a csv file."
            Exit Sub
        End If
    End With
Run Code Online (Sandbox Code Playgroud)

关于如何处理这个的输入将帮助我很多.

注意:包含宏的Excel将提供给客户.因此,我不能要求客户进行一些注册表调整,以在单独的实例中打开Excel.

谢谢.

fcs*_*csr 5

我认为的问题是,当您将相同的宏名称绑定到快捷键时,将打开的第一本书将分配给该快捷键.

解决方法是使另一个宏根据工作簿名称调用正确的宏.这可能需要您将某些工作簿和工作表替换为ActiveWorkbook或ActiveWorksheet.但请先试试.

这只是我尝试的示例代码,但请根据您的需要进行编辑.我通过制作两个文件a.xlsm和b.xlsm来尝试它.差异是a.xlsm在第一行有msgbox"a"而b.xlsm在第一行有msbox"b".首先打开a.xlsm然后再打开b.xls进行检查.然后分配相同的快捷键.您将看到,当您在b.xlsm中运行Ctrl + M时,将运行的宏将位于带有msgbox"A"的a.xlsm中,但它将在b.xlsm中调用正确的宏.

简答

此代码使用该代码Application.Run从特定工作簿运行宏.创建一个帮助宏,它将检查文件名然后附加宏名称.

因此,当你按ctrl + m时,无论运行哪个工作簿run_code,它都会返回到activeworkbook并从该工作簿运行宏,在本例中为plaster.此外,它将使用activeworkbook值填充公共变量.

https://www.rondebruin.nl/win/s9/win001.htm一些application.run样本

到目前为止,最简单的解决方案只需添加来电宏

来电宏:

Sub call_changeTheCode() ' add to all workbooks, that have changeTheCode macro then assign to Ctrl + m

Application.Run ActiveWorkbook.Name & "!changeTheCode"

End Sub
Run Code Online (Sandbox Code Playgroud)




概念证明,而不是您的实际代码,使用上面的来电宏:

Public varvar As String
Sub run_code() 'assignt to shortcut key CTRL+M both macros in a.xlsm and b.xlsm
MsgBox "a" ' to test create another workbook and change this to b
file_path = ActiveWorkbook.Path 'just to check path
file_name = ActiveWorkbook.Name 'gets the file name
MsgBox file_path 'msgbox the file_path
MsgBox file_name 'msgbox the file_name
MsgBox file_name & "!plaster" 'msgbox the file name plus macro name, in your instance it would be "ABC.xlsm'!macro_name" please note the format
Application.Run file_name & "!plaster"

End Sub

Sub plaster() 'this is the test macro that will show correct macro in workbook is called
varvar = ActiveWorkbook.Name
MsgBox "hi this is workbook " & varvar

End Sub
Run Code Online (Sandbox Code Playgroud)