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

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

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

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

Access

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

Q&A

解決済

2回答

11149閲覧

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

akihiro0117

総合スコア32

VBA

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

Access

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

0グッド

0クリップ

投稿2018/06/03 05:59

文字列をコードの変換するプログラムを作っています。
変換表が入っているテーブルから読み込んで、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

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

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

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

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

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

guest

回答2

0

回答ではないですが、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 は慣れると使い勝手がいいので(連想配列、動的配列、集計)
どしどし使ってマスターしてみてください~

投稿2018/06/04 07:55

ExcelVBAer

総合スコア1175

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

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

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一発でできるので、使う機会はほとんどないですね。

投稿2018/06/03 13:43

編集2018/06/05 03:01
hatena19

総合スコア33715

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問