分享

分享:想学python excel vba的看这篇文章就够了,能让你快速上手。

 江海博览 2023-10-29 发布于浙江

本篇文章的大纲:

一、前言

主要讲python调用VBA用到的库。

二、Python怎么调用VBA对象、方法和属性

主要讲怎么创建一个Application对象,python怎么访问Application下的对象的方法和属性,对象和对象之间的关系。

三、怎样能快速编出python操作VBA的程序

主要讲让你怎么能快速了解VBA程序有哪些对象、方法和属性。拿出一个批量对Excel工作表打印页面进行设置的案例,告诉你怎样快速编出你想要的程序。

一、前言

首先讲下为什么不用学VBA编程,就可以用python调用VBA。python调用的只不过通过COM接口来调用程序中的对象。说白了就是使用python的编程语法去调用程序中的对象。

python调用程序VBA一般使用pywin32中的win32com模块,当然pywin32不止win32com一个模块,她还包含了win32gui模块 windows图形界面接口模块、win32api:Windows开发接口模块。这里主要讲的是win32com.client模块。我们可以通过这个模块来通过COM接口来与程序对象进行交互。

所以我们只需要了解要访问程序中都有哪些对象、属性和方法,以及对象之间的关系就可以了。python访问VBA程序的对象的方法,就像再用python调用模块中的方法和属性的写法是一样的使用点操作符。

二、Python怎么调用VBA对象、方法和属性

一个程序最上层是程序对象Application,我们最先需要用win32com.client模块创建一个Application对象。然后把Application对象的Visible属性设置为True,python就会打开运行程序并显现程序。

import win32com.client as win32 excelapp = win32.gencache.EnsureDispatch('Excel.Application') #创建Excel程序对象 excelapp.Visible = True #显示程序窗口 wordapp = win32.gencache.EnsureDispatch('Word.Application') #创建word程序对象 wordapp.Visible = True pptapp = win32.gencache.EnsureDispatch('PowerPoint.Application')#创建ppt程序对象 pptapp.Visible = True cadapp = win32.dynamic.Dispatch('AutoCAD.Application')#创建autocad程序对象

好了了解完怎样用python创建和运行并显示一个VBA程序对象,以Excel VBA为列,先看下Excel程序中最常用的几个对象和对象的关系。

分享:想学python excel vba的看这篇文章就够了,能让你快速上手。

上图显示了ExcelVBA中常用的对象之间的关系,最上层是Application程序对象,下层是Workbooks工作簿集合对象,接着是Workbook工作簿和Worksheets工作表集合,这里需要注意以下workbook对象下面的Sheets工作表集合对象,Sheets是所有种类的工作表的集合,Worksheets集合和他下面的Worksheets是普通工作表对象,Sheets和Worksheets集合都包含Worksheet普通工作表对象,Worksheet普通工作表对象下面是Range集合,Range集合下面是Range单元格。

对象与对象之间和对象下方法、属性的调用,和python调用模块内对象的使用方法是一样的,使用点操作符。下面是对象之间调用的例子的代码。

import win32com.client as win32
app = win32.gencache.EnsureDispatch('Excel.Application')  #Excel程序
app.Visible = True #显示程序
owb = app.Workbooks.Open(Filename='D:\打印样表.xlsx', AddToMru=True) 
#用Workbooks的Open方法打开一个Excel文件工作簿,并返回一个Wrokbook对象
ows = owb.Worksheets('一号店')
#用Workbook对象下的Worksheets工作表集合对象,调用一个叫“一号店”的工作表,并返回一个Wroksheet对象
ows.Range('J3').Value = 123
#Worksheet('一号店')工作表对象下Range('J3')单元格对象的Value属性,给J3单元格赋值。
awb = app.Workbooks.Add()
#用Workbooks的Add方法新建一个Excel文件工作簿,并返回一个Wrokbook对象
awb.Worksheets(1).Range('A1').Value = '给新建工作簿对象下第一个工作表对象A1单元格对象赋值'

