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

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

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

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

Q&A

解決済

1回答

1570閲覧

行と列の項目が一致する分の転記(クロス抽出)がうまくいかない理由について

doggyman10

総合スコア5

VBA

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

0グッド

1クリップ

投稿2021/06/30 10:53

編集2021/06/30 11:02

表題の通りとなるのですが、
結論、列の項目(複数列)と行の項目と一致した場合、
転記させる処理を試みているのですが中々うまく書き出しができない(何も転記されていない)状況にあります。
※エラー表示はされないものの、意図通りに転記されない

思い当たる節としては、列の項目にある月日の部分が引っかかっています。
また他に自分の持つ配列に対する認識が誤っている可能性もありますが、
有識者の方のお力をお借りしたくご質問させていただきました。

またこういった処理も含めて様々な処理を行うことができると思うのですが、
適した処理方法がございましたらご教示頂けますと幸いです。

(それぞれの項目を変数としてループ処理する方法や
workfunctionを用いての処理を施すなど様々な方法があるかと思いますが、
今回は配列として処理を検討しております。)

VBA

1 2Sub 一致転記() 3 4 Dim ws01, ws02 As Worksheet 5 Dim Dic As Object 6 Dim keys As String 7 Dim I, L, mRow, mCol As Long 8 Dim X, Y, mRow2, mCol2 As Long 9 10 11 Set Dic = CreateObject("Scripting.Dictionary") ' 配列の定義 12 13 Set ws01 = Worksheets("編集") 14 Set ws02 = Worksheets("転記") 15 16 mRow = ws01.Cells(Rows.Count, "C").End(xlUp).Row '最終行取得 17 mCol = ws01.Cells(7, Columns.Count).End(xlToLeft).Column '最終列取得 18 19Application.ScreenUpdating = False 20 With ws01 ' 配列へ登録 21 For L = 8 To mRow ' 範囲(列)指定 22 For I = 18 To mCol '範囲(行)指定 23 24 keys = .Cells(L, "B") & .Cells(7, I) & .Cells(8, I) 25 Dic(keys) = keys 26 Next I 27 Next L 28 End With 29 30 31 32 With ws02 33 34 mRow2 = ws02.Cells(Rows.Count, "C").End(xlUp).Row '最終行取得 35 mCol2 = ws02.Cells(3, Columns.Count).End(xlToLeft).Column '最終列取得 36 37 For X = 4 To mRow2 ' 転記表の範囲(行)指定 38 For Y = 4 To mCol2 ' 転記表の範囲(列)指定 39 40 keys = .Cells(X, "B") & .Cells(2, Y) & .Cells(3, Y) 41 42 .Cells(Y, X) = Dic(keys) 43 Next Y 44 Next X 45 End With 46 47 48Application.ScreenUpdating = True 49End Sub 50

転記シート
編集シート

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

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

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

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

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

guest

回答1

0

自己解決

配列自体が動いてるのかステップイン形式・ローカルにて確認
配列自体は正常に?動いてるが、キーに紐づくデータ(item)が格納されていないことが判明したため、
キーに紐づくitemを追加したことにより無事転記された。

また範囲指定の開始位置がずれていることや当初のコードにある変数"X"と"Y"の組み合わせが逆になっていたため、合わせて修正。'.Cells(Y, X)→.Cells(X, Y)'

VBA

1Option Explicit 2 3Sub 一致転記() 4 5 Dim ws01, ws02 As Worksheet 6 Dim Dic As Object 7 Dim keys As String 8 Dim I, L, mRow, mCol As Long 9 Dim X, Y, mRow2, mCol2 As Long 10 11 12 Set Dic = CreateObject("Scripting.Dictionary") ' 配列の定義 13 14 Set ws01 = Worksheets("編集") 15 Set ws02 = Worksheets("転記") 16 17 mRow = ws01.Cells(Rows.Count, "C").End(xlUp).Row '最終行取得 18 mCol = ws01.Cells(7, Columns.Count).End(xlToLeft).Column '最終列取得 19 20Application.ScreenUpdating = False 21 With ws01 ' 配列へ登録 22 For L = 8 To mRow ' 範囲(行)指定 23 For I = 4 To mCol '範囲(列)指定 24 25 keys = .Cells(L, "B") & .Cells(6, I) & .Cells(7, I) 26 Dic(keys) = Dic(keys) + .Cells(L, I) 27 Next I 28 Next L 29 End With 30 31 32 33 With ws02 34 35 mRow2 = ws02.Cells(Rows.Count, "B").End(xlUp).Row '最終行取得 36 mCol2 = ws02.Cells(3, Columns.Count).End(xlToLeft).Column '最終列取得 37 38 For X = 4 To mRow2 ' 転記表の範囲(行)指定 39 For Y = 4 To mCol2 ' 転記表の範囲(列)指定 40 41 keys = .Cells(X, "B") & .Cells(2, Y) & .Cells(3, Y) 42 43 .Cells(X, Y) = Dic(keys) 44 Next Y 45 Next X 46 End With 47 48 49Application.ScreenUpdating = True 50End Sub 51

投稿2021/06/30 14:22

編集2021/06/30 14:26
doggyman10

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問