You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动打开Excel可运行Bloomberg宏,Python程序化打开报Run-time error '1004'

解决Bloomberg Add-In宏在程序化打开Excel时的1004错误

可能的原因与对应解决方法

1. 以管理员权限运行Python进程

程序化启动Excel时,权限不匹配可能导致Bloomberg Add-In无法完成初始化。尝试:

  • 右键点击Python IDE或终端,选择以管理员身份运行后再执行打开Excel的脚本。
  • 若使用任务计划或自动化工具,确保进程配置了管理员权限。

2. 强制延迟等待Add-In完全加载

程序化打开Excel后,Add-In可能还未完成初始化就被调用宏,触发报错。在调用宏前加入足够时长的延迟:

  • xlwings示例:
    import xlwings as xw
    import time
    
    app = xw.App(visible=True)
    wb = app.books.open("你的工作簿路径.xlsx")
    # 等待30秒(可根据实际加载速度调整)
    time.sleep(30)
    wb.macro("RefreshEntireWorksheet")()
    
  • win32com示例:
    import win32com.client as win32
    import time
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    excel.Visible = True
    wb = excel.Workbooks.Open("你的工作簿路径.xlsx")
    time.sleep(30)
    excel.Run("RefreshEntireWorksheet")
    

3. 显式加载Bloomberg COM加载项

确保宏中先检查并加载Bloomberg的COM组件(而非仅Excel加载项):

Sub LoadBloombergCOMAddIn()
    Dim addIn As COMAddIn
    Dim isLoaded As Boolean
    
    ' 检查是否已加载Bloomberg COM组件
    For Each addIn In Application.COMAddIns
        If addIn.ProgID = "BloombergUI.Connect" Then
            addIn.Connect = True
            isLoaded = True
            Exit For
        End If
    Next addIn
    
    ' 未找到则尝试注册加载
    If Not isLoaded Then
        On Error Resume Next
        Application.COMAddIns.Add("BloombergUI.Connect").Connect = True
        On Error GoTo 0
    End If
End Sub

Sub RefreshEntireWorksheet()
    Call LoadBloombergCOMAddIn
    BloombergUI.RefreshEntireWorksheet ActiveSheet
End Sub

4. 禁用Excel受保护视图

程序化打开的文件可能触发受保护视图,限制Add-In功能:

  • 手动设置:打开Excel选项 → 信任中心 → 信任中心设置 → 受保护视图,取消所有勾选选项。
  • 脚本中直接禁用:
    # xlwings示例
    app = xw.App(visible=True)
    app.api.AutomationSecurity = 1  # 1代表低安全级别,允许所有宏与Add-In运行
    

5. 检查并初始化Bloomberg会话

程序化打开Excel时,Bloomberg可能未建立有效会话,先在宏中校验:

Sub CheckBloombergSession()
    Dim sessionID As Variant
    sessionID = BloombergUI.SessionID
    If IsEmpty(sessionID) Then
        BloombergUI.ResetSession
        ' 等待会话建立
        Application.Wait Now + TimeValue("00:00:10")
    End If
End Sub

Sub RefreshEntireWorksheet()
    Call CheckBloombergSession
    BloombergUI.RefreshEntireWorksheet ActiveSheet
End Sub

6. 确保Excel进程单实例运行

后台残留的Excel进程可能导致新实例无法共享Bloomberg会话,先关闭所有Excel进程再执行脚本:

import psutil

# 关闭所有Excel进程
for proc in psutil.process_iter(['name']):
    if proc.info['name'] == 'EXCEL.EXE':
        proc.kill()

# 再启动Excel执行后续操作
import xlwings as xw
app = xw.App(visible=True)
# ...你的代码逻辑

内容的提问来源于stack exchange,提问作者spinosaurus7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:12