VBA中的对象相当于python中的类,方法是函数,属性可以给对象属性赋值或者返回对象的属性值或者对象。

下图是Excel VBA常用对象的常用方法和属性。

分享:想学python excel vba的看这篇文章就够了,能让你快速上手。

三、怎样能快速编出python操作VBA的程序

一个VBA程序中往往有大量的对象,实际上我们并不需要全部了解,我们只需要了解几个主要的对象的属性和方法,以及怎么获得程序中主要对象的方法,再用获得的对象用点操作符去调用对象的方法和属性,剩下的就需要在你想实现某些功能在去了解就可以了。

当我们知道VBA中主要对象的获得方法,怎样编出我们想要的程序呢?现在拿出一个批量对工作表的打印页面进行设置的案例,来看下怎么能快速了解学习VBA中的对象、方法和属性以及快速实现你想要做的程序。

批量是个重复的步骤,所以是个循环,使用python的循环语句就能达到,我们先把循环中的其中一个步骤拿出来进行分解,先实现一个对工作表的打印页面设置的步骤。

可是设置工作表的打印页面的VBA代码我不会怎么办,没关系!支持VBA的程序都支持录制宏功能,我们先把想要做的事先录制成宏,在宏代码中去了解其中哪些是主要对象的对象或者属性和方法,在通过主要的对象去调用他们就可以实现你想要的结果了。

好了正式开始,下面我会讲写怎么把VBA宏代码转换成python的代码中的一些重要事项。

先录制一个设置工作表打印页面设置的宏代码,office Excel要在选项中把开发工具选上才能看到宏功能,wps要安装vba插件才行。先点录制宏,再选一个工作表,把想要对工作表的页面设置做哪些修改,一步一步的设置一遍,然后停止录制宏。在点击菜单上的宏(wps叫VB宏)按钮,选择刚录制好的宏代码,点编辑这样就弹出了VBA编辑器,并显示刚才录制好的宏代码。

With ActiveSheet.PageSetup .LeftHeader = '' .CenterHeader = '' .RightHeader = '' .LeftFooter = '' .CenterFooter = '' .RightFooter = '' .Orientation = xlLandscape .Zoom = 100 .FirstPageNumber = True .LeftMargin = 54.141732 .RightMargin = 54.141732 .TopMargin = 72 .BottomMargin = 72 .HeaderMargin = 36 .FooterMargin = 36 .CenterFooter = '' .CenterHorizontally = True .CenterVertically = True .PrintErrors = xlPrintErrorsDisplayed .Order = xlDownThenOver .PrintGridlines = False .PrintHeadings = False .BlackAndWhite = False .PrintQuality = 600 .PaperSize = xlPaperA4 .PrintComments = -4142 .PrintArea = '' .PrintTitleRows = '$1:$3' .PrintTitleColumns = '' End With End Sub

看下录制好的VBA宏代码,代码中With语句和python的with关键字是不一样的,VBA中的With主要作用,是为了避免重复写一个对象前缀名称,上面代码ActiveSheet.PageSetup对象只要声明了With,这个对象在With代码块中就可以免写了,直接在代码块中用点加属性和对象就可以了。

这时候就可以通过VBA手册或者在网上查下VBA宏代码中的对象从属于哪个对象,和对象属性、方法的作用。还有一个好的办法,在VBA编辑器中按F2,会弹出对象浏览器。

分享:想学python excel vba的看这篇文章就够了,能让你快速上手。
分享:想学python excel vba的看这篇文章就够了,能让你快速上手。

ActiveSheet是Application下的一个属性,主要作用是返回一个被激活的Worksheet对象,PageSetup是一个Class是一个对象,她也是Worksheet的成员属性对象,所以可以通过Worksheet.PageSetup进行调用。

