То, что вы делаете, не работает, потому что эта строка
ws.Cells(6,1).Value = "["GREEN", "YELLOW", "RED", "WHITE", "NOT SURE"]" //I want drop down here
устанавливает значение ячейки, как и предыдущие строки. (Или, скорее, пытаясь установить его: эта строка содержит две синтаксические ошибки, одну в кавычках и одну в комментарии.)
Но вы не хотите устанавливать значение ячейки, вы хотите применить проверку к ячейке. Поэтому вам необходимо установить атрибуты объекта ws.Cells(6,1).Validation
.
Если взять только код внутри вашего try...except
предложения, это будет выглядеть так:
xl = Dispatch("Excel.Application")
xl.Visible = 0 # Not really such fun to watch because the code below closes down Excel
# straightaway. xl.Visible = 1 will just show a screen flicker.
wb = xl.Workbooks.Open(Filename=path1)
ws = wb.Worksheets(1)
ws.Cells(1,1).Value = "GREEN"
ws.Cells(2,1).Value = "YELLOW"
ws.Cells(3,1).Value = "RED"
ws.Cells(4,1).Value = "WHITE"
ws.Cells(5,1).Value = "NOT SURE"
# Set up validation
val = ws.Cells(6,1).Validation
val.Add(Type=3, AlertStyle=1, Operator=1, Formula1="=Sheet1!A1:A5")
val.IgnoreBlank = -1
val.InCellDropdown = -1
val.InputTitle = ""
val.ErrorTitle = ""
val.InputMessage = ""
val.ErrorMessage = ""
val.ShowInput = -1
val.ShowError = -1
wb.Close(SaveChanges=True)
xl.Quit()
Строки, которые устанавливают валидацию, в точности соответствуют примеру, приведенному в моей ссылке. Объекты, которые win32com
получает из Excel, не являются объектами Python: это тонкие оболочки Python для объектов VBA, и эти объекты VBA следуют собственным соглашениям, а не соглашениям Python. Таким образом, код Python точно соответствует VBA, за исключением синтаксиса. Разница только в косметике.
.Add
получает скобки, потому что функции в Python должны иметь их (методы VBA этого не делают).
- Именованные параметры для методов получают Python
=
, а не VBA :=
.
- Константы, такие как
xlBetween
представляют целочисленные значения; Вы можете найти значения на MSDN .
- VBA определяет
True
как -1
. 1
или True
, вероятно, также будет работать: я не пробовал.
- Python не имеет эквивалента оператора
with
VBA, поэтому val
должен быть явным в присваиваниях, таких как val.ErrorMessage = ""
, а не неявным, как в VBA.
Это результат, который я получил.