社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Excel与Python:一步步教你将VBA代码变成Python

完美Excel • 2 年前 • 1264 次点击  
学习Excel技术,关注微信公众号:
excelperfect

标签:ExcelPython

Excel的录制宏功能,可以将一系列操作转换为VBA代码。其实,将这些代码稍作修改,便可在Python中使用。本文将录制一个简单的宏,并将其迁移到Python中,以此来讲解如何将VBA代码转变成Python代码。

示例是一个简单的10×10乘法表,位于工作表单元格区域B2:K11,如下图1所示。

1(单元格C3中的公式为:=C$2*$B3,然后向下向右拖动复制)
现在,将这个表扩展并格式化,并让Excel录制下这些操作。

1.单击工作表左下角的“录制宏”按钮,Excel弹击“录制宏”对话框,如下图2所示,单击“确定”开始录制。

2
2.选择数据区域的最后一行,即单元格区域B11:K11,向下拖动复制5行至第16行。

3.选择数据区域的最后一列,即单元格区域K2:K16,向右拖动复制5列至列P

4.选择列B至列P,单击鼠标右键,从快捷菜单中选择“列宽”,在列宽中输入数字4,调整列宽。

结果如下图3所示。

3
5.单击工作表左下角的“停止录制”按钮。

6.Alt+F11组合键,打开VBE编辑器,双击左侧工程资源管理器中的“模块1”,在右侧代码窗口中可以看到类似下面的代码:

Sub 宏1()''1'' Range("B11:K11").Select


    
 Selection.AutoFill Destination:=Range("B11:K16"), Type:=xlFillDefault Range("B11:K16").Select Range("K2:K16").Select Selection.AutoFill Destination:=Range("K2:P16"), Type:=xlFillDefault Range("K2:P16").Select Columns("B:P").Select Selection.ColumnWidth = 4End Sub

7.新建一个带有上图1所示工作表的工作簿,将其保存为multitable.xlsx

8.打开PythonIDLE界面,输入下面的4条命令打开multitable.xlsx,如下图4所示。

import win32com.client as win32excel = win32.gencache.EnsureDispatch('Excel.Application')wb = excel.Workbooks.Open(r'C:\test\multitable.xlsx')excel.Visible = True

注意,我将工作簿保存在C盘的test文件夹。

4
其中,import win32com.client as win32语句导入win32模块。

excel = win32.gencache.EnsureDispatch('Excel.Application')语句,附加到正在运行的Excel进程,或者在需要时打开一个新的Excel进程。

wb = excel.Workbooks.Open(r'C:\test\multitable.xlsx')语句,打开工作簿。通常,需要运行excel.Workbooks.Open()来打开一个现有Excel文件,或者excel.Workbooks.Add()来创建一个新工作簿。

excel.Visible = True语句使Excel可见。

在我们录制的宏中,每一条语句:Range("B11:K11").SelectRange对象属于Worksheet对象,因此需要创建指向这个工作表的对象,在Python中的语句为:

ws = wb.Worksheets('Sheet1')

创建了引用工作表的ws对象后,将Range命令附加到ws并尝试。注意,在Python中,Select是一个函数,需要添加括号才能正确操作。在IDLE提示符中键入ws.Range(“B11:K11”).Select(),然后查看工作表,确认已选择了单元格区域B11:K11,如下图5所示。

5
VBA中,使用语句:

Selection.AutoFill Destination:=Range("B11:K16"), Type:=xlFillDefault

在现有表下面自动填充了5行。Selection属于Excel应用程序级的对象,因此在Python中需要添加前缀 excel;此外,使用关键字限定提供了参数DestinationType,或者可以通过位置来提供参数值。

有两种方法提供诸如示例xlFillDefault的常量值,一种是指定常量名,一种是指定常量值。要在Python中使用常量名,需要添加前缀win32.constants,在示例中为:

Win32.constants.xlFillDefault

针对自动填充语句,完整的Python代码为:

excel.Selection.AutoFill(Destination=ws.Range("B11:K16"),Type=win32.constants.xlFillDefault)

或者:

excel.Selection.AutoFill(ws.Range("B11:K16"), win32.constants.xlFillDefault)

注意,此语句之前还要进行单元格区域选择。如下图6和图7所示。

6

7
接下来是选择列B至列P并设置其列宽为4。在VBA中,语句Columns("B:P").Select属于Worksheet对象,因此转换为Python时在其前面添加ws.前缀并在Select函数后添加括号:

ws.Columns("B:P").Select()

同样,Selection属于Excel对象,因此将VBA语句转换成Python时在其前面添加excel.前缀:

excel.Selection.ColumnWidth = 4

至此,将示例VBA代码转换成Python代码已经完成。最后是保存修改后的工作簿并退出:

wb.SaveAs(r'C:\test\multitable.xlsx')

excel.Application.Quit()

上述操作完整的Python代码如下:

import win32com.client as win32excel = win32.gencache.EnsureDispatch('Excel.Application')wb = excel.Workbooks.Open(r'C:\test\multitable.xlsx')excel.Visible = Truews = wb.Worksheets('Sheet1')ws.Range("B11:K11").Select()excel.Selection.AutoFill(Destination=ws.Range("B11:K16"),Type=win32.constants.xlFillDefault)ws.Range("K2:K16").Select()excel.Selection.AutoFill(ws.Range("K2:P16"),win32.constants.xlFillDefault)ws.Columns("B:P").Select()excel.Selection.ColumnWidth = 4wb.SaveAs(r'C:\test\multitable.xlsx')excel.Application.Quit()

下面是示例中VBAPython语句对比表。

8
注:本文学习整理自pythonexcels.com,供有兴趣的朋友参考。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153128