やりたいこと
pythonのwin32com
ライブラリを使って、起動したエクセルのユーザフォームに値を入力したいと考えています。
Pythonのバージョン: 3.9.0
Excelのバージョン: Excel 2016
困っていること
以下のコードを実行して、ユーザフォームのtxtTest
に'test'
というテキストを入力したいです。
VBComponents("form_test")
の正体はユーザフォームで、Workbook_Open()
イベントの中でform_test.Show vbModeless
が走っています。
(vbModelessオプションは、Showイベントが走ってもエクセルを制御できるようにするために付けています。)
python
1import win32com.client 2 3app = win32com.client.Dispatch("Excel.Application") 4app.Visible = True 5app.DisplayAlerts = False 6 7wb = app.Workbooks.Open("test.xls") 8 9wb.VBProject.VBComponents("form_test").Designer.txtTest.Value = 'test' 10 11
VBA
1 2Private Sub Workbook_Open() 3 4 form_test.Show vbModeless 5 6〜大事な処理〜 7 8End Sub
このコードを実行すると、以下のエラーが出てしまいます。
AttributeError: 'NoneType' object has no attribute 'txtTest'
print(wb.VBProject.VBComponents("form_test").HasOpenDesigner) 実行結果: False
HasOpenDesigner
でDesignerの状態を確認するとFalse
になっています。
ユーザフォームを表示させた状態でDesignerをOpenにする方法を教えてください。
(なお、UserForm_Initialize()
の中で定義している初期化処理を走らせる必要があるので、ユーザフォームは表示させる必要があります。)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。