14

从VBA到Python,Excel工作效率如何提高?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxNTc0Mjg0Mg%3D%3D&%3Bmid=2653296664&%3Bidx=2&%3Bsn=514978d5051f23ff453f6095f0d3b76a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Vj6R3qb.jpg!web

标星★ 置顶 公众号      爱你们    

作者:Costas 

编译:1+1=6

1

前言

如果有一种方法可以将Excel与Python集成起来,该多好啊! 现在有了:

xlwings库允许我们通过VBA调用Python脚本来进行两者的交互!

FrYveme.png!web

2

为什么要将Python与Excel VBA集成?

事实上,你可以在VBA中做任何事情。那么为什么要使用Python呢?原因有很多:

1、你可以在Excel中创建一个自定义函数,而不需要学习VBA。

2、使用Python可以显著加快数据操作的速度。

3、Python中有各种各样的库(机器学习、数据科学等)、

4、因为你可以! !!

3

xlwings安装

第一步安装:

pip install xlwings

接下来,我们需要安装Excel集成部分:

xlwings addin install

在使用 Excel 2016的 Win10上,人们经常会看到以下错误:

26nuimu.png!web

你可以通过使用 mkdir 命令解决这个问题:

安装好一切:

6Z7je2q.png!web

4

启用xlwings的用户定义函数

首先我们需要加载 Excel 外接程序:

FNny63Z.png!web

最后,我们需要启用对 VBA 项目对象模型的信任访问。你可以通过导航到文件选项信任中心设置宏来做到这一点:

NRzMJv6.png!web

5

具体操作

有两种主要的方法可以使我们从 Excel 转换到 Python(以及转换回来)。第一种是直接从 VBA 调用 Python 脚本,另一种是通过用户定义函数调用。

为了我们每次都能正确设置,xlwings提供了创建Excel电子表格的功能:

xlwings quickstart ProjectName

上面的命令将使用 Excel 工作表和 Python 文件在预导航目录中创建一个新文件夹。

nmaiMrE.png!web

打开.xlsm文件,你会立即注意到一个名为 _xlwings.conf 的新Excel工作表。如果你希望覆盖xlwings的默认设置,只需重命名该工作表并删除开始的下划线即可。通过这些,我们就可以开始使用xlwings了。

6

从VBA到Python

在我们开始编码之前,让我们首先确保在同一个页面上。打开Excel VBA 编辑器,点击 Alt + F11。返回以下屏幕:

aYjaUvY.png!web

这里要注意的关键事情是,这段代码将做以下工作:

1、 在与电子表格相同的位置查找Python脚本。

2、查找与电子表格名称相同的Python脚本(扩展名为.py)。

3、 在Python脚本中,调用函数main()。

让我们看几个例子,看看如何使用它。

例1:在Excel外部操作,并返回输出。

在本例中,我们将看到如何在Excel之外执行操作,然后在电子表格中返回结果。

我们将从CSV文件中获取数据,对这些数据进行修改,然后将输出传递到Excel:

首先,VBA代码。

然后,Python代码:

import xlwings as xw
import pandas as pd
def main():
wb = xw.Book.caller()
df = pd.read_csv(r'C:\temp\TestData.csv')
df['total_length'] = df['sepal_length_(cm)'] + df['petal_length_(cm)']
wb.sheets[0].range('A1').value = df

结果如下:

Fb26zia.gif

例2: 从Excel中读取,用Python对其进行处理,然后将结果传递回Excel。

更具体地说,我们将读取一个 Greeting,一个 Name 和一个我们可以找到jokes的文件位置。 然后,我们的 Python 脚本将从文件中随机抽取一行,并返回一个jokes。

首先,VBA代码。

然后,Python代码:

import xlwings as xw
import random
def random_line(afile):
line = next(afile)
for num, aline in enumerate(afile, 2):
if random.randrange(num): continue
line = aline
return line

def main():
wb = xw.Book.caller()
listloc = str(wb.sheets[0].range('B3').value)
fhandle = open(listloc, encoding = 'utf-8')
wb.sheets[0].range('A5').value = wb.sheets[0].range('B2').value + ' ' + wb.sheets[0].range('B1').value + ' here is a joke for you'
wb.sheets[0].range('A6').value = random_line(fhandle)

结果如下:

6JjQfu6.gif

7

用户定义函数与xlwings

我们将以与以前几乎相同的方式更改python文件中的代码。为了把一个东西变成一个Excel用户定义函数,我们需要做的就是

与前面的方式大致相同,我们将更改 Python 文件中的代码,使其变成一个 Excel 用户定义函数,我们所需要做的就是包含@xw.func:

import xlwings as xw
@xw.func
def joke(x):
wb = xw.Book.caller()
fhandle = open(r'C:\Temp\list.csv')
for i, line in enumerate(fhandle):
if i == x:
return(line)

结果如下:

AZFR7vZ.gif

希望大家可以有所收获!

2020年第 25 篇文章

量化投资与机器学习微信公众号,是业内垂直于 Quant、MFE、 Fintech 、AI、ML 等领域的 量化类主流自媒体。 公众号拥有来自 公募、私募、券商、期货、银行、保险资管、海外 等众多圈内 18W+ 关注者。每日发布行业前沿研究成果和最新量化资讯。

你点的每个“在看”,都是对我们最大的鼓励


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK