下記のコードは前にこのサイトから
教えていただいたコードです。
もし、わかる方いましたら
書き出しのところを配列に
できればしたのですが、
お願い申し上げます
-----------------------------------------
Option Explicit
Public Sub 商品検索()
Dim dicT As Object
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim row1 As Long
Dim row2 As Long
Dim key As Variant
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
maxrow1 = sh1.Cells(Rows.Count, 1).End(xlUp).row 'Sheet1 A列最終行を求める
maxrow2 = sh2.Cells(Rows.Count, 1).End(xlUp).row 'Sheet2 A列最終行を求める
For row1 = 2 To maxrow1
key = sh1.Cells(row1, "A").Value
If key <> "" Then
dicT(key) = row1 '商品番号に対応する行番号を記憶
End If
Next
For row2 = 2 To maxrow2
key = sh2.Cells(row2, "A").Value
------------------------------------書き出し
If dicT.exists(key) = True Then
row1 = dicT(key)
sh2.Cells(row2, "B").Value = sh1.Cells(row1, "B").Value '商品名
sh2.Cells(row2, "C").Value = sh1.Cells(row1, "C").Value '日付
sh2.Cells(row2, "D").Value = sh1.Cells(row1, "D").Value '金額
Else
sh2.Cells(row2, "B").Value = ""
sh2.Cells(row2, "C").Value = ""
sh2.Cells(row2, "D").Value = ""
End If
Next
MsgBox ("完了")
End Sub
No.8ベストアンサー
- 回答日時:
No5です。
No5の追加開始から追加終了を以下のコードで置き換えてください。
Sheet3に出力しています。(Sheet3がないとエラーになります)
A列:iの値
B列:商品名
C列:日付
D列:金額
--------------------------------------
'追加開始
Dim i As Long
Dim sh3 As Worksheet
Set sh3 = Worksheets("Sheet3")
For i = 0 To ctr - 1
sh3.Cells(i + 1, 1).Value = i
sh3.Cells(i + 1, 2).Value = sname(i)
sh3.Cells(i + 1, 3).Value = sdate(i)
sh3.Cells(i + 1, 4).Value = price(i)
Next
'追加終了
No.9
- 回答日時:
No.7の補足を見て。
良くはわかりませんが、F列も存在するって事なんですね。
シート状況が全く掴めないのでこちらとしてはどうしようもないですが、ユーザー定義型(一般には構造体)で作成した方が見易いんじゃないかなと思いました。
使う・使わないは質問者さん次第ですので、時間があるようでしたら
http://officetanaka.net/excel/vba/variable/12.htm
一読してみて下さい。
配列をバラバラに宣言するよりかは可読性は良くなると思います。
No.7
- 回答日時:
No.6です。
ブラウザの関係か補足コメントはページのソースで確認しました。(うちの古いからかな?)
個人的にはFor~NextよりもFor Each~Nextを使う物で、見た目はちょっと違いますけどね。
で、シート1のA列には重複はないとして、A列をキーにB~D列をArrayにより配列として格納。
シート2に書き出す際にA列の値がDictionaryのキーに存在しなければ””を、存在すればDictionaryの値を代入する。(ちょっと書き方が違うかもですが)
Sub megu()
Dim dicT As Object
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim r1 As Range
Dim r2 As Range
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
With sh1
For Each r1 In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
If r1.Value <> "" Then
dicT(r1.Value) = Array(r1.Offset(, 1).Value, r1.Offset(, 2).Value, r1.Offset(, 3).Value)
End If
Next
End With
With sh2
For Each r2 In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
If dicT.Exists(r2.Value) Then
r2.Offset(, 1).Resize(, 3).Value = dicT(r2.Value)
Else
r2.Offset(, 1).Resize(, 3).Value = Array("", "", "")
End If
Next
End With
Set dicT = Nothing
Set sh1 = Nothing
Set sh2 = Nothing
End Sub
こんな感じでしょうか?
No.5
- 回答日時:
No1です。
>抽出できません。
>なぜかわかりませんが、?
「抽出できない」とは、配列の内容がどこにも表示されないという意味でしょうか?
もし、そうであれば、当たり前の話です。
提示したマクロは、配列に格納して完了です。
この配列の内容は、あなたが意図的に何かのアクションを起こさなければ確認できません。
(デバッガで確認するか、以下の様な確認の為のコードを追加するか等)
もし、この内容を確認したいなら、以下のコードをマクロの最後に追加してください。
追加開始から追加終了までの部分です。
・・(途中省略)・・・
MsgBox ("処理完了 所要時間(秒)=" & t2 - t1)
'追加開始
Dim i As Long
For i = 0 To ctr - 1
Debug.Print "i=" & i & " sname=" & sname(i) & " sdate=" & sdate(i) & " price=" & price(i)
Next
'追加終了
End Sub
そうすると、イミデイトウインドウに添付図のような内容が表示されます。
i=xxxxのxxxxはsname,sdate,priceの添え字です。(0から開始します)
イミデイトウインドウに表示できる量が限られているので、あまり多いと、最後の部分のみが表示されます。
(最初の部分のほうは表示されません)
イミデイトウインドウはVBEエディタ(Alt+F11で起動)の画面で、
表示→イミデイトウインドウで表示されます。
No.1
- 回答日時:
前回回答者です。
以下のようになるかと。
snameが商品名、sdateが日付、priceが金額になります。
-----------------------------
Public Sub 商品検索()
Dim dicT As Object
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim row1 As Long
Dim row2 As Long
Dim key As Variant
Dim t1 As Variant
Dim t2 As Variant
Dim sname() As Variant '商品名テーブル
Dim sdate() As Variant '日付テーブル
Dim price() As Variant '金額テーブル
Dim ctr As Long '上記テーブルの件数
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
maxrow1 = sh1.Cells(Rows.Count, 1).End(xlUp).row 'Sheet1 A列最終行を求める
maxrow2 = sh2.Cells(Rows.Count, 1).End(xlUp).row 'Sheet2 A列最終行を求める
t1 = Timer
For row1 = 2 To maxrow1
key = sh1.Cells(row1, "A").Value
If key <> "" Then
dicT(key) = row1 '商品番号に対応する行番号を記憶
End If
Next
ctr = 0
For row2 = 2 To maxrow2
key = sh2.Cells(row2, "A").Value
ReDim Preserve sname(ctr)
ReDim Preserve sdate(ctr)
ReDim Preserve price(ctr)
If dicT.exists(key) = True Then
row1 = dicT(key)
sname(ctr) = sh1.Cells(row1, "B").Value '商品名
sdate(ctr) = sh1.Cells(row1, "C").Value '日付
price(ctr) = sh1.Cells(row1, "D").Value '金額
Else
sname(ctr) = ""
sdate(ctr) = ""
price(ctr) = ""
End If
ctr = ctr + 1
Next
t2 = Timer
MsgBox ("処理完了 所要時間(秒)=" & t2 - t1)
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBのFunctionで、配列を引数...
-
【VBA】配列とWorksheetFunctio...
-
[Excel2000_VBA] 型が一致しま...
-
for each の現在の配列ポインタ...
-
ListViewで、非表示列って作れ...
-
VLOOKUP関数で、一番下...
-
友愛数を探すプログラム
-
VBA 1次元配列を2次元に追加する
-
Array配列の末尾に追加したい。
-
AES暗号にて、AES_set_encrypt_...
-
VBAで近似曲線の係数取得
-
配列変数の添字が範囲外ですと...
-
linest関数に配列を渡す
-
VBAで多次元配列のインデックス...
-
VB2008: CSV を二次元配列に読...
-
2次元動的配列の第一引数のみを...
-
subの配列引数をoptionalで使う...
-
Excel-VBAの配列「Public Const...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
for each の現在の配列ポインタ...
-
VBのFunctionで、配列を引数...
-
subの配列引数をoptionalで使う...
-
VB6 配列を初期化したい
-
ListViewで、非表示列って作れ...
-
配列変数の添字が範囲外ですと...
-
Excel-VBAの配列「Public Const...
-
2次元動的配列の第一引数のみを...
-
VBAで近似曲線の係数取得
-
VLOOKUP関数で、一番下...
-
配列に同じ値を入れる方法
-
エクセルで最小値から0を除く方法
-
linest関数に配列を渡す
-
配列を任意の数値で埋める方法
-
Dim は何の略ですか?
-
配列内の内容を全て表示する方法
おすすめ情報
抽出できません。
なぜかわかりませんが、?
わたしにはまだ、はやいということですね
なんとなくわかります。
いつも有難うございます。
ご迷惑をおかけいたしました。
いろいろやってみたのはいいのですが、わたしの力足りず
やはりできませんでした。
すみません。
有難うございます。しかし
If dicT.exists(key) = True Then
row1 = dicT(key)
sh2.Cells(row2, "B").Value = sh1.Cells(row1, "B").Value '商品名
このコードでいくと
sh2.Cells(row2, "B").Value = sh1.Cells(row1, "B").Value '商品名
sh2.Cells(row2, "F").Value = sh1.Cells(row1, "B").Value '商品名
でも可能になるのです。
すみません 貴重な時間いただき有難うございます。
今回はあきらめます。時間つかわせて申し訳ございませんでした。
頂いたコード0.0007秒ぐらいでした。なんという早さです。
正直わたしにはわけがわかりません。ここでお願いがあります。
シートに書き出しのコードをおしえてくれませんでしょうか
お願い致します。