
Excel2013VBAでたまに、ユーザー定義型は定義されていません、というエラーが発生しています。
症状からは、コード自体の問題ではない気はしますが、参照設定のライブラリファイルのチェックが不足しているのか、よく分かりません。
発生しているシートに記載しているコードを上げておきます。
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet
On Error Resume Next
If Intersect(Target, Range(ws.Cells(Target.Row, 2), ws.Cells(Target.Row, 3))) Is Nothing Then
Exit Sub
Else
Call ABCD
End If
End Sub
このコードはシート内のセルが変更された時に動作するイベントマクロで、エラーの発生が、ほぼ確実に起きると思われるやり方は、このコード全体を、まずコメントブロックし、次に非コメントブロックで動作可能状態に戻し、該当シートのセルに文字を入力すると、ユーザー定義型は定義されていません、というエラーが1回はほぼ必ず発生しています。エラーがでても、そのままOKを押すと、コード自体は問題なく実行処理される。次、またそのままセルに文字を入力してもエラーは発生しない。もしかすると何かのタイミングで発生するかもしれない。
その後、またコメントブロックする。そして、セルに文字を入力すると、なぜかここでも1度、同じエラーが発生する。その後は、出ない。
というよく分からない症状が出ています。
参照可能なライブラリ ファイルのチェックは、現在、
Visual Basic For Applications
Microsoft Excel 15.0 Object Library
OLE Automation
Microsoft Office 15.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft VBScript Regular Expressions 5.5
にチェックを入れています。
他、
Microsoft Active Data Objects 6.1 Library
Microsoft Scripting Runtime
上記2つをそれぞれチェックを入れましたが、変化なしです。
ちなみみに、同じシートに、下記のようなコードも記載していますがこちらは発生状況からすると除外できるのかな、と考えています。
Private Sub Worksheet_Deactivate()
On Error Resume Next
If あいう.Visible = True Then Unload あいう
End Sub
その他、標準モジュールや別のシートにも他のコードが記載されていますが、発生状況からこちらもとりあえず除外してもよいのかな、と考えています。
このような状況なのですが、何かエラーの原因になりそうな所があるでしょうか?
よろしくお願いいたします。
No.6ベストアンサー
- 回答日時:
最初に、もう確実なところはありませんので、推理して、それを実験でトライして確証を得るしかありませんが、まだ、私のネタ切れにはしばらくあります。
今、調べてみて、デバッグのコンパイルのボタンでエラーがでなくて、実際にはユーザー定義型のエラーが出てくるという例は聞いたことがないのです。
ちょっと脇道にそれますが、私自身のコードの作り方というのは、hinoki24さんのような真面目な作り方ではなく、
・Option Explicit は書いても、開発中はコメントブロックしてしまうということです。
・対応不足の予想を考えて、変数の宣言はしても、3分の1ぐらいは、Variant (つまり、 As ~ なし)にしてしまいます。
>このコード全体を、まずコメントブロックし、次に非コメントブロックで動作可能状態に戻し、該
>当シートのセルに文字を入力すると、ユーザー定義型は定義されていません、というエラーが1回
>はほぼ必ず発生しています。
Class は使っていませんか。シート1をインスタンスを作っているとか、
イベント・ドリブン型ですから、似たようなものだとは思います。他のイベントにしてみたらどうでしょうか?ダブルクリック・イベントとか。
標準モジュール側の Public 変数と、シートモジュールの 変数(Private)の、使い分けはないでしょうね。まあ、それをしてもユーザー定義型は定義されていない、というエラーはまずでないと思います。
また、私が考えたのは、オーバーヘッドの問題です。オーバーヘッドというのは、オブジェクトが設定されるまでには、多少の時間のロスがあります。だから、事前に参照設定(アーリー・バインディング)をしておけ、というわけです。だから、アーリー・バインディングか、レイト・バインディングか、という問題は、VBAテキストなどでは、前者が良いと書かれていますが、ブック全体で、それらのOLEオブジェクトを抱えていくのは無理な時があります。
それで、私は、このようにしてしまいます。
(インテリセンスが利かないとお思いでしょうが、最初は設定しておいて、後で、もとのオブジェクト型に戻すこともあります。今は、VBAのテンプレートを使うので不要で。)
Microsoft Scripting Runtime を参照設定する代わりに、 Set dic = CreateObject("Scripting.Dictionary") としてしまったり、
Microsoft VBScript Regular Expressions 5.5を参照設定する代わりに、Set Regex = CreateObject("VBScript.RegExp") で間に合わせてしまうことも多いです。
もう、同様の実験は済んでいるとは思いますが、いっそ、Sh As Worksheet などのデータ型の宣言を、プロジェクト全体に対して、
「As」 ->「 'As」 で、置換して、どうなるでしょうか?
それでもエラーが出るとなると、一度コードを吐き出して、その中身を調べないといけないかもしれません。問題になっている Sheet1 のコードのエクスポートをさせて、テキストにして調べるのです。
他に、トラブルとして、名前登録があります。不要な名前登録は全部削除しておくと安心です。
それ以外は、アドインで、私製 comアドインなどが悪さをすることがあります。
以上、目下、思い当たる範囲です。
どうもありがとうございました。
とりあえず、補足の回数もなくなった為終了します。
今のファイルは、エラーは出ていないですが、修正途中の所もあるので、検証していくにはとりあえず、完成させてからだと思いました。
後は、おっしゃるように、色々削っていって、絞り込んでみようと思います。
とりあえず、名前等を含めシートの方には問題ないようでした。今回ある程度までは絞り込んだので、完成したら、さらに絞り込んでいこと思います。
また、今回の現象は、デバックの限られた状況でエラーが出るのみで、実使用ではエラーは出ないようなので(多分)、使おうと思えば使えるかな、と思います。でも、できれば直したいですけど。
No.7
- 回答日時:
その補足で書かれたコードは、私のイメージどおりなのですがいかがでしょうか。
いわゆる レイト・バインディングをお使いになったわけですね。
>列非表示のマクロは何か変な所があるでしょうか?エラーは無。
行の非表示というのはありますが、列の非表示というのは、グループ化しない限りは、使ったことがありませんね。
それでも、確か、結合セルと、その結合セルより右にある列の操作とにはなにかトラブルがあった気がしますね。でも、それと今回のものとは関係があるかわかりません。
No.5
- 回答日時:
こんばんは。
>質問にだしたシートのPrivate Sub Worksheet_Change(ByVal Target As Excel.Range)のみ残し....
思惑とは違うかもしれませんが、前回書いたものを訂正した、以下のコードを試してみてください。
それと、実行する前に、VBAEditor のメニューのデバッグで
VBAProjectのコンパイルをクリックしてください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 1 And Target.Column < 4 Then
Call ABCD
End If
End Sub
'-----------------------------------
Microsoft Active Data Objects 6.1 Library
これは、つい、こちら側を選びたくなりますが、2.x 系のほうが新しいようです。
その差異はないとは思いますが。
-------------------------------------
それから、私の記憶では、参照設定が、うまくかみ合っていない可能性があります。その場合は、いったん、外して、再度、設定してみたらいかがでしょうか。
Visual Basic For Applications ×
Microsoft Excel 15.0 Object Library ×
OLE Automation ?
Microsoft Office 15.0 Object Library ×
========================
Microsoft Forms 2.0 Object Library ×
========================
Microsoft VBScript Regular Expressions 5.5
Microsoft Active Data Objects 6.1 Library (2.x系?)
Microsoft Scripting Runtime
-----------------------------
No.3
- 回答日時:
こんにちは。
「ユーザー定義型は定義されていません」というのは、
参照設定でサポートされていないオブジェクトなどの型名を定義した時に限ります。
(ユーザー定義型を定義する場合は除きますし、それは使わないです。)
簡単な例ですと、
Dim ws As Wokksheet '←スペルミス
と書けば、確実に出てきます。Worksheet のスペルミスだからです。
MS(だけではないけれども)は、こういうプログラマーのために、インテリセンスをつけていますから、ws As として、スペースを入れれば、次に、その必要なものをリスト内から選べばよいわけです。それに出てこないものは、エラーとして現れます。
>ユーザー定義型は定義されていません、というエラーが1回はほぼ必ず発生しています。
>エラーがでても、そのままOKを押すと、コード自体は問題なく実行処理される。
そのまま次に進むのは、 On Error Resume Next のせいではありませんか?
単純なコードにまで On Error Resume Next を入れているのが目につきます。デバッグの段階で、On Error Resume Next では、さっぱり原因がつかめません。一番良いのは、エラーを出して、デバッグモードにさせて、その箇所を特定化させることです。
なお、私なら、こう書くかと思います。
'シートモジュール
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Column > 1 And Target.Column < 4 Then
Call ABCD
End If
End Sub
(ただし、ABCDの中味にイベントが発生するものは、
Application.EnableEvents=False
'実行プログラム
Application.EnableEvents=True
として、短い間を挟むようにします。長い間だと、別なエラーが発生した時に復旧が効かなくなります。
>Private Sub Worksheet_Deactivate()
>On Error Resume Next
>If あいう.Visible = True Then Unload あいう
>End Sub
これは、ユーザーフォームのことだと思います。私は、こういうコードは書かないけれども、これで動く分には問題ないはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
このQ&Aを見た人はこんなQ&Aも見ています
-
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
コンパイルエラー:ユーザ定義型は定義されていません、と出るのですがどのライブラリファイルかわかりません。
Visual Basic(VBA)
-
-
4
エクセルVBA クラスモジュール内でパブリックユーザ定義型
Visual Basic(VBA)
-
5
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
6
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
7
Access サブフォームでの選択行の取得
その他(データベース)
-
8
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
9
VBAでchromeを動かしたいのですが、エラー出ます。
その他(パソコン・スマホ・電化製品)
-
10
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
11
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
12
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
13
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
14
起動時のフォームの大きさ?
Access(アクセス)
-
15
ACCESSでクエリを作成したら「式が複雑すぎます。」の表記が…
その他(データベース)
-
16
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
17
EXCELの図形(テキストボックス)を固定したい
その他(Microsoft Office)
-
18
UserForm1.Showでエラーになります。
工学
-
19
Accessのテーブルからcsv出力する際に一部のフィールドを除いて出力したい
Access(アクセス)
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAがブレークモードになっ...
-
EXCEL VBAマクロ中断でデバッグ...
-
VBAのコードがエラーになっ...
-
『実行時エラー 5 プロシージャ...
-
VBAのエラー発生場所をメッセー...
-
SQL文をVBAで流すと「型...
-
VBAでのエラー
-
Outlook.ApplicationをCreateOb...
-
INSERT INTOステートメント構文...
-
OLEDB.NETで接続できない
-
エラーでつまってます・・・お...
-
インプットボックスのキャンセ...
-
C#のSystem.Windows.Media.Colo...
-
【Excel VBA】マクロをボタンに...
-
トランスポートレベルのエラー
-
ExcelVBA Range クラスの Page...
-
マクロについて教えてください...
-
Accessで定型フォーマットのExc...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAがブレークモードになっ...
-
実行時エラー -'-2147417848
-
ExcelVBA Range クラスの Page...
-
マクロについて教えてください...
-
VBAでのエラー
-
【Excel VBA】マクロをボタンに...
-
実行時エラー48発生時のDLL特定...
-
EXCEL VBAマクロ中断でデバッグ...
-
なぜエラーになるのでしょうか...
-
実行時エラー3001「引数が間違...
-
OLEDB.NETで接続できない
-
INSERT INTOステートメント構文...
-
VBAのエラー発生場所をメッセー...
-
VB6+SQL サーバー 2000 で 実行...
-
Outlook.ApplicationをCreateOb...
-
ADODB.Streamを使用してUTF-8を...
-
カーソルオープンでエラー(ORA...
-
Invalid procedure call or arg...
おすすめ情報
これは、標準モジュールに記載しています。
これ単独での動作に問題はありません。
Option Explicit
で、宣言しないと必ずエラーが出るようにしています。
だいたいは、普通に動作しています。
何かのタイミングで、エラーが出るようです。
最初に示したコードを記載していない他のシートでも、セルの値を削除したタイミングで同じエラーが発生したので、最初に示したコードは関係ないと思われました。
もう一つのコードの影響なのかもしれません。下に示したコードは、今回エラーが出た別のシートにも記載してあったので。
Private Sub Worksheet_Deactivate()
On Error Resume Next
If あいう.Visible = True Then Unload あいう
End Sub
ただこちらも同様に、コメントアウトしてセルに文字を入力すると同じエラーがでました。(この頁のイベントマクロは何もない状態)意味不明。他の頁記載のこのイベントが悪さ?
とりあえず、アドバイスに従い切り分けの為全てのシートのイベントをコメントブロックしました。
そして、質問にだしたシートのPrivate Sub Worksheet_Change(ByVal Target As Excel.Range)のみ残し、On Error Resume Nextも削除した状態で試しました。
ブックに一つだけイベントを残した状態で、その残したイベントを一旦全てコメントブロックしました。これで、このブックにイベントで動作するものは一つもない状態になりました。
そこで、該当のシートに文字を入力すると、やはり同様のエラーが発生しました。プログラムは何も自動で実行するものはありません。これを見る限りシートは関係なさそうなので、コメントブロックすると他のシートでも同様の症状です。エラーの場所は、示されません。フォームが悪さをしている可能性も疑いこちらも全てブロックしています。
そのチェックは、外部のデータアクセス機能に関するもののようなので自分のファイルには不要なものだと思います。
一応変化しないことは確認済です。
補足ありがとうございます。
コードは、提示のものと差し替えてみました。動作的には、変化はありません。エラーの状況も同じです。
コンパイルでエラーはありませんでした。
参照設定は、外せるものは外して再設定しました。
Visual Basic For Applications
Microsoft Excel 15.0 Object Library
Microsoft Forms 2.0 Object Library
上記については、使用中のコントロールまたは参照を削除することはできません。と表示されたので、再設定できませんでした。
Microsoft Active Data Objects 6.1 Library
は、チェックを外して、
Microsoft Active Data Objects 2.8 Library
に変更しました。
100%かどうかは確信はないですが、分かってきたのが、シートモジュールを変更した後、セルに値を入力すると、ユーザー定義型は定義されていません、というエラーが1度だけ発生するような気がします。その後エラーは、シートモジュールを変更しないと発生しない気がします。
よってシートモジュールに記載しているコード全てにコメントブロックをかけて、動作するコードがなくなっても変更とみなしエラーが1度は発生するようです。
そのことから、コードの内容ではなく、このExcelファイルの何かが壊れているのかな?という感じはしています。
最悪は、新規に作り変えれば直るのかな、とも考えていますが、結構色々作りこまれており、新規ファイル移行は手間がかかる為、これを直して使えればいいとは思っています。
フォームと列を非表示にするマクロを削除したらエラーがでなくなる様な気がします。
フォームのマクロはまだ作成途中なので内容検証は難しいですが、(一応立ち上がりは問題なし、エラーもなし状態)、列非表示のマクロは何か変な所があるでしょうか?エラーは無。dicは他モジュールでも使用有。
とりあえず文字制限で分割です。
Public Sub 指定列非表示()
Dim mydic As Object
Dim ws As Worksheet
Dim last_row As Long
Dim c As Range
Set mydic = Nothing
Set mydic = CreateObject("Scripting.dictionary")
Set ws = ThisWorkbook.ActiveSheet
last_row = ws.Range("BM2").End(xlDown).Row
続き。
For Each c In ws.Range(ws.Cells(2, 65), ws.Cells(last_row, 65))
If Not mydic.Exists(c.Value) Then
mydic.Add c.Value, Trim(c.Offset(, 1).Value)
End If
Next c
For Each c In ws.Range(ws.Cells(6, 3), ws.Cells(6, 59))
If mydic.Exists(c.Value) Then
If mydic.Item(c.Value) = "×" Then
c.EntireColumn.Hidden = True
Else
c.EntireColumn.Hidden = False
End If
End If
Next c
Set mydic = Nothing
End Sub
内容のご確認ありがとうございます。
結合セルも特になく、このコードの使用自体は問題はありません。動作も思い通りでエラーになるような事もありません。
後は、フォームの方ですが、シートの構成を変更した事に始まり、フォーム全体に変更をかけた為、自分の力量では修正に結構時間がかかりそうです。一応、フォームの初期表示の修正は完成し、エラー等もなく思い通りの表示と動きになっています。
ただ、何が影響しているのかが不明なので、全ての修正・見直しが終わってから、また、改めて今回のエラーの原因と向き合おうと思います。
特に、普通の使用でエラーが出ることはなく、デバックの限られた状況のみです。
補足の投稿回数も少なくなってしまった為、一旦この質問は打ち切りたいと思います。
まだ、解決していませんが、長らくお付き合いしていただいたお礼にベストアンサーに選ばさせていただきます。
どうも、ありがとうございました。