Excel的录制宏功能,可以将一系列操作转换为VBA代码。其实,将这些代码稍作修改,便可在Python中使用。本文将录制一个简单的宏,并将其迁移到Python中,以此来讲解如何将VBA代码转变成Python代码。示例是一个简单的10×10乘法表,位于工作表单元格区域B2:K11,如下图1所示。图1(单元格C3中的公式为:=C$2*$B3,然后向下向右拖动复制)现在,将这个表扩展并格式化,并让Excel录制下这些操作。1.单击工作表左下角的“录制宏”按钮,Excel弹击“录制宏”对话框,如下图2所示,单击“确定”开始录制。2.选择数据区域的最后一行,即单元格区域B11:K11,向下拖动复制5行至第16行。3.选择数据区域的最后一列,即单元格区域K2:K16,向右拖动复制5列至列P。4.选择列B至列P,单击鼠标右键,从快捷菜单中选择“列宽”,在列宽中输入数字4,调整列宽。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 = 4
End Sub
7.新建一个带有上图1所示工作表的工作簿,将其保存为multitable.xlsx。8.打开Python的IDLE界面,输入下面的4条命令打开multitable.xlsx,如下图4所示。import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(r'C:\test\multitable.xlsx')
excel.Visible = True
其中,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").Select,Range对象属于Worksheet对象,因此需要创建指向这个工作表的对象,在Python中的语句为:ws =
wb.Worksheets('Sheet1')创建了引用工作表的ws对象后,将Range命令附加到ws并尝试。注意,在Python中,Select是一个函数,需要添加括号才能正确操作。在IDLE提示符中键入ws.Range(“B11:K11”).Select(),然后查看工作表,确认已选择了单元格区域B11:K11,如下图5所示。Selection.AutoFill
Destination:=Range("B11:K16"), Type:=xlFillDefault在现有表下面自动填充了5行。Selection属于Excel应用程序级的对象,因此在Python中需要添加前缀
excel;此外,使用关键字限定提供了参数Destination和Type,或者可以通过位置来提供参数值。有两种方法提供诸如示例xlFillDefault的常量值,一种是指定常量名,一种是指定常量值。要在Python中使用常量名,需要添加前缀win32.constants,在示例中为:Win32.constants.xlFillDefaultexcel.Selection.AutoFill(Destination=ws.Range("B11:K16"),Type=win32.constants.xlFillDefault)excel.Selection.AutoFill(ws.Range("B11:K16"),
win32.constants.xlFillDefault)注意,此语句之前还要进行单元格区域选择。如下图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')import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(r'C:\test\multitable.xlsx')
excel.Visible = True
ws = 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 = 4
wb.SaveAs(r'C:\test\multitable.xlsx')
excel.Application.Quit()
注:本文学习整理自pythonexcels.com,供有兴趣的朋友参考。欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。