【发布时间】:2017-09-12 22:14:04
【问题描述】:
我正在尝试使用 Python、Xlwings 库和 Excel 创建用户定义函数。
目标是使用一个函数,让我们调用 ret_data_frames 不仅填充 A1 单元格,还填充所有需要的单元格以返回整个数据帧。
如上图:
我使用的数据框是通过网络抓取获得的,并且尺寸很大,所以我让我们使用一个简单的数据框,如果可行,我将想法替换为我的原始代码
import numpy as np
import pandas as pd
def get_data_frame(data):
dates = pd.date_range(data,periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
之后,需要创建UDF函数
import xlwings as xw
from test import get_data_frame
@xw.func
def ret_data_frame(data):
return get_data_frame(data)
这个想法行不通,所以,问题是:
可以使用 UDF 来重现数据帧吗?
谢谢
【问题讨论】:
-
如果 UDF 作为数组公式输入(例如选择单元格 A1:D5,然后在单元格 A1 中键入
=ret_data_frame()并按 Ctrl-Shift-Enter 而不是仅 Enter)然后 UDF 可以返回一个数组(在本例中为 5x4 二维数组)。无论如何,这就是它与 VBA 一起工作的方式——它可能与 xlwings 一起工作,也可能不工作。 -
这个数据框的维度是动态的。我虽然关于使用数组公式,但是如何创建一个粘贴整个数据框的 UDF?使用数组的想法我不知道数据框的维度是多少。
-
在不使用数组公式的情况下,UDF 理论上只能向包含函数调用的单元格返回单个值。它理论上不能以任何其他方式修改 Excel 环境。 (“理论上”——因为有一些 [相当危险的] 方法可以绕过它。)
-
您能否添加一个工作表事件(可能是
Worksheet_SelectionChange或Worksheet_Calculate或Worksheet_BeforeDoubleClick)来调用您的函数。仅更新单个单元格的限制仅适用于 UDF(即从 Excel 单元格调用的函数),不适用于从事件调用的完全相同的代码。 -
明白。我认为我的想法无法实现。你回答了我的问题。如果您愿意,请发布此解决方案,我会接受答案。
标签: python excel vba user-defined-functions xlwings