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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Python

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

Q&A

解決済

2回答

2286閲覧

VBAでデバッグモード時のみエラーが発生する

takaotaka

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Python

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

0グッド

0クリップ

投稿2020/09/17 01:47

編集2020/09/17 02:34

問題

外部からPythonにてVBAの関数を実行したいが、原因不明のエラーが発生する
処理内容としては、チェックボックスのチェックをOnOffするというもの

チェックを手動で押下した時はエラーが発生せずチェックのOnOffができます。
ただし、デバッグモードでブレークポイントを設定し手動でチェックを押すと同様のエラーが発生します。

なぜ外部からの実行時や、ブレークポイント設定時にエラーが発生するかを知りたいです。
解決策が分かればご教授いただければと思います。。

###エラー内容
Excelのポップアップにて以下のエラーが発生します。

ErrNo:13 型が一致しません。
Automationまでご連絡ください。

###コード
該当関数のコードは以下です。

####チェック処理

VBA

1Public Sub SubShpCheckOnOff() 2 On Error GoTo ErrorHandler 3' 4' Application.ScreenUpdating = False 5 6 Dim ObjName As Variant 7 8 'OKがついていたら消去する 9 If stRequest.Range(cnsResult).Text = cnsOK Then 10 stRequest.Range(cnsResult).Value = "" 11 End If 12 13 ObjName = Application.Caller 14 15 If ObjName = "" Then 16 Application.ScreenUpdating = True 17 Exit Sub 18 19 End If 20 21 'レ オブジェクト名か? 22 If Right(ObjName, 2) <> cnsON Then 23 24 ObjName = ObjName & cnsON 25 26 End If 27 28 'レ オブジェクトが非表示⇒表示 表示⇒非表示 29 If stRequest.Shapes(ObjName).Visible = True Then 30 stRequest.Shapes(ObjName).Visible = False 31' FncshpCheckOnOff = cnsOff 32 Else 33 stRequest.Shapes(ObjName).Visible = True 34' FncshpCheckOnOff = cnsOn 35 End If 36 37 38' Application.ScreenUpdating = True 39 40 Exit Sub 41 42ErrorHandler: 43 intMsgReturn = clsMSG.FncDisplaytMsg(stMSG, "0001", "SubShpCheckOnOff", "ErrNo:" & Err.Number & " " & Err.Description) 44 45End Sub

####cnsResult宣言

'*************** セルの名前定義 =依頼票シート= *************** '入力チェック Private Const cnsResult As String = "ResultChk"

####stRequest
stRequest(依頼票)というオブジェクトの中のコード

'受付管理番号が変更された場合は、処理しない。 If Target.Address(ReferenceStyle:=xlR1C1) = stRequest.Range("SRNo").Address(ReferenceStyle:=xlR1C1) Then Exit Sub End If Application.EnableEvents = False ActiveWorkbook.Unprotect cnsPassWord stRequest.Unprotect cnsPassWord

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

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

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

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

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

hatena19

2020/09/17 01:58

On Error GoTo ErrorHandler をコメントアウトしてから、実行して、エラーがどの行ででたのか提示してください。 あと、stRequest とか cnsOK の宣言部分も提示してください。
takaotaka

2020/09/17 02:14

If ObjName = "" Then とりあえず、上記の行でエラーが発生しているようでした。 宣言部分は探索中です。
hatena19

2020/09/17 02:24 編集

変数上で右クリックして[定義]をクリックすれば宣言部分へ跳んでくれますよ。
takaotaka

2020/09/17 02:35

本文に追記しました。 stRequestは宣言部がなく、[定義]で跳んだ箇所の部分を載せました。
hatena19

2020/09/17 02:42

この SubShpCheckOnOff はどこから呼び出してますか。 セルのクリック時とか、コントロールのクリック時とか・・・・
takaotaka

2020/09/17 02:43

Excelにチェックボックスが一つ配置されおり、 それをクリックしてチェックを付けた時、また、クリックしてチェックを外した時に呼び出されます。
hatena19

2020/09/17 02:53 編集

シート上にフォームコントロールのチェックボックスが配置されており、それを 右クリック→マクロの登録 で開くダイアログボックスのマクロ名に、SubShpCheckOnOff が設定されているということですか。
takaotaka

2020/09/17 03:05

はい、SubShpCheckOnOffが設定されていることが確認できました。
hatena19

2020/09/17 03:18

チェックボックスにはフォームコントロールとActiveXコントロールがありますが、フォームコントロールで間違いないですか。
guest

回答2

0

自己解決

解決はしていないですが、、
VBAも配置オブジェクトも変更不可の状況のため、チェック処理は手動で行うこととなりました。。

>チェックボックスをActiveXのコントロールからフォームコントロールに変更
でできる可能性があるというのが解決策ですね。

回答いただいた方、ありがとうございました。

投稿2020/09/24 03:50

takaotaka

総合スコア5

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

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

0

Application.Callerの影響だと思うんですが
Caller プロパティ (Excel)

ObjNameに代入する前TypeNameでApplication.Callerの状態を判断しないと

VBA

1Select Case TypeName(Application.Caller) 2 Case "Range" 3 v = Application.Caller.Address 4 Case "String" 5 v = Application.Caller 6 Case "Error" 7 v = "Error" 8 Case Else 9 v = "unknown" 10End Select 11MsgBox "caller = " & v

投稿2020/09/17 02:03

kuma_kuma_

総合スコア2506

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

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

takaotaka

2020/09/17 02:19

実施してみた結果、"Error"となっていることが分かりました。 Application.Caller時に上手く取得できていないとかそういうことでしょうか。。
kuma_kuma_

2020/09/17 02:38

Application.Caller時というよりイベント時の呼び出し方の問題でしょう めんどくさいですが Public Sub SubShpCheckOnOff(ObjName as String) にして呼び出す際に指定してみてはどうでしょうか?
takaotaka

2020/09/17 02:49

すみません。今はテストとしてVBAを修正したりはできるのですが、 最終的に修正や追記をすることは禁止されているため、 VBAをそのまま使用する方法で解決を望んでいるのです。。 手動でチェックボックスを操作するとなぜか正常に動くので、VBAそのままでもいけるかなと思ってましたが方法は無いでしょうか。。
kuma_kuma_

2020/09/17 03:18 編集

確認してみました ActiveXのコントロール "Error" フォームコントロール "(オブジェクト名)" ということでチェックボックスを ActiveXのコントロールからフォームコントロールに変更してみてください イベントのマクロでActiveXのコントロールで使っていたのを指定すれば VBAの変更なしでいけます でもTypeName(Application.Caller)の処理へ変更できないので不安が残ります。 >手動でチェックボックスを操作するとなぜか正常に動くので イベント登録がおかしいか、途中の判定で処理が終了していませんか?
hatena19

2020/09/17 03:16

VBAを > 最終的に修正や追記をすることは禁止されている のなら、何のためにデバッグしているのですか。 また、Pythonなどの外部から操作することは禁止されていないのですが。 外部からの操作に対応するために、VBAの変更が必要なら、VBAの修正追加を許可されている担当者か部門に修正を依頼するしかないのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問