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.
谢谢.
我认为的问题是,当您将相同的宏名称绑定到快捷键时,将打开的第一本书将分配给该快捷键.
解决方法是使另一个宏根据工作簿名称调用正确的宏.这可能需要您将某些工作簿和工作表替换为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)
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |