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

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

ただいまの
回答率

90.61%

  • VBA

    1735questions

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

  • Access

    409questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

[VBA] dictionaryからの値の取り出し

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 347

akihiro0117

score 23

文字列をコードの変換するプログラムを作っています。
変換表が入っているテーブルから読み込んで、dictionaryに保存しました。

文字列が入っているデータを取り出して、dictionaryに入っている変換表を使って、文字列をコードに変換しようとしました。
しかし、以下のプログラムの
Debug.Print uriage_torihiki_kbn_cd
は常に0です。

このあたり

uriage_torihiki_kbn_cd = uriage_torihiki_kbn_array.Item(rst2!売上取引区分)


の問題かと思い、

uriage_torihiki_kbn_cd = uriage_torihiki_kbn_array(rst2!売上取引区分)


のように書き換えてみたのですが、同じでした。

dbo_m_uriage_torihiki_kbnには、

uriage_torihiki_kbn_cd    uriage_torihiki_kbn_nm
1    売上1
2    ②-1
3    ②-2
4    ②-3
5    ③-1


のようにデータが入っています。

商品テーブルは以下のような感じです。

商品コード    商品名    頭文字    売上取引区分
000000001    商品A    カヘ    ④-1
000000002    商品B    カヘ    ④-1

何か、ご存じのことがあれば、ご教授いただけますと幸いです。

Option Compare Database

Public Sub Iko_syouhin()

    Dim dbs As Database
    Dim rst As Recordset
    Dim rst2 As Recordset
    Dim rst_m As Recordset
    Dim uriage_torihiki_kbn_cd As Integer

    Dim uriage_torihiki_kbn_array As Object
    Set uriage_torihiki_kbn_array = CreateObject("scripting.dictionary")

    Set dbs = CurrentDb
    Set m_rst = dbs.OpenRecordset("dbo_m_uriage_torihiki_kbn")

    For i = 0 To m_rst.RecordCount - 1
        rec = m_rst.GetRows()

        uriage_torihiki_kbn_array.Add rec(1, 0), rec(0, 0)
    Next

    Set rst2 = dbs.OpenRecordset("商品")
    Set rst = dbs.OpenRecordset("dbo_m_syouhin")
    With rst2
        Do Until .EOF
            uriage_torihiki_kbn_cd = uriage_torihiki_kbn_array.Item(rst2!売上取引区分)
            Debug.Print rst2!売上取引区分
            Debug.Print uriage_torihiki_kbn_cd

            '省略


            .MoveNext
        Loop
        .Close
    End With
    rst.Close

    dbs.Close
    Set dbs = Nothing

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

回答ではないですが、Dictionary はよく使ってますので幾つか参考まで。
(以下、Dictionary は Dic とします)

1.Dic は値が無いと[変数] = Dic.Item([Key]) とした時に、
Dic内に[Key]が登録されてしまいます。(この時、ItemはEmptyです)
  
なので、If Dic.Exists([Key]) = True Then 等、
Dic内に存在している場合、とした方が無難です。
もしくは、値を受け取る変数を、Variant型 or 文字列型にするか。

2.1の応用で、Dic.Add([Key],[Item])という記述を、
Dic.Item([Key]) = [Item] と書けます。
※但し、同じKeyが複数あった場合、後の値が優先されます
  
3.Dicに登録されている値は確認しにくいのですが、
プロパティウィンドウで[Keys]に何が入ってるか見れます。
もしくは、イミディエイトウィンドウで、
?Join(Dic.Keys,vbCrLf)とすると見れます。
?Join(Dic.Items,vbCrLf)ともできます。

4.基本的に、どのPCにも環境があるので、(無い環境に遭遇した事ないです)
参照設定(Microsoft Scripting Runtime)をONにして使うべきです。
その方が、コーディングしやすいし、打ち間違いも無くなります。

Dic は慣れると使い勝手がいいので(連想配列、動的配列、集計)
どしどし使ってマスターしてみてください~

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

うまくいかない原因は下記のコードです。

            uriage_torihiki_kbn_cd = uriage_torihiki_kbn_array.Item(rst2!売上取引区分)


rst2!売上取引区分 という Fieldオプジェクト がItemの引数にセットされてます。。

            uriage_torihiki_kbn_cd = uriage_torihiki_kbn_array.Item(rst2!売上取引区分.Value)


というようにフィールドの値をセットするようにしてください。


文字列が入っているデータを取り出して、dictionaryに入っている変換表を使って、文字列をコードに変換しようとしました。

更新クエリ(UPDATE文)の実行で一発でできることをわざわざdictionaryを介して複雑にするは疑問です。

Public Sub Iko_syouhin2()
    Dim dbs As Database

    Set dbs = CurrentDb
    dbs.Execute ("UPDATE 商品 INNER JOIN dbo_m_uriage_torihiki_kbn " & _
                 "ON 商品.売上取引区分 = dbo_m_uriage_torihiki_kbn.uriage_torihiki_kbn_nm " & _
                 "SET 商品.売上取引区分 = [uriage_torihiki_kbn_cd];")
End Sub

Dictionaryは、重複排除や突き合わせをするのに便利なので、Excelなどではよく使いますが、Accessのテーブルなら同じことがSQL一発でできるので、使う機会はほとんどないですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1735questions

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

  • Access

    409questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。