如何在xlwings中将日期作为参数传入Python函数
解决VBA调用Python函数时日期参数无法识别的问题
问题根源
你当前的写法里,VBA传的28.09.2023在Python中是非法语法——Python会把连续的点号当成错误的数值格式,既不是字符串也不是日期类型,直接导致调用失败,更没法用strftime方法。
两种可行解决方案
方案1:VBA传字符串日期,Python解析为datetime
- 修改VBA代码,把日期用单引号包裹,以字符串形式传递:
RunPython ("import mypythonfile; mypythonfile.myfunction(cob_ToGet='28.09.2023')") - 修改Python函数,使用
datetime.strptime将字符串解析为datetime对象:from datetime import datetime def myfunction(cob_ToGet): # 按指定格式解析字符串为datetime cob_date = datetime.strptime(cob_ToGet, "%d.%m.%Y") print(cob_date.strftime("%d.%m.%Y"))
方案2:VBA传原生日期值,Python转换为datetime
VBA中的日期本质是双精度浮点数(整数部分是1899-12-30以来的天数,小数部分是时间占比),可以直接传递数值给Python再转换:
- VBA代码定义日期变量并传递:
Dim targetDate As Date targetDate = #28/09/2023# ' VBA日期格式用#包裹,格式需匹配区域设置,如mm/dd/yyyy RunPython ("import mypythonfile; mypythonfile.myfunction(cob_ToGet=" & targetDate & ")") - Python函数转换数值为datetime:
from datetime import datetime, timedelta def myfunction(cob_ToGet): # VBA日期起点是1899-12-30,转换为Python datetime base_date = datetime(1899, 12, 30) cob_date = base_date + timedelta(days=cob_ToGet) print(cob_date.strftime("%d.%m.%Y"))
注意事项
- 方案1中要保证VBA传的字符串格式和Python
strptime的格式串完全匹配,比如日期是2023-09-28时,格式串要改成%Y-%m-%d; - 方案2中VBA的日期起点是1899-12-30(历史遗留的基准值,并非1900-01-01),转换时必须用这个基准日期。
内容的提问来源于stack exchange,提问作者Thanasis
相关产品推荐
相关产品推荐

