【问题标题】:python Win32 Excel is cell a rangepython Win32 Excel是单元格一个范围
【发布时间】:2015-06-04 18:48:07
【问题描述】:

我正在编写一些 Python 代码来自动处理 Excel 电子表格。这个想法是使用电子表格模板来创建每日报告。几年前使用 Perl 看到了这个想法。无论如何。

以下是简单的规则: 带有工作簿的工作表按照它们出现的顺序进行处理。 在工作表中,单元格从左到右,然后从上到下进行处理。 定义的名称是单个单元格范围,可以包含静态值或查询结果。单元格可以包含包含要运行的 SQL 查询的 cmets。 ...

这是问题所在,当我处理单元格时,我需要检查单元格是否有附加注释以及单元格是否有名称。我能够处理附加的细胞 cmets。但我不知道如何确定单元格是否在命名范围内。在我的情况下,范围内的单个单元格。

我看到一个帖子建议这会起作用: cellName = ws.ActiveCell.Name.Name 没有运气。

有人知道怎么做吗? 我很近,但没有雪茄。

感谢您对此事的关注。

KD

【问题讨论】:

  • 不确定它是否有用,但在 VBA 中你会这样做:Intersect(ActiveCell, Range("MyRange"))。如果它们相交则返回范围对象,否则返回Nothing
  • 是的,我在一些帖子中看到了这一点。这意味着我必须遍历工作簿中的名称范围并进行相交测试。希望有更优雅的东西。感谢您的建议。
  • “没有运气”是什么意思? ActiveCell.Name 应该适合你。如果这产生错误,则单元格本身没有名称。要获得实际名称,您可以:ActiveCell.Name.Name 如您所说。同样,这是在 Excel VBA 中。我不知道winapi。
  • ActiveCell.Name.Name 抛出了一个错误。哦,也许这是意料之中的。我会再试一次。
  • 只有在ActiveCell没有名字的情况下才会报错。

标签: python vba winapi range


【解决方案1】:

您可能会考虑首先构建工作表中所有名称地址的列表,然后根据列表检查每个单元格的地址以查看它是否已命名。

在 VBA 中,您可以通过以下方式获取名称集合(工作簿中的所有名称):

Set ns = ActiveWorkbook.Names

您可以通过这种方式确定名称是否指向当前工作表的一部分和单个单元格:

shname = ActiveSheet.Name
Dim SheetNamedCellAddresses(1 To wb.Names.Count) as String
i = 1
For Each n in ns:
If Split(n.Value, "!")(0) = "=" & shname  And InStr(n.Value, ":") = 0 Then
' The name Value is something like "=Sheet1!A1"
' If there is no colon, it is a single cell, not a range of cells
SheetNamedCellAddresses(i) = Split(n,"=")(1) 'Add the address to your array, remove the "="
i = i + 1
End If
Next

所以现在你有一个字符串数组,其中包含当前工作表中所有命名单元格的地址。将该数组移动到 python 列表中,您就可以开始了。

【讨论】:

  • 请注意,如果有“!”,这个答案可能会变得笨拙。和“:”在您的名称定义中的其他位置(例如,作为引号内的字符串)。
  • 瑞克非常感谢您的指导。我已经打算在 python 中使用哈希来存储名称和相关值。我将逐步浏览该列表,而不是使用我们上面讨论的异常处理。如上所述。再次感谢
【解决方案2】:

好的,如果单元格没有范围名称,它会出错。如果单元格具有范围名称,则以下代码将返回名称:非常成功!

ws.Cells(r,c).Activate()
c  = xlApp.ActiveCell
cellName = c.Name.Name 

如果没有与单元格关联的名称,则会抛出异常。
因此,即使在 VBA 中,您也必须将这段代码包装在异常代码中。对我来说,为此调用使用异常处理听起来很昂贵。

【讨论】:

  • 听起来确实很昂贵——尽管在 python 中使用异常作为流控制是“正确的方法”,但 VBA 当然不是 python。我想知道问题是否出在您的方法上:单独遍历和处理每个单元格从来都不是在 VBA 中做事的好方法。 slooooooow 电子表格。
  • 我建议您查看 xlwings 而不是使用 winapi,但我不确定您是否可以按照您需要的粒度检查 cmets 等。
  • 我需要检查单个单元格中的 cmets 以找到要运行的 SQL。然后看看cell有没有名字
  • 我需要检查单个单元格中的 cmets 以找到要运行的 SQL。然后查看单元格是否有名称,如果单元格有名称,那么我需要将值存储在单元格中,因为它可能会在稍后的处理中使用。可能作为稍后 SQL 语句中的参数。无论如何,只会扫描前 100 个 50 的第一个。那说你可能是对的也许应该命名所有需要访问的单元格,然后我可以使用 wookbook.Names 来获取要访问的单元格。
  • 我看了 xlwings。我不能指望我的用户安装 Python。
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多