zoukankan      html  css  js  c++  java
  • 用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 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 = '
    ************hello************
    
    '
    
    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 += "
    ************hello************
    
    "
                # totalStr += g
                totalStr += "=============================
    
    "
    
            else:
                continue
        return totalStr, sum
    
    
    totalStr, 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_Handle
    
    For 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 m
    
    Exit Sub
    Err_Handle:
    End Sub

    python代码

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

      

  • 相关阅读:
    Spring 中出现Element : property Bean definitions can have zero or more properties. Property elements correspond to JavaBean setter methods exposed by the bean classes. Spring supports primitives, refer
    java定时器schedule和scheduleAtFixedRate区别
    hql语句中的select字句和from 字句
    使用maven搭建hibernate的pom文件配置
    Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from http://repo.maven.apache.org/ maven2 was cached in the local repository, resolution will not be reattempted until the update interv
    对于文件File类型中的目录分隔符
    hibernate的事务管理和session对象的详解
    解决mac 中的myeclipse控制台中文乱码问题
    ibatis selectKey用法问题
    Java中getResourceAsStream的用法
  • 原文地址:https://www.cnblogs.com/renfanzi/p/7490619.html
Copyright © 2011-2022 走看看