先说下背景环境

  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 savReaderWriter filepath = "/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 = 0 totalStr = '\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] + b
for zz in subvalueLables:
totalStr += a + excelList[i] + ":" + excelList[i] + b
totalStr += c + subvalueLables[zz] + d + subvalueLables[zz] + e + str(zz) + f
totalStr += g
sum += 1
totalStr += "\n************hello************\n\n"
# totalStr += g
totalStr += "=============================\n\n" else:
continue
return totalStr, sum totalStr, sum = vbaStr(totalStr, sum, readSpss) print(totalStr) print(sum)

用Python在执行vba命令方法,有点类似执行shell的形式,但必须在windows环境下面执行,不能在linux下面

注意问题:

  . 必须另存为xlsm文件格式

  . 第二,在执行Python脚本的时候必须是打开excel的

  . 必须新建模块(vba中)

  . vba代码必须有函数

  . office必须开启宏,否则不生效
  6. 打开vba快捷键alt + f11

最后看代码

vba代码

Sub test()    《============这个函数很重要,对应着python
Dim m
m =
Columns("G:G").Select
m =
On Error GoTo Err_Handle For m = To
Selection.Find(What:="男", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False, SearchFormat:=False).Activate
ActiveCell.Replace What:="男", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next m Exit Sub
Err_Handle:
End Sub

python代码

#!/usr/bin/env python
# -*- coding:utf- -*- import win32com.client filename = "C:/Users/Administrator/Desktop/test.xlsm"
xls = win32com.client.Dispatch('Excel.Application')
xls.Workbooks.Open(Filename=filename)
xls.DisplayAlerts =
xls.Run("test1")

用python批量执行VBA代码的更多相关文章

  1. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  2. pyv8的安装和使用:python中执行js代码

    pyv8 的作用是在python中执行js代码,然后可以使用js里的变量等内容.python取得javascript里面的值.javascript取得python里面的值.python和javascr ...

  3. Python批量执行oracle中的insert语句

    从oracle导出一个表的数据,导出的格式是insert语句,数据量30万. 直接在PL/SQL Developer中执行,速度非常慢,脚本中也是100条数据提交一次.因为需要的时间太长,每次中断后, ...

  4. python批量执行shell命令

    [root@master ~]# cat a.py #!/usr/bin/python # -*- coding:UTF- -*- import subprocess def fun(): subpr ...

  5. python爬虫执行js代码-execjs

    一.安装模块 pip install PyExecJS execjs会自动使用当前电脑上的运行时环境(建议用nodejs,与Phantomjs) 二.简单的使用 import execjs js_ob ...

  6. python批量执行脚本,使用unittest.TestSuit(); unittest.TextTestRunner().run(); addTest();unittest.defaultTestLoader.discover();

    #alltest.py中内容如下import unittest,osdef all(): #path="D:\\study\\python_api_test\\test1203" ...

  7. web自动化测试实战之批量执行测试用例

    01实战之分离测试固件 在UI 自动化测试中,不管编写哪个模块的测试用例,都需要首先在测试类中编写测试固件初始化WebDriver类及打开浏览器,执行登录,才能进行下一步业务逻辑的操作,测试用例执行完 ...

  8. Python 中使用 ddt 来进行数据驱动,批量执行用例,修改ddt代码

    1. 什么是数据驱动? 使用数据驱动有什么好处? 用例执行是靠数据来驱动的,每条测试用例除了测试数据不一样意外,所有的用例代码都是一样的,为了使用例批量执行,我们会使用数据驱动的思想来批量执行测试用例 ...

  9. python接口自动化(二十六)--批量执行用例 discover(详解)

    简介 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到 unittest 里面的 discover 方法来加载用例了.加载用例后,用 unittest 里 ...

随机推荐

  1. read/write函数与(非)阻塞I/O的概念

    一.read/write 函数 read函数从打开的设备或文件中读取数据. #include <unistd.h> ssize_t read(int fd, void *buf, size ...

  2. DevExpress导出Excel样式设置

    /// <summary> /// 导出到Excel /// </summary> /// <param name="gridControl"> ...

  3. php json的相关操作

    类与json <?php class userinfo { var $user_name; var $user_ip; var $user_logintime; } $u = new useri ...

  4. zookeeper集群的部署

    因为这里zookeeper的集群部署都会2n+1台 Dubbo建议使用Zookeeper作为服务的注册中心. Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基 ...

  5. Firefox清空缓存的快捷键

    有时候调试网页,需要清空缓存,常用的firefox清空缓存的快捷键: Shift+Ctrl+Delete

  6. SQL Server 创建约束图解 唯一 主键

    SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创 ...

  7. js正则匹配中文

    alert(/[\u4e00-\u9fa5]{4}/.test("司徒正美"))//true alert(/[\u4e00-\u9fa5]{4}/.test("司正美&q ...

  8. 用C++画光(一)——优化

    写在前面 在先前的画光系列中,实现实体几何.反射.折射等效果,但是最大的一个缺陷是复杂度太高.当采样是1024时,渲染时间直线上升(用4线程),以至好几个小时才能完成一副作品,实现太慢.然而,当我看到 ...

  9. Spring Boot干货系列:(一)优雅的入门篇

    Spring Boot干货系列:(一)优雅的入门篇 2017-02-26 嘟嘟MD 嘟爷java超神学堂   前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社 ...

  10. 又谈C++指针(1)

    写在前面的话:虽然这段代码中对于指针的使用是不正确的,但是我却在这个不正确的代码中发现了另一个错误,而且深感迷惑,所以打算将此博文推到首页,请各位帮忙回答个问题. 在项目中用到了以下一段代码,执行结果 ...