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

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

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

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

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1396閲覧

VBA 行を絞り込み、列を検索をして転記するコードについて教えて下さい。

chuzenji_c

総合スコア1

VBA

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

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2021/07/11 02:27

前提・実現したいこと

EXCEL VBA 超初心者です。
SHEET1のD列の数値をSHEET2の行列が合致するセルに転記するエクセル表を作っています。
SHEET2の行は日付と時間、列は地点です。

オートフィルタで行を絞ろうと思ったのですが、行を指定するコードで躓いています。

エラーメッセージは以下です。
実行時エラー'1004'
'Range’メソッドは失敗しました。'Worksheetオブジェクト'

列の指定もこれでいいのか不安です。
ご指導のほど、よろしくお願いいたします。

該当のソースコード

Sub Tenki()
Const MOTO_KEY_ROW As Long = 1 '「Sheet1」シートのキー行(項目見出し行:1行目)
Const KENSAKU_ROW As Long = 1 '「Sheet2」1行目

Dim Sh_Moto As Worksheet '「Sheet1」シート Dim Sh_Tenki As Worksheet '「Sheet2」シート 'Dictionaryオブジェクトの宣言 Dim dicKomoku As Object 'Sheet1の項目名列番号ディクショナリ Dim iRRow As Integer 'Sheet1シートの読込行 Dim iRCol As Integer 'Sheet1シートの読込列 iRCol = 4 Dim iWRow As Integer 'Sheet2シートの出力行 Dim iWCol As Integer 'Sheet2シートの出力列 Set Sh_Moto = Worksheets("Sheet1") Set Sh_Tenki = Worksheets("Sheet2") Set dicKomoku = CreateObject("Scripting.Dictionary") '【ディクショナリ作成】 'Sheet1シートから項目名のディクショナリを作成 For iRCol = 3 To Sh_Moto.Cells(MOTO_KEY_ROW, 3).End(xlToRight).Column '項目名をキーとして列番号をディクショナリに保管 dicKomoku(Sh_Moto.Cells(1, iRCol).Value) = iRCol Next iRCol '【転記処理】 'Sheet2シートの社名ループ Dim MaxRow As Long MaxRow = Sh_Moto.Cells(Rows.Count, 1).End(xlUp).Row For iRRow = 2 To MaxRow 'ws2の行をフィルタリング Sh_Tenki.Select Range("A1").Select Selection.AutoFilter Selection.Range("A1").AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=Sh_Moto.Range(iRRow, 1).Value2 'ここでストップします。 Selection.Range("A1").AutoFilter Field:=2, Criteria1:=Sh_Moto.Range(iRRow, 2).Value 'フィルタされた行の行番号を取得 iWRow = ActiveSheet.Row 'Sheet2シートの項目ループ For iWCol = 4 To Sh_Moto.Cells(KENSAKU_ROW, 4).End(xlToRight).Column '項目名からSheet1の列番号を取得 If dicKomoku.Item(Sh_Tenki.Cells(KENSAKU_ROW, iWCol).Value) = "" Then '項目名から列番号が取得できない場合は何もしない Else 'Sheet1の列番号を取得 iRCol = dicKomoku.Item(Sh_Tenki.Cells(KENSAKU_ROW, iWCol).Value) '「Sheet1」シートの取得行・取得列のセルの値を、「Sheet2」シートの出力行・出力列に出力する Sh_Tenki.Cells(iWRow, iWCol).Value = Sh_Moto.Cells(iRRow, iRCol).Value End If Next iWCol Selection.Range("A1").AutoFilter Next iRRow

End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Sheet1
Sheet2

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

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

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

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

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

guest

回答2

0

ベストアンサー

転記先の行番号、列番号の方を辞書にしたらどうでしょう。

VBA

1Sub Sample() 2 Dim Sh_Moto As Worksheet '「Sheet1」シート 3 Dim Sh_Tenki As Worksheet '「Sheet2」シート 4 Set Sh_Moto = Worksheets("Sheet1") 5 Set Sh_Tenki = Worksheets("Sheet2") 6 7 With Sh_Tenki 8 Dim dicRow As Object 9 Dim dicCol As Object 'Sheet2の項目名行番号ディクショナリ 10 Set dicRow = CreateObject("Scripting.Dictionary") 11 Set dicCol = CreateObject("Scripting.Dictionary") 12 Dim c As Range 13 For Each c In .UsedRange.Columns(1).Cells 14 dicRow(c.Text & vbTab & c.Offset(, 1).Value) = c.Row 15 Next 16 For Each c In .UsedRange.Rows(1).Cells 17 dicCol(c.Value) = c.Column 18 Next 19 End With 20 21 With Sh_Moto 22 Dim i 23 For i = 2 To .UsedRange.Rows.Count 24 Sh_Tenki.Cells(dicRow(.Cells(i, 1).Text & vbTab & .Cells(i, 2).Value), dicCol(.Cells(i, 3).Value)).Value = .Cells(i, 4).Value 25 Next 26 End With 27End Sub 28

投稿2021/07/11 07:02

jinoji

総合スコア4585

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

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

chuzenji_c

2021/07/17 06:14

大変ありがとうございました。 実際使うものには列が900ほどあるのですが、頂いたコードをアレンジしてうまく動いたので、思わず拍手してしまいました。勤務先の情報担当にアドバイスを求めても門前払いでしたので、こちらで伺ってお返事いただいて、本当に助かりました。参考書にもWEBにも載っていないこのようなコードが書けるように、自分も精進したいです。 teratailに出会えてよかったです。
guest

0

コードの内容は精査してませんが、下記はあきらかな間違いです。

Sh_Moto.Range(iRRow, 1).Value2

正しくは、

Sh_Moto.Cells(iRRow, 1).Value2

投稿2021/07/11 06:08

hatena19

総合スコア33715

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

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

chuzenji_c

2021/07/17 06:02

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問