用python批量执行VBA代码
生活随笔
收集整理的這篇文章主要介紹了
用python批量执行VBA代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先說下背景環境
1. 公司需要問卷調查,有兩份問卷, 1)是spss問卷,2)是excel問卷。spss問卷數據不全,但有各種標簽, excel呢, 生成的數據直接把選項變成了值
2. 現在需要把excel的選項值變成1, 2這種數字{1:“滿意”}
3. 妹子已經把vba寫好了。(不忍直視!)
?
由于需要執行很多vba命令,我就用py的字符串拼接,生成了,900多份,懷疑vba的代碼有問題,憑直覺,但我不會vba,又懶得查,只能讓cpu去做重復工作了
?
需要模塊win32com
安裝方法
```
python3 -m pip install pypiwin32
```
?
生成vba命令
#!/usr/bin/env python # -*- coding:utf-8 -*- import savReaderWriterfilepath = "/opt/code/my_code/testStata/5976d077606f07d4418b46eb160938.sav"a = '''Dim m m = 1 Columns("'''b = '''").Select m = 1 On Error GoTo Err_Handle'''c = '''For m = 1 To 65 Selection.Find(What:="'''d = '''", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate ActiveCell.Replace What:="'''e = '''", Replacement:="'''f = '''", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Next m '''g = ''' Exit Sub Err_Handle: End Sub'''sum = 0totalStr = '\n************hello************\n\n'excelList = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',"AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ","JA","JB","JC","JD","JE","JF","JG","JH","JI","JJ","JK","JL","JM","JN","JO","JP","JQ",]def readSpss():with savReaderWriter.SavReader(filepath, ioUtf8=True) as read:ret = read.getSavFileInfo()return ret[4], ret[2], ret[5], ret[6]def vbaStr(totalStr, sum, readSpss):formats, varnames, varLabels, valueLabels = readSpss()for i in range(len(varnames)):if varnames[i] in valueLabels:subvalueLables = {}for j in valueLabels[varnames[i]]:subvalueLables[int(j)] = valueLabels[varnames[i]][j]# totalStr += a + excelList[i] + ":" + excelList[i] + bfor zz in subvalueLables:totalStr += a + excelList[i] + ":" + excelList[i] + btotalStr += c + subvalueLables[zz] + d + subvalueLables[zz] + e + str(zz) + ftotalStr += gsum += 1totalStr += "\n************hello************\n\n"# totalStr += gtotalStr += "=============================\n\n"else:continuereturn totalStr, sumtotalStr, sum = vbaStr(totalStr, sum, readSpss)print(totalStr)print(sum) View Code?
用Python在執行vba命令方法,有點類似執行shell的形式,但必須在windows環境下面執行,不能在linux下面
注意問題:
1. 必須另存為xlsm文件格式2. 第二,在執行Python腳本的時候必須是打開excel的3. 必須新建模塊(vba中)4. vba代碼必須有函數5. office必須開啟宏,否則不生效6. 打開vba快捷鍵alt + f11
?
?
?
?
最后看代碼
vba代碼
Sub test() 《============這個函數很重要,對應著python Dim m m = 1 Columns("G:G").Select m = 1 On Error GoTo Err_HandleFor m = 1 To 65 Selection.Find(What:="男", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate ActiveCell.Replace What:="男", Replacement:="1", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Next mExit Sub Err_Handle: End Sub?
python代碼
#!/usr/bin/env python # -*- coding:utf-8 -*-import win32com.clientfilename = "C:/Users/Administrator/Desktop/test.xlsm" xls = win32com.client.Dispatch('Excel.Application') xls.Workbooks.Open(Filename=filename) xls.DisplayAlerts = 0 xls.Run("test1")??
總結
以上是生活随笔為你收集整理的用python批量执行VBA代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usermod命令 、用户密码管理、mk
- 下一篇: 【转】.so兼容32位和64位