知道对象和对象的关系后,就可以了解下对象的属性和方法了,这个需要查了,看哪些属性和方法你是需要的。

    With ActiveSheet.PageSetup
        .LeftHeader = '' #设置页眉左侧内容
        .CenterHeader = '' #设置页眉中间内容
        .RightHeader = '' #设置页眉右侧内容
        .LeftFooter = '' #设置页脚左侧内容
        .CenterFooter = '' #设置页脚中间内容
        .RightFooter = '' #设置页脚右侧内容
        .Orientation = xlPortrait #页面方向 
        .Zoom = False #如果为True则忽略 FitToPagesWide 和 FitToPagesTall 属性
        .FitToPagesWide = 1 #几页宽 Zoom参数为False 生效
        #参数0 正常打印 参数1 所有列打印在一页 
        .FitToPagesTall = 0 #几页高 Zoom参数为False 生效
        #参数0 正常打印 参数1 所有行打印在一页 
        .FirstPageNumber = True #起始页码
        .LeftMargin = 82.488189 #左侧页面边距 单位磅
        .RightMargin = 82.488189 #右侧页面边距
        .TopMargin = 100.346457 #上方页面边距
        .BottomMargin = 100.346457 #下方页面边距
        .HeaderMargin = 36 #页眉边距
        .FooterMargin = 64.346457 #页脚边距
        .CenterHorizontally = True #水平居中
        .CenterVertically = True #垂直居中
        .PrintGridlines = False #打印网格线
        .PrintHeadings = False #如果打印本页时同时打印行标题和列标题,则该值为True。
        .BlackAndWhite = False #文档中的元素以黑白方式打印
        .PrintQuality = 600 #设置打印质量
        .PaperSize = xlPaperA4 #打印纸张类型
        .PrintArea = '$A$1:$D$2292' #设置打印区域
        .PrintTitleRows = '$1:$1' #设置标题行
    End With

然后把这些属性和方法改写到python中。

ps=ows.PageSetup ps.Orientation = xlLandscape #页面方向 ps.PrintTitleRows = '$1:$3' #设置标题行

上面是改写后的代码,我只想批量设置下打印区域,还有顶端行标题。这里到改写成python代码的重点了,你会发现上面代码中ps.Orientation = 2,而VBA代码是.Orientation = xlLandscape,那是因为VBA中有大量的常量变量,这些常量是pywin32库中没有的,所以需要通过对象浏览器查找相应常量的值。

分享:想学python excel vba的看这篇文章就够了,能让你快速上手。

查到xlLandscape的值是2所以改写成ps.Orientation = 2。

好了单一步骤我们做好了开始写循环获得Worksheet对象然后,对打印页面进行批量设置。

mport win32com.client as win32

app = win32.gencache.EnsureDispatch('Excel.Application')  #Excel程序
app.Visible = True
owb = app.Workbooks.Open(Filename='D:\打印样表.xlsx', AddToMru=True)
sheetnames = ['一号店', '二号店', '三号店']
for i in sheetnames:
    ows = owb.Worksheets(i)  #通过工作表名称返回一个Worksheet对象
    ps = ows.PageSetup  #通过Worksheet对象调用PageSetup对象对页面进行设置
    ps.Orientation = 2  #页面方向
    ps.PrintTitleRows = '$1:$3'  #设置标题行

如果工作表特别多怎么办,难道我们还要挨个敲吗,还可以先用python获得所有工作表的名字,在复制到代码中。

import win32com.client as win32 app = win32.gencache.EnsureDispatch('Excel.Application') #Excel程序 app.Visible = True owb = app.Workbooks.Open(Filename='D:\打印样表.xlsx', AddToMru=True) sheetcoutn = owb.Worksheets.Count#获取工作簿中工作表的数量 '''for i in range(1, sheetcoutn + 1): print(owb.Worksheets(i).Name''' #通过Wroksheet工作表的索引号获取对象,在通过Name获得工作表的名字 nameslist=[owb.Worksheets(i).Name for i in range(1, sheetcoutn + 1)] #改写成列表推导式 print(nameslist) #输出结果 ['三号店', '二号店', '一号店', 'Sheet1']

文章到此结束。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多