iT邦幫忙

3

python如何判斷xls裡有巨集

  • 分享至 

  • xImage

大家好, 我是 python 初學者, 目前使用 python 正在寫一個 xls2xlsx 程式, 但忽然想到有些 xls 裡有巨集存在, 不知道 python 要如何判斷 xls 裡有巨集?? 若 xls 有巨集則自動轉存成 xlsm

目前我是使用 win32com
我曾參考過這個文章 (Python win32com模块操作Excel:VBA模块读写)

會出現: 不信任以程式設計方式存取 Visual Basic 專案
不知道我錯在哪了

1.我是 office 2007
2.python 3.8.10, 模組全部更新到最新
3.已開啟信任中心的巨集設定: "啟用所有巨集"及勾選"信任存取VBA專案物件模型"

懇請各位幫忙

錯誤訊息:

R->D:\prg_python\test\test.xls
Traceback (most recent call last):
  File "D:\prg_python\xlsVba.py", line 27, in <module>
    vba = wb.VBProject.VBComponents.Count
  File "C:\Users\user\AppData\Roaming\Python\Python38\site-packages\win32com\client\dynamic.py", line 628, in __getattr__
    ret = self._oleobj_.Invoke(retEntry.dispid, 0, invoke_type, 1)
pywintypes.com_error: (-2147352567, '發生例外狀況。', (0, 'Microsoft Office Excel', '不信任以程式設計方式存取 Visual Basic 專案\n', 'C:\\Program Files (x86)\\Microsoft Office\\Office12\\1028\\XLMAIN11.CHM', 0, -2146827284), None)

測試用程式碼如下:

# python 3.8.1
#
# 自動版
#
#
import os
import sys
import win32com.client
from win32com.client import Dispatch
# 搜尋條件
import fnmatch

readDir =r"D:\prg_python\test"
writeDir = readDir
fileType = ["*.xls"]
xlsFile = "test.xls"

readFile = readDir + "\\" + xlsFile
w = win32com.client.Dispatch('Excel.Application')
w.Visible = 0
w.DisplayAlerts = 0
origin_val = w.Application.AutomationSecurity
w.Application.AutomationSecurity = 1
print("R->" + readFile )
wb = w.Workbooks.Open(readFile)       
vba = 0                   
vba = wb.VBProject.VBComponents.Count

if vba == 0:
   writeFile = readFile + "x"
   wb.SaveAs(writeFile,FileFormat = 51)
   print("W>>"+  writeFile)
else:
   writeFile = readFile + "m"
   wb.SaveAs(writeFile,FileFormat = 52)

wb.Close()
w.Application.AutomationSecurity = origin_val
w.Quit()# 退出
# 刪除舊檔
try:
   if vba == 0:
      os.remove(readFile)
except OSError as e:
   print(e)
else:
   print("File is deleted successfully")
                
sys.exit(0)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-06-10 17:28:05

根據這篇來看
python 不僅可以「讀 Excel 裡的VBA」,還可以「寫 VBA 進 Excel」

裡面也提到安全性的設定
你也已經設定了

唯一可能需要確定的一點
就是你設定的,是test.xls的安全性
而不是其他檔案的安全性

回頭想想我這個答案沒有什麼太大意義
如果真的是我想的這個答案
就變成要「手動」設定每個 Excel 檔案的安全性
那乾脆就「手動」另存新檔就好了
/images/emoticon/emoticon06.gif

goodnight iT邦研究生 2 級 ‧ 2022-06-11 09:45:30 檢舉

我的目的是需要知道 xls 裡有沒有 vba 巨集, 而我也不知道巨集的名稱, 所以在程式裡想法是如果有巨集, 就是轉存 xlsm, 目前在測試就卡死了

0
sn0wl3r0ker
iT邦新手 5 級 ‧ 2022-08-16 02:05:28

不知道你解決了沒有,最近也遇到這個問題...各種嘗試之後是解決了,但同時試太多種方法也不太確定到底是怎麼搞定的。不過我覺得你可以試試看w.Visible = True然後報錯後不要把Excel關掉,到他安全性那邊看看"信任存取VBA專案物件模型",我的是自動開的會跟自己開的設定不一樣zZZ 然後wb.Close(SaveChanges=1),不知道會不會解決,給你參考一下~

goodnight iT邦研究生 2 級 ‧ 2022-08-16 21:01:13 檢舉

我已經解決了, 感謝您

我要發表回答

立即登入回答