質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2168閲覧

pythonからMacro呼び出し時に2回マクロが実行される

cc000072

総合スコア28

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/05 05:12

編集2021/10/06 06:08

【課題】
pythonからExcel Macroを呼び出しマクロを実行しています。しかし、pythonからマクロを呼び出すと2回実行されてしまいます。Macro側でLoopは使っていないのですが、2回実行されてしまい困っています。

【ロジック】
Macroを呼び出すpythonコード

python

1private_wb = excel.Workbooks.Open("マクロの格納先パス") 2data_sheet = private_wb.Worksheets("Data") 3excel.Application.Run("Macro.Load_NAV_Data()")

Macro

1標準モジュール 2Sub Load_NAV_Data() 3 4 On Error GoTo ERR_HANDLER 5 Dim strSQL As String 6 Dim strStandardDate As String 7 Dim intNumberColumns As Long 8 Dim intNumberRows As Long 9 10 Dim objCol As Object 11 Dim ingColSu As Long 12 Dim iCols As Long 13 14 15 '-------------------------------- 16 ' データベース接続 17 '-------------------------------- 18 19 20 '-------------------------------- 21 ' 基準価額の基準日を取得 22 '-------------------------------- 23 StandardDateForm.Show 24 strStandardDate = StandardDateForm.StandardDate 25 Unload StandardDateForm 26 27 If strStandardDate = StrConv(strStandardDate, vbWide) Then 28 29 strStandardDate = StrConv(strStandardDate, vbNarrow) 30 31 End If 32 33 MsgBox strStandardDate 34 35 '-------------------------------- 36 ' SQLの実行 37 '-------------------------------- 38 Dim Rs As New ADODB.Recordset 39 Set Rs = New ADODB.Recordset 40 Rs.CursorLocation = adUseClient 41 42 strSQL = "SELECT HR.ID," 43 strSQL = strSQL & "HR.EMPNAME " 44 strSQL = strSQL & "FROM HR " 45 strSQL = strSQL & "WHERE (HR.基準日_文字型='" & strStandardDate & "') AND (HR.WORKINGYEAR>$0)" 46 47 Rs.Open strSQL, cn 48 49 '-------------------------------- 50 ' カラム名を取得 51 '-------------------------------- 52 53 54 For intNumberColumns = 0 To Rs.Fields.Count - 1 55 56 Worksheets("NAV Price").Cells(1, intNumberColumns + 1).Value = Rs.Fields(intNumberColumns).Name 57 58 Next intNumberColumns 59 60 61 '-------------------------------- 62 ' 取得データをセルに一括出力 63 '-------------------------------- 64 intNumberRows = 2 65 66 Do Until Rs.EOF 67 68 Cells(intNumberRows, 1).Value = Rs.Fields("ID").Value 69 Cells(intNumberRows, 2).Value = Rs.Fields("EMPNAME").Value 70 71 intNumberRows = intNumberRows + 1 72 Rs.MoveNext 73 74 Loop 75 76' Set objCol = Rs.Fields 77' ingColSu = objCol.Count 78 79 80 '-------------------------------- 81 ' データベース切断 82 '-------------------------------- 83 84 If Not Rs Is Nothing Then 85 If Rs.State = adStateOpen Then Rs.Close 86 Set Rs = Nothing 87 End If 88 If Not cn Is Nothing Then 89 If cn.State = adStateOpen Then cn.Close 90 Set cn = Nothing 91 End If 92 93 cn.Close 94 Rs.Close 95 96ERR_HANDLER: 97 98 'エラーメッセージ 99 Debug.Print Err.Number & ")" & Err.Description 100 MsgBox Err.Number & ")" & Err.Description 101 102 '-------------------------------- 103 ' データベース切断 104 '-------------------------------- 105 If Not Rs Is Nothing Then 106 If Rs.State = adStateOpen Then Rs.Close 107 Set Rs = Nothing 108 End If 109 If Not cn Is Nothing Then 110 If cn.State = adStateOpen Then cn.Close 111 Set cn = Nothing 112 End If 113 114End Sub

Macro

1入力フォーム 2Public StandardDate As String 3 4Private Sub OKButton_Click() 5 6 StandardDate = Me.StandardDateInputBox 7 Me.Hide 8 9End Sub

【したいこと】
マクロで入力フォームを呼び出して、値を入力しそれをVBA側に渡します。1回入力後に同じ入力フォームが表示されてしまうので、2回目を表示しないようにしたいと考えています。

皆様のお知恵を拝借できればと思っております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hex309

2021/10/05 08:33

提示いただいたコードだけでは、1回呼び出しで終わるように見えます。 マクロ側でイベントが走るなどして入力フォームが表示される、ということはないでしょうか? いずれにせよ、ピンポイントではなく、もう少しコードを提示いただいたほうがよいかと思います。
bsdfan

2021/10/05 11:50

ファイルをオープンしたときに自動でマクロが実行される設定になってるとかはないですか?
cc000072

2021/10/06 00:25

hex309さん 失礼致しました、DB接続文字部分は割愛して全ロジック記載しました bsdfanさん Worksbook_openやAuto_Open等は使っておりません。。
hex309

2021/10/06 00:40

コードの提示ありがとうございます。 もう少し確認させてください。 Load_NAV_Dataプロシージャは標準モジュールに記述でよろしいでしょうか。 また、もう一つのOKButton_Clickイベントプロシージャは、Load_NAV_Dataプロシージャで開いているStandardDateFormフォームに記述ということでよろしいでしょうか。
cc000072

2021/10/06 00:50

Load_NAV_Dataプロシージャは標準モジュールに記述しており、 OKButton_ClickイベントプロシージャはStandardDateFormフォームに記載しております。
hex309

2021/10/06 01:04

ありがとうございます。 2回呼び出すようには見えませんね。 Python側に問題がないのと、Openイベント等利用されていない、というお話ですので、やはりコードを見るしかないですよね。 StandardDateForm.Showで開いた直後に、Stopをいれて、その後F8でステップ実行してみてはいかがでしょうか? 場所が特定できるかと
cc000072

2021/10/06 04:34

デバッグはしてみたのですが、1回マクロ全体の処理が終わってデータベース接続を切断までしてから再度同じマクロが実行されます。 Loopされているような感じです。
hex309

2021/10/06 05:07

DBの処理はあまり見ていなかったのですが、以下の部分ですが、最後のCloseってエラーになりませんか?(NothingにしたあとでCloseしようとしている) だとすると、エラー処理に飛んで終わっていると思うのですが、エラー処理はどの様になっていますか? If Not Rs Is Nothing Then If Rs.State = adStateOpen Then Rs.Close Set Rs = Nothing End If If Not cn Is Nothing Then If cn.State = adStateOpen Then cn.Close Set cn = Nothing End If cn.Close Rs.Close 提示されたコードと実際に動かされているコードは同じですよね。ご事情で提示できない部分はXXXXに置き換えるなどして、省略するのではなく、全体を提示頂いたほうが良い気がします。
cc000072

2021/10/06 06:09

エラー処理を追記致しました。確認したところCloseのところでエラーが発生していたので両方コメントアウトして試したところエラーは解消されましたが、やはりStandardDateForm.Showが二回表示されてしまいますね。。。
hex309

2021/10/06 06:53 編集

Pythonからではなく、Load_NAV_Data()を直接実行しても、2回表示されますか? これが1回であれば、Pyton側に問題がある可能性があります。 2回ということであれば、提示されていないコードのどこかで、StandardDateForm.Showが記述されていませんか? 1箇所であることは検索して確認されましたか? 私には、提示されていない部分でなにかあるように思えます。
cc000072

2021/10/06 07:02

直接実行すると1回しか表示されないので、仰る通りpython側に問題がある可能性がありますので調べてみます。 StandardDateForm.Showの記載は1か所でした。これてお見せできる部分のコードはすべてになりますね。。
hex309

2021/10/06 07:13

承知しました。
cc000072

2021/10/06 07:16

いろいろお調頂きありがとうございました!
guest

回答1

0

自己解決

別pythonプログラムを作成して別VBAを呼び出してみましたが2回実行される事象が見受けられました。

投稿2021/10/17 07:07

cc000072

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問