人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

vlookupをfor構文でやりたいのですが、VBAが反応しません。
(エラーが出るわけでもなく、実行された結果なにも値が入らない)

dic2:複数列を"_"でつないでユニークを算出したdictinary
val5:上記dicを分解した結果

ttシートにすでに色々なユニークのNAMEが表としてあり、この中にdicのNAMEもあります。
目的はttシートのNAMEの横列に、val5から参照した誕生日を入れる事です。

'誕生日を入れる
key2 = dic2.keys
For i = 1 To UBound(key2)
val5 = Split(key2(i - 1), "_")
For j = 4 To tt.Columns(1).End(xlUp).Row
If val5(i, 1) = tt.Cells(j, 1) Then
If val5(i, 2) = tt.Cells(j, 5) Then
tt.Cells(j, 6).Value = val5(i, 3)
End If
End If
Next j
Next i

どこがダメなのか教えてください。


●質問者: 匿名質問者
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

すみません。何がやりたいのかは、説明とソースコードからは読み取れないのですが、エクセルのVBAであれば、マクロ実行をステップインで実行して、1行づつ想定の通りにデータがはいっているかを追ってみてはいかがでしょうか?

「ステップ実行 ?マクロを1行ずつ実行?」
http://hp.vector.co.jp/authors/VA016119/step/step01.html


匿名回答1号さんのコメント
匿名回答2号さんがおっしゃるとおり、ご自身で1行ずつ実行しながら、変数に想定のものが入っているかを追われると良いと思います。

質問者から

VBAは反応しないという表現を訂正します。
VBAが滞りなく実行された結果、何も値が入らず終了しています。
だからデバック等の忠告も出ません。


2 ● 匿名回答2号

ステップ実行出来ませんでしたか?
すぐに終了せず、1行づつ実行できるはずですが。

val5(i, 1)

これは記入ミスですか?
Splitの結果は1次元配列だと思いますが、どこからiが出てきました?
たぶんiはいらない。

ほかに気になるところ

下のはどうでもいいけど、上のはバグな気がする。


質問者から

いろいろありがとうございます。

諸々検討し、下記のようにコードを修正しました。

'誕生日を入れる
key2 = dic2.keys
For i = 0 To UBound(key2)
val5 = Split(key2(i), "_")
For j = 4 To tt.Cells(Rows.Count, 1).End(xlUp).Row
If val5(0) = tt.Cells(j, 1) Then
If val5(1) = tt.Cells(j, 5) Then
tt.Cells(j, 6).Value = val5(2)
End If
End If
Next j
Next i

ステップ実行はしてみましたが、一番真ん中の3行(IF?END)が飛ばされ、
その状態でぐるぐる回っていることがわかりました。
変数はこちらの意図通り入っていることが確認できていますが、
真ん中が飛ばされているので一向にセルに何も値が入らないのではないかと思います。
でも、なぜ飛ばされるのかがわかりません。
自分でも考えてみますが、何かあれば教えてください。


3 ● 匿名回答2号
ベストアンサー

一番真ん中の3行(IF?END)が飛ばされ、

ということは

val5(1) = tt.Cells(j, 5)

これが成り立たないのでしょう。「val5(1)」 、「 tt.Cells(j, 5)」それぞれがどんな値になってますか?思ったような値ですか?
匿名回答1号さん紹介のページの最後の方に下記のようにあります。

イミディエイトウィンドウで「?プロパティ」や「?変数名」と入力して Enter キーを押すとその内容が表示されます。

これを使って

?val5(1)
?tt.Cells(j, 5)

などと入れてやれば値が見れると思います。


匿名質問者さんのコメント
3行が飛ばされる原因がわかりました。 最初のIF構文でIDを確認し、該当すれば次のIF構文(3行の部分)で氏名を確認し、 該当すればセルに誕生日を入れるのですが、最初のIF構文でIDを確認する際に、 例えば"100"と" 100"が比較され(片方が半角空いている様子)、 一致しないので、j変数に渡されず、次のi変数として回っていくようです。 半角空いているのは、セルに予め入力されたIDです。 ただそのセルを調べる限り実際半角は空いていません。 でもイミディエイト画面で確認すると半角が空いています。 そして予めセルに入力された当該IDも、 実は同じ場所から参照して作成したdictinaryをsplitで分割し、セルに入れたものです。 だから比較しているものは、理論上、同じ場所を参照して作成した同じものなはずなのですが… コードの問題というより、この現象を解決しないといけないようです。

匿名回答1号さんのコメント
匿名回答者1です。 セルに入っている値に半角が入っているが故に一致しないならば、trimを使ったらいかがでしょう。 前後の半角を削除する関数です。 if trim(val5(1))=trim(tt.Cells(j, 5)) then という感じで。

匿名質問者さんのコメント
1号さん、2号さん、アドバイスありがとうございます。 最後のtrimはまだ実施できていませんが、これからやってみようと思います。 とりあえず前に進むことができましたので、助かりました。

匿名質問者さんのコメント
追記; trimを使うことでうまく回り始めました!ありがとうございました!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