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

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

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

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

Q&A

解決済

1回答

812閲覧

Dictionaryの挙動がおかしい(Excel VBA)

kujiraSE

総合スコア21

VBA

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

0グッド

0クリップ

投稿2023/12/15 17:20

編集2023/12/16 03:43

Dictionaryの挙動が不可解で、原因を知りたいです。

Dim dicBasic as object Dim key Set dicBasic = CreateObject("Scripting.Dictionary") strQ = "SELECT * FROM tblBasic" rs.Open strQ, gCON, adOpenKeyset, adLockReadOnly rs.movefirst Do dicBasic(rs.fields("ID")) = rs.fields("氏名") rs.MoveNext If rs.EOF Then Exit Do Loop Set rs = Nothing For Each key In dicBasic MsgBox key MsgBox dicBasic(key) Next key

このコードの、MsgBox(key)でエラーが出ます。 エラーメッセージは、タイトルが「Microsoft Excel」で本文はまったくの空白というものです。
dicBasicには100近くのレコードが入っているのは確実です。(dicBasic.Countで確認)
dicBasicにレコードを追加する部分を、

dicBasic.ADD(rs.fields("ID")), rs.fields("氏名")

とすると、今度はMsgBox dicBasic(key)で同じエラーが出ます。

同ブックの他のモジュールでは、Dictionaryを用いた集計が問題なくできているので、ブックの参照設定のあたりに問題があるとは思えないです。
また、for eachの部分を、

For Each key in dicBasic.keys

としても変わりません。
これ以上、何に手をつけていいのかわからず困っています。
何が原因と考えられますでしょうか?
試してみることがあればご指摘ください。

なお、

Dim key

の部分は、これがないと「変数が定義されていません」とエラーが出るので、追記したものです。
型はどうしていいのかわからないのでそのまま(variant扱い?)にしてあります。

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

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

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

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

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

kujiraSE

2023/12/15 17:24

調査したこと、試したことですが、本文の中に書いてしまいました。 For Each key in dicBasic → For Each key in dicBasic.keys としたこと、 dicBasic(rs.fields("ID")) = rs.fields("氏名") → dicBasic.Add(rs.fields("ID")), rs.fields("氏名") としたことです。 いずれの変更によっても、挙動が思い通りになることはありませんでした。
hatena19

2023/12/15 21:51

質問は編集できますので、質問を正しいものに修正してください。 エラーメッセージとエラー番号も質問に追記してください。
y_waiwai

2023/12/15 22:36

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
hatena19

2023/12/16 01:28

動作以前に、下記の部分でコンパイルエラーになり実行できませんが、実際のコードをコピペしてください。 Dim dicBasic as object,Dim key
guest

回答1

0

ベストアンサー

このコードの、MsgBox(key)でエラーが出ます。 エラーメッセージは、タイトルが「Microsoft Excel」で本文はまったくの空白というものです。

それはたぶんエラーメッセージではなく、MsgBox関数のメッセージだですね。
key が空文字列なのでしょう。

テーブルに未入力あるいは空欄のフィールドがないか確認してください。

VBAのエラーメッセージなら、タイトルは Microsoft Visial Basic になりますので。

投稿2023/12/16 04:27

hatena19

総合スコア34352

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

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

kujiraSE

2023/12/16 04:39

ありがとうございました! keyが空という点から、 dicBasic(rs.fields("ID")) = rs.fields("氏名")をdicBasic(rs.fields("ID").Value) = rs.fields("氏名")としたら問題なく動作するようになりました。
hatena19

2023/12/16 04:53

なるほど。 dicBasic(rs.fields("ID")) とすると、fieldオブジェクトがkeyに代入されてしまいますね。 見落としてました。 IDフィールドがテキスト型ならいいですが、数値型の場合は、 dicBasic(CStr(rs.fields("ID").Value)) というように文字列に変換しておいた方が確実でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問