步骤1 启动Excel并创建一个空白工作簿,单击“文件->选项”命令,打开“Excel选项”对话框。
步骤2 在“Excel选项”对话框左侧单击“信任中心”选项,在右侧单击“信任中心设置”按钮
步骤3 在打开的“信任中心”对话框左侧单击“宏设置”选项,在右侧单击“启用VBA宏(不推荐;可能会有潜在危险的代码)”单击按钮,勾选“启用VBA宏时启用Excel 4.0宏(X)”,勾选“信任对VBA工程对象模型的访问”复选框,单击“确定”按钮
说明:勾选“启用VBA宏时启用Excel 4.0宏(X)”。是因为有时候该文档的宏代码中使用了属于Excel 4.0宏的函数。
安全风险提醒:
若非确信你使用的文档是安全的,应禁用 “Excel 4.0宏”!
Excel 4.0宏(XLM)是Visual Basic for Applications(VBA)的前身,是出于向下兼容的需求而被纳入Microsoft Excel的一个遗留功能。微软在其支持文件中也曾警告,如果启用所有的宏将会导致 "潜在危险代码 "的运行。
步骤4 在“Excel选项”对话框中单击“确定”按钮,返回工作表中,切换到“开发工具”选项卡,在“加载项”组中单击“Excel加载项”按钮
步骤5 打开“加载项”对话框,如果在“可用加载宏”列表框中未看到xlwings插件,则单击“浏览”按钮
步骤6 打开“浏览”对话框,进入Python安装路径下的“site-packages”文件夹,找到并打开xlwings模块的文件夹,打开“addin”文件夹,选中名为“xlwings.xlam"的Excel加载宏文件,单击”确定“按钮
步骤7 随后”Xlwings“插件会自动显示在”可用加载宏“列表框中,勾选该插件的复选框,单击”确定“按钮
步骤8 返回工作簿,即可在功能区看到”xlwings“选项卡
完成了xlwings插件的加载后,就可以在该选项卡下导入并调用Python自定义函数,准备一个带宏工作簿(扩展名为”.xlsm“)和一个包含自定义函数的Python代码文件(扩展名为".py")。常用的操作模式有两种。
xlwings模块提供的quickstart命令可以快速创建带宏工作簿和Python代码文件,再以这两个文件为模块进行修改,就能实现Python自定义函数的导入和调用。
步骤1 按快捷键【Win+R】,在打开的“运行”对话框中输入“cmd”,按【Enter】键,打开命令行窗口,在当前路径后输入磁盘盘符“D:”,按【Enter】键,表示要在C盘创建带宏工作簿和Python代码文件,当前路径转到D盘的根文件夹下后,输入命令“xlwings quickstart table”,按【Enter】键,等待一段时间,如果出现xlwings的版本信息,就表示带宏工作簿和python代码文件已经创建成功。
提示
这里是在D盘的根文件夹下进行创建,如果要在D盘的其他已有文件夹下创建,可以先输入“cd 文件夹名",按【Enter】键,将当前路径转到对应的文件夹下,在执行quickstart 命令。
命令“xlwings quickstart table”中的“table”是指要创建的文件夹以及文件夹中的带宏工作簿和Python代码文件的文件名,这个名称可根据实际需求更改。
步骤2 随后进入D盘,可以看到文件夹下创建了一个名为“table”的文件夹,打开该文件夹,可以看到“table.py”和“table.xlsm”两个文件
步骤3 打开“table.py”文件,可看到该文件包含自动生成的4段代码,我们可以用该文件作为模板,编写自定义函数。
例如,在代码末尾输入自定义函数double_sum()的代码段,该函数用于返回两个数之和的两倍。
步骤4 以”table.py"文件中的默认自定义函数hello()和自己编写的自定义函数double_sum()为例,演示如何在Excel中导入并调用Python自定义函数。在Excel中打开步骤2中创建的“table.py”,切换至“xlwings”选项卡,单击“User Defined Functions(UDFs)”组中的“import Functions”按钮
步骤5 现在就可以在工作表中像使用Excel工作表函数那样调用导入的Python自定义函数了。
在单元格A1中输入文本“Tom”,然后再单元格B1中输入公式“=hello(A1)",按【Enter】键,即可得到hello()函数的执行结果。再单元格A2和A3中分别输入数值25和45,然后再单元格A4中输入公式“=double_sum(A2,A3)”,按【Enter】键,即可得到double_sum()函数的计算结果。
上面介绍的这种操作模式有一个前提条件:带宏工作簿和Python代码文件必须位于同一个文件夹下,并且具有相同的文件主名。如果带宏工作簿和Python代码文件不在同一个文件夹下,或者文件主名不同,则需要在Excel的“xlwings”选项卡下设置Python代码文件的位置和名称,才能导入Python自定义函数。
为了便于演示,将前面创建的“table.xlsm”文件复制到其他位置,然后将文件名改为“自定义函数.xlsm”,(建议尽量使用由xlwings模块的quickstart命令创建的带宏工作簿,而不要自己创建,以免在后续操作时出错)。
步骤1 在Excel中打开“自定义函数.xlsm”文件,切换至“xlwings”选项卡,在“Python”组中的“PYTHONPATH”文件框中输入要导入Python自定义函数的“table.py”文件所在的位置“D:\table”
步骤2 在“User Defined Functions(UDFs)”组中的是“UDF Modules”文本框中输入要导入Python自定义函数的“table.py”文件的名称“table”。
步骤3 在“User Defined Functions(UDFs)”组中单击“import Functions”按钮,在单元格A1中输入公式“=double_sum(25,45)”,按【Enter】键,同样可以成功地调用自定义函数double_sum()完成计算
如果对Excel VBA比较熟悉,还可以在VBA代码中调用Python自定义函数,将两种编程语言的特长相结合,更加灵活、高效地完成工作
通过xlwings模块提供的quickstart命令可以快速创建带宏工作簿和包含自定义函数的Python代码文件,并且省去引用xlwings模块的操作。
步骤1 使用1.2.1介绍的方法在D盘中创建一个名为“helloworld”的文件夹,该文件夹中会自动生成“helloworld.py”和“helloworld.xlsm”两个文件。
步骤2 打开“helloworld.xlsm”文件,在“开发工具”选项卡下单击“Visual Basic”按钮或按快捷键【Alt+F11】,打开VBA编辑器。在左侧的“工程”界面中双击名为“Module1”的模块,可在右侧的代码窗口中看到一段自动编写好的VBA代码,如下图所示。这段代码表示调用当前工作簿所在文件夹下的同名Python代码文件(这里就是“helloworld.py”)中的自定义函数main()。
提示
步骤2打开的VBA编辑器中的代码
Sub SampleCall() # 表示宏开始的关键词,空格后是宏的名称,这里为“SampleCall”,可以根据需求更改这个名称。
mymodule = Left(ThisWorkbook.name, (InStrRev(ThisWorkbook.name, ".", -1, vbTextCompare) - 1)) # 表示获取当前工作簿的文件主名(文件名中“.”之前的部分),为后续导入Python代码文件做好准备。
RunPython "import " & mymodule & ";" & mymodule & ".main()" # 表示导入与当前工作簿同名的Python代码文件,然后调用其中的自定义函数main()。因为未指定文件路径,所以默认导入当前工作簿所在文件夹下的Python代码文件。
End Sub # 表示宏的结束
步骤3 关闭VBA编辑器,在“开发工具”选项卡下单击“宏”按钮或按快捷键【Alt+F8】,打开“宏”对话框,选择要执行的宏“SampleCall”,单击“执行”按钮
步骤4 自定义函数main()的代码和1.2.1介绍的相同,表示在当前工作簿的第一个工作表的单元格A1中输入“Hello xlwings!”。因此,执行宏“SampleCall”后,工作表“Sheet1”的单元格A1中会自动输入“Hello xlwings!”。
步骤5 前面调用的是quickstart命令自动生成的函数,如果想要调用自己编写的自定义函数,则打开步骤1中创建的“helloworld.py”文件,在末尾输入自定义函数的代码段。创建一个名为double_sum()的自定义函数
import xlwings as xw
def main():
wb = xw.Book.caller()
sheet = wb.sheets[0]
if sheet["A1"].value == "Hello xlwings!":
sheet["A1"].value = "Bye xlwings!"
else:
sheet["A1"].value = "Hello xlwings!"
@xw.func
def hello(name):
return f"Hello {name}!"
if __name__ == "__main__":
xw.Book("helloworld.xlsm").set_mock_caller()
main()
@xw.sub # 该函数只能在VBA中调用
def double_sum():
wb = xw.Book.caller() # 用变量wb代表调用本函数的工作簿,也就是当前工作簿
x = wb.sheets[0].range("B1").value
y = wb.sheets[0].range("C1").value # 将当前工作簿第1个工作表的单元格B1和C1中的值分别赋给变量x和y
a = str(2 * (x + y)) # 计算x加y之和的两倍,然后将计算出的值转换为字符串,在将这个字符串赋给变量a
wb.sheets[0].range("A1").value = a # 将变量a的值(一个字符串)写入第1个工作表的单元格A1中。
步骤6 打开工作簿“helloworld.xlsm”的VBA编辑器,将“Module1”模块代码中的函数名“main()”更改为“double_sum()”
步骤7 关闭VBA编辑器,在单元格B1和C1中分别输入数值20和10,然后执行宏“SampleCall”,即可看到单元格A1中显示的自定义函数double_sum()的计算结果。
步骤1 打开Excel,创建一个空白工作簿,添加一个工作表并命名为“统计表”,在其中输入各个产品的销售数据,如下图所示。现在需要将不同产品的销售数据提取出来分别保存;将产品“背包”的销售数据提取出来保存在工作簿“背包.xlsx”中,将产品“行李箱”的销售数据提取出来保存在工作簿“行李箱.xlsx”中,依次类推。
步骤2 编写Python自定义函数来完成步骤1中提出的要求,打开Python代码编辑器(如IDLE),输入如下代码,创建自定义函数table()。
import xlwings as xw
def table():
workbook = xw.books.open('D:\产品统计表.xlsm')
worksheet = workbook.sheets['统计表']
value = worksheet.range('A2').expand('table').value
data = dict()
for i in range(len(value)):
product_name = value[i][1]
if product_name not in data:
data[product_name] = []
data[product_name].append(value[i])
for key,value in data.items():
new_workbook = xw.books.add()
new_worksheet = new_workbook.sheets.add(key)
new_worksheet['A1'].value = worksheet['A1:H1'].value
new_worksheet['A2'].value = value
new_workbook.save('D:\{}.xlsx'.format(key))
步骤3 将步骤1和步骤2创建的文件保存在同一个文件夹下,如D盘的根文件夹下,分别命名为“产品统计表.xlsm”和“example.py”,如下图所示。在保存工作簿时要注意选择保存类型为“Excel启用宏的工作簿(*.xlsm)”。
步骤4 编写VAB代码来调用Python自定义函数。返回工作簿“产品统计表.xlsm”的窗口,按快捷键【Alt+F11】打开VBA编辑器。在左侧的“工程”界面中右击“产品统计表.xlsm”文件,在弹出的快捷菜单中执行“插入>模块”命令。
步骤5 在打开的模块代码窗口中输入如下图所示的VBA代码。第1行代码中的example为定义的宏名;第2行代码中的example为要导入的Python代码文件名,table()为要从Python代码文件中调用的自定义函数名。
步骤6 编写完VBA代码,还需要再VBA中引用xlwings模块,才能实现Python自定义函数的调用。
单击“工具”按,在弹出的菜单中执行“引用”命令。
步骤7 打开“引用——VBA-Project”对话框,勾选“xlwings”复选框,单击“确定”按钮,这样就完成了xlwings模块的引用。
提示
在2.2.1编写完VBA代码后没有引用xlwings模块,这是因为该节中的带宏工作簿是用quickstart命令创建的,该命令在创建带宏工作簿时会自动添加对xlwings模块的引用,无须手动操作。这里的带宏工作簿是手动创建的,所以需要手动添加对xlwings模块的引用。
步骤8 关闭VBA编辑器,按快捷键【Alt+F8】打开“宏”对话框,执行宏“example”,即可在D盘中看到拆分出的工作簿,如下图所示
步骤9 双击打开任意一个拆分出的工作簿,如“单肩包.xlsx”,可看到该工作簿的工作表“单肩包”中只有单肩包的销售数据。
一部分使用VBA代码完成,另一部分使用Python代码来完成,通过工作表中的特定单元格在两种代码之间传递参数。
步骤1 在D盘中创建文件夹“产品统计表”,在该文件中创建Python代码文件“header.py”和空白带宏工作簿“产品统计表.xlsm”(其中有3个空白工作表)
步骤2 打开“header.py”文件,在该文件中输入如下代码。这段代码创建了一个名为header()的自定义函数,该函数先根据当前工作簿第1个工作表的单元格F100中的值选择一个工作表,然后在所选工作表的单元格区域A1:E1中依次输入指定的列标题。
import xlwings as xw
def header():
workbook = xw.Book.caller()
worksheet = workbook.sheets[0]
i = worksheet.range('F100').value
sheet = workbook.sheets[i]
sheet.range('A1').value = '单号'
sheet.range('B1').value = '产品名称'
sheet.range('C1').value = '成本价(元/个)'
sheet.range('D1').value = '销售价(元/个)'
sheet.range('E1').value = '销售数量(个)'
步骤3 打开工作簿“产品统计表.xlsm”,按快捷键【Alt+F11】进入VBA编程环境,根据2.2中步骤4的方法为工作簿插入一个模块,在打开的模块代码窗口中输入如下图所示的VBA代码,随后根据2.2中步骤6和步骤7的方法在VBA中引用xlwings模块。
注意
单元格并不是固定不变的,可以将其改为其他单元格,只需要保证Python代码中读取的单元格和VBA代码中写入的单元格相同。
单元格不能与要输入列标题的单元格区域重叠,可尽量离要输入列标题的单元格区域远一些。
步骤4 关闭VBA编辑器,切换至工作表“Sheet1”,按快捷键【Alt+F8】,打开“宏”对话框,选择宏“header”,单击“执行”按钮
步骤5 随后即可在工作表“Sheet1”的单元格区域A1:E1中看到输入的列标题,如下图所示。
切换至工作表“Sheet3”,再次执行宏“header ”,可以看到该工作表的单元格区域A1:E1中也输入了相同的列标题。
为了更方便地实现批量操作,可以使用PyInstaller模块将编写好的Python代码转换为可执行程序(扩展名为“.exe”),这样在没有安装Python编程环境及相关模块的计算机上也能直接运行Python代码。
PyInstaller模块需要自行安装,通常使用pip安装法,输入的命令为“pip install pyinstaller”。
语法格式:
PyInstaller 参数1 参数2 ··· 参数n xxx.py
参数 | 含义 |
-F,--onefile | 产生单个的可执行程序文件 |
-D,--onedir | 产生一个文件夹,其中包含可执行程序文件 |
-w,--windowed, --noconsole |
程序运行时不显示命令行窗口(仅对Windows有效) |
-c,--nowindowed, --console |
程序运行时显示命令行窗口(仅对Windows有效) |
-o DIR,--out=DIR | 指定spec文件的生成文件夹。如果没有指定,则默认使用当前文件夹来生成spec文件 |
-p DIR,--path=DIR | 设置Python导入模块的路径(和设置PYTHONPATH环境变量的作用相似)。也可使用路径分隔符(Windows使用分号,Linux使用冒号)来分隔多个路径 |
-n NAME, --name=NAME |
指定项目(生成的spec文件)的名字。如果省略该选项,则使用第一个Python代码文件的文件主名作为spec文件的名字 |
-i FILE,--icon=FiLE | 指定可执行程序的文件图标 |
使用PyInstaller模块对Python代码进行打包操作。
假设D盘的根文件夹下有一个Python代码文件“test.py”和一个工作簿“相关性分析.xlsx”。
打开“ 相关性分析.xlsx”文件,其内容为某计算机软件公司部分代理商的年销售额与年广告费投入额、成本费用、管理费用等数据。
打开“test.py”文件,其中的代码如下:
import pandas as pd
df = pd.read_excel('相关性分析.xlsx', index_col = '编号')
result = df.corr()['年销售额(万元)']
print(result)
input()
上述代码用于从工作簿“相关性分析.xlsx”中读取数据,然后计算年销售额和其他3种费用的相关系数。
以上述两个文件为例,将Python文件打包为可执行程序的操作方法。
步骤1 按快捷键【Win+R】,在打开的“运行”对话框中输入“cmd",然后单击“确定”按钮,在打开的命令行窗口中输入“test.py”文件所在的磁盘的盘符“D:”,按【Enter】键,当前路径切换为D盘的根文件夹,输入命令“pyinstaller -F -n test_exe test.py”。命令中的参数“-F”表示生成单个的可执行程序,参数“-n"后的内容为生成的可执行程序的文件主名,此处设置为“test_exe”。
步骤2 按【Enter】键,执行上面输入的命令,随后将看到详细的生成过程,当出现“completed successfully”的提示文字时,表示命令成功执行完毕。
步骤3 此时在D盘下会生成一个名为“dist”的文件夹
步骤4 双击打开该文件夹,可看到一个名为“test_exe.exe”的文件,它就是不需要Python编程环境也能运行代码的可执行操作。将D盘中的工作簿“相关性分析.xlsx”复制到“dist”文件夹中,然后将“dist”文件夹复制到另一台没有安装Python编程环境的计算机上,双击其中的可执行程序。
步骤5 可以看到成功运行了Python代码,计算出年销售额和其他3种费用之间的相关系数。
在实际应用中,需要判断相关性的数据可能不同于3.2中的工作簿数据,此时仍然可以用前面生成的可执行程序来计算相关系数,只不过数据的格式要符合一定的要求。
步骤1 在“dist”文件夹中新建一个空白工作簿,重命名为“相关性分析.xlsx”,双击该工作簿。需要注意的是,新建工作簿的文件名必须与3.2节中的“test.py”文件第2行代码中的工作簿文件名相同。
步骤2 在单元格A1和B1中分别输入“编号”和“年销售额(万元)”。需要注意的是,这两个单元格中输入的内容必须与3.2中“test.py”文件第2行和第3行代码中设置的列名相同。
步骤3 在A列和B列中输入编号和年销售额数据,然后在C列中输入要判断与年销售额相关性的项目数据。假设只想要判断年销售额和成本费用的相关性,则在C列中输入成本费用的数据。
步骤4 保存并关闭该工作簿,在"dist"文件夹中双击“test_exe.exe”文件,即可得到如下图所示的运行结果。
在工作表中调用Python自定义函数 ,这些案例中使用到的数据文件请点击这里 【免费】在工作表中调用Python自定义函数所需要的数据文件.zip资源-CSDN文库