【问题标题】:runtime error executing macro in excel 2010在 excel 2010 中执行宏的运行时错误
【发布时间】:2012-05-08 10:05:32
【问题描述】:

我收到了:

运行时错误“1004”:无法运行宏 Makros.xlm!MakroIni。这 宏在此工作簿中可能不可用,或者所有宏都可能是 已禁用。

...在某些 Excel 2010 实例中运行宏时。在某些 Excel 2010 安装和 Excel 2003 中,它可以正常工作。

涉及 2 个工作簿:Macro.xlm 和 Username.xls。这两个文件都存储在远程服务器上。

宏在执行时崩溃:

Workbooks.Open Makro_Path & Makro_Nam, ReadOnly:=True
Application.Run Makro_Nam & "!MakroIni", WbTyp

第一行正确执行,所有宏都可见。 Makro_Nam 定义为:

Public Const Makro_Nam As String = "Makros.xlm"

我能做什么?

【问题讨论】:

  • 愚蠢的猜测,但是:在那个 excel 实例中是否启用了宏?
  • 是的,在所有情况下都启用了宏。宏实际上会运行到那个特定点。
  • 您是否尝试过使用全名(类似于Application.Run "'" & Makro_Path & Makro_Nam & "'!MakroIni")?
  • 我试过了,还是没有区别。
  • 我刚刚注意到出现此问题的实例是 64 位安装。从旧工作簿运行其他宏时,我收到一个错误,我应该安全运行它们。

标签: vba excel excel-2010


【解决方案1】:

实际上原因是 Excel 64 位。

Makro.xlm 工作表包含以下函数定义:

Private Declare  Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare  Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" ( _
ByVal hFindFile As Long, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare  Function FindClose Lib "kernel32.dll" ( _
ByVal hFindFile As Long) As Long
Private Declare  Function FileTimeToLocalFileTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpLocalFileTime As FILETIME) As Long
Private Declare  Function FileTimeToSystemTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpSystemTime As SYSTEMTIME) As Long

我把它们改成了 ptrsafe:

Private Declare PtrSafe Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare PtrSafe Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" ( _
ByVal hFindFile As Long, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare PtrSafe Function FindClose Lib "kernel32.dll" ( _
ByVal hFindFile As Long) As Long
Private Declare PtrSafe Function FileTimeToLocalFileTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpLocalFileTime As FILETIME) As Long
Private Declare PtrSafe Function FileTimeToSystemTime Lib "kernel32.dll" ( _
ByRef lpFileTime As FILETIME, _
ByRef lpSystemTime As SYSTEMTIME) As Long

现在它似乎工作了。

【讨论】:

    【解决方案2】:

    根据你的宏的作用,显而易见的答案似乎是你需要设置

    ReadOnly:=True
    

    成为

    ReadOnly:=False
    

    以便您的宏可以更改数据。

    【讨论】:

    • 是的,看起来有点明显,但这不是问题的原因。 Macro.xlm 工作表不包含数据。它仅包含在所有用户工作表中使用的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多