将参数传递给win32com中的Excel的Range.Value(RangeValueDataType)

时间:2018-03-18 21:32:01

标签: python excel excel-vba win32com vba

我正在尝试使用win32com / python在Excel中获取一系列单元格的内部颜色。循环遍历每个单元格不是一个选项,因为每当颜色每秒变化时需要3到5秒钟完成。

使用Range.Value(11)似乎可以提供帮助,但是当任何参数传递给Range.Value时,win32com不喜欢它。

import win32com.client as win32
excel = win32.Dispatch('excel.application')

fileName = r"myFile.xlsm"
myBook = excel.Workbooks(fileName)
mySheet = myBook.Sheets('Sheet1')
myRange = mySheet.Range('I3:AL32')

myState = myRange.Value # is acceptable but useless
myState = myRange.Value(11) # TypeError: 'tuple' object is not callable

执行myRange(“I3:AL32”)。Excel中VBA中的值(11)工作正常,但是我无法在win32com中创建自定义UDF并使用Application.Run,​​因为已经在内部运行了VBA代码基础Excel文件(这首先是改变单元格的颜色)。

是否有另一种方法可以将该参数传递给Range.Value?

2 个答案:

答案 0 :(得分:2)

我不确定这是你想要的结果,不幸的是它没有使用win32com.client而是comtypes.client,但如果你尝试:

import comtypes.client # unfortunately not win32com
excel = comtypes.client.CreateObject('Excel.Application')

fileName = r"myFile.xlsx" # I used .xlsx but should work with .xlsm
myBook = excel.Workbooks.Open(fileName)
mySheet = myBook.Sheets('Sheet1')
myRange = mySheet.Range('I3:AL32')

myState = myRange.Value(11) #with comtypes.client you can use the parameter 11
print myState

您打印的内容如下:

<?xml version="1.0"?>
......
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s21">
   <Interior ss:Color="#00B0F0" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s23">
   <Interior ss:Color="#E26B0A" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s25">
   <Interior ss:Color="#00FF00" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s26">
   <Interior ss:Color="#C0504D" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s27">
   <Interior ss:Color="#60497A" ss:Pattern="Solid"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Sheet1">
......

您可以在其中找到我在示例中使用的不同颜色的代码。 希望它对你有用,即使它不是win32com。

答案 1 :(得分:2)

我自己正在玩这个,我找到了一个适用于win32com的答案

我使用myRange._print_details_()来显示com对象的可访问内容,并得到以下内容:

Methods:
     GetValue
     SetValue
Props:
Get Props:
    Value = 0x6 - <win32com.client.build.MapEntry object at 0x00000184975AA160>
Put Props:
    Value = 0x6 - <win32com.client.build.MapEntry object at 0x00000184975AA1D0>

所以我可以告诉Value是一个允许你使用myRange.value获取或设置值的预言

但是还有GetValue和SetValue ......

所以不要使用myRange.Value(11)..你想使用:

myRange.GetValue(11) # you can now pass the paramter to get xlRangeValueXMLSpreadsheet