Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将参数传递到Excel';win32com中的s Range.Value(RangeValueDataType)_Python_Excel_Win32com_Vba - Fatal编程技术网

Python 将参数传递到Excel';win32com中的s Range.Value(RangeValueDataType)

Python 将参数传递到Excel';win32com中的s Range.Value(RangeValueDataType),python,excel,win32com,vba,Python,Excel,Win32com,Vba,我正在尝试使用win32com/python在Excel中获取一系列单元格的内部颜色。循环通过每个单元格不是一个选项,因为需要3到5秒才能完成,而颜色每秒钟都会改变 使用似乎有帮助,但win32com不喜欢将任何参数传递给Range.Value import win32com.client as win32 excel = win32.Dispatch('excel.application') fileName = r"myFile.xlsm" myBook = excel.Workbooks

我正在尝试使用win32com/python在Excel中获取一系列单元格的内部颜色。循环通过每个单元格不是一个选项,因为需要3到5秒才能完成,而颜色每秒钟都会改变

使用似乎有帮助,但win32com不喜欢将任何参数传递给Range.Value

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
在Excel中的VBA中执行myRange(“I3:AL32”).Value(11)效果很好,但我无法创建自定义UDF并使用应用程序。也无法从Win32 COM中运行,因为基本Excel文件中已运行VBA代码(这是更改单元格颜色的第一步)


是否有其他方法将该参数传递到Range.Value?

我不确定这是否是您想要的结果,不幸的是,它使用的不是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。

我不确定它是否是您想要的结果,不幸的是,它不是使用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。

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

我使用myRange.\u print\u details\uz()来显示可从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>

我自己也在玩这个游戏,我找到了一个答案,这个答案将适用于win32com

我使用myRange.\u print\u details\uz()来显示可从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>

如果您在执行VBA的同时尝试此操作,则不确定单线程Excel UI进程将如何使用此操作。VBA循环中有一个DoEvents,用于为单元格着色。现在,我只是在DoEvents之后加入一个Sheets(“AnotherSheet”).Range(“A1”)=myRange.Value(11),然后让win32com从临时助手单元格中获取输出。这是工作,但我不想添加VBA行。哦,好吧。如果您在VBA执行的同时尝试使用单线程Excel UI进程,则不确定该进程将如何工作。VBA循环中有一个DoEvents,用于为单元格着色。现在,我只是在DoEvents之后加入一个Sheets(“AnotherSheet”).Range(“A1”)=myRange.Value(11),然后让win32com从临时助手单元格中获取输出。这是工作,但我不想添加VBA行。哦,好吧。