【问题标题】:pywin32 selecting all data in an excel columnpywin32选择excel列中的所有数据
【发布时间】:2019-05-30 17:51:51
【问题描述】:

我对python很陌生,但以前用过excel VBA。 我正在尝试使用 pywin32 模块,因为它使用 COM 来打开和读/写 excel 以及许多其他原因..

我在 pywin32 中编写公式以在 excel 中编写(即 SUM、除法、减号等)没有问题。但我在 python 中编写诸如 xlUp、CountIF 等函数时遇到问题。

在下面的代码中,我正在尝试编写一个代码来检查列中所有单元格的重复项(即“C”列)

你能帮忙看看下面的代码吗?:

from win32com.client import Dispatch
from pathlib import Path
from datetime import datetime
import win32com.client.dynamic
data_folder = Path("C:/..")
file_open = data_folder / "something.xlsx"

xl = Dispatch("Excel.Application")

wb1 = xl.Workbooks.Open(Filename=file_open)
ws1 = wb1.Worksheets(1)

Target = ws1.Range("C3", ws1.Range("C", ws1.Rows.Count).End(xlUp)).Select

for r In Target:
   r.Offset(0, 1) = WorksheetFunction.CountIf(Target, r.Value) > 1

excel.Application.quit()

我不知道为什么它不起作用..如何将 VBA 翻译成 Python?

谢谢

【问题讨论】:

    标签: excel python-3.x vba pywin32


    【解决方案1】:

    概括最后一个问题的答案:

    pywin32 代码通常非常接近于 VBA 代码的一对一翻译。但是需要进行一些小的更改。喜欢:

    • 许多常量,不是由 pywin32 定义的。定义了常数 xlUp。但它是 达到 win32.constants.xlUp。所以它解释了你遇到的一个问题
    • 未定义其他常量。您需要在 Microsoft API 文档中查找该值。例如“LookAt=xlWhole”变为 LookAt=1
    • VBA 到 python 的翻译在调用函数时使用括号不同。这意味着 VBA 中的某些属性最终需要“()”才能成为有效代码。选择就是一个例子。它需要用作“.Select()”而不是“.Select”才能工作。这解释了您遇到的另一个问题。
    • 一对一翻译的主要例外是“偏移”。由于某种奇怪的原因,Offset(x,y) 不起作用。无论您在 VBA 中的何处使用“Offset(x,y)”,都必须使用“GetOffset(x,y)。这解释了您的代码不起作用的第三个原因。
    • 最后,python 中的变量应该以小写字母开头。这样做是安全的,并避免使用可能有意义的变量名。 “Target”更安全地表示为“mytarget”或不太可能与内置函数发生冲突的东西。

    我没有测试代码,但我上面指出的几点确实会阻止您的代码运行。通过上述更改,我相信它会起作用。大多数 VBA 代码在 pywin32 中按预期工作,只是遵守上述规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2020-10-29
      • 1970-01-01
      • 2013-10-10
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多