gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:34:57 26 4
gpt4 key购买 nike

Excel 中有一个已经编写好的宏,并且报告了有关此问题的错误,我必须修复此问题。初步调查如下...有一个ABC.xls 文件,其中包含

现在,宏有一个名为 changeTheCodesub,当我按 Ctrl + M 时,它就会被调用。

此子命令将打开一个打开文件对话框,用户可以在其中选择 CSV 文件。我存储在所有函数外部声明的全局变量中的 CSV 文件的路径...

Public txtFileNameAndPath As String

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

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call saveUnicodeCSV
Call deleteXLS
End Sub

我使用此 ABC.xls 文件打开 ABC123.CSV 文件。

我使用此 DEF.xls(ABC.xls 的副本)文件来打开 DEF123.CSV 文件。但是,当我使用 Ctrl + M 打开 DEF123.CSV 时,ABC.xls 的子 changeTheCode 是被调用并且 DEF.xls 的全局变量 txtFileNameAndPath 为空,当我关闭 Excel 时,因此不会保存内容。

enter image description here

设置全局变量的代码。

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

有关如何处理此问题的意见将对我有很大帮助。

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

谢谢。

最佳答案

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

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

这只是我尝试过的示例代码,但请根据您的需要进行编辑。我尝试制作两个文件 a.xlsm 和 b.xlsm。区别是 a.xlsm 在第一行有 msgbox“a”,b.xlsm 在第一行有 msbox“b”。您可以先打开 a.xlsm 然后打开 b.xls 进行检查。然后指定相同的快捷键。您将看到,当您在 b.xlsm 中运行 Ctrl+M 时,将运行的宏将位于 a.xlsm 中,并带有 msgbox“A”,但随后它将调用 b.xlsm 中的正确宏。

简答

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

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

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




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

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

关于vba - 如果打开 2 个具有相同宏的相似 xls 文件,则全局变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45464200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com