Python调用Excel VBA的CommandButton1_Click报错找不到宏如何解决

解决方案
核心报错原因
按钮点击事件默认存放在工作表私有代码模块中,调用时必须指定完整的「工作簿+工作表」命名空间,同时你的代码存在只读模式开启、传参逻辑错误的问题,按以下步骤修正即可:
步骤1:确认VBA按钮事件声明
确认你在Лист3 (ОТЧЕТ_день)工作表的代码模块中,已经将按钮事件修改为Public类型:
Public Sub CommandButton1_Click() Call main(ActiveSheet.Name) MsgBox ("Готово!") End Sub
步骤2:使用修正后的Python代码
import os import win32com.client if os.path.exists(r'./Результат/Отчет_Собираемость — копия.xlsm'): excel_macro = win32com.client.DispatchEx("Excel.Application") excel_path = os.path.expanduser(r'\\guo.local\DFSFILES\MSK\HOME\dobychin.ia\Desktop\report collection\1 вариант(Загрузка данных - Python, формирование отчета -VBA)\Результат/Отчет_Собираемость — копия.xlsm') # 关闭只读模式,否则无法保存修改 workbook = excel_macro.Workbooks.Open(Filename=excel_path, ReadOnly=0) # 提前激活目标工作表,保证VBA中ActiveSheet指向正确 target_sheet = workbook.Worksheets("Лист3 (ОТЧЕТ_день)") target_sheet.Activate() # 完整路径格式:'带特殊字符的工作簿名'!工作表名.过程名 excel_macro.Application.Run("'Отчет_Собираемость — копия.xlsm'!Лист3 (ОТЧЕТ_день).CommandButton1_Click") workbook.Save() workbook.Close() excel_macro.Quit() del excel_macro
可选优化方案
如果不需要严格触发按钮点击的交互逻辑,也可以直接调用主宏main,主动传递工作表名,不需要修改按钮事件的Public属性:
# 替换Run调用行即可,main如果放在标准模块中不需要加工作表前缀 excel_macro.Application.Run("'Отчет_Собираемость — копия.xlsm'!main", "Лист3 (ОТЧЕТ_день)")
内容的提问来源于stack exchange,提问作者msk36
相关产品推荐
相关产品推荐

