転記元のA24に年月、B22にキーワード、B24に数値が入っています。
転記先の行番号1の中から転記元B22と合致する行を探し出し、
転記先A列と転記元A24が合致するセルに転記元B24を転記したいです。
2つの条件に合致したセルに転記したい場合は、
VBAだとどのように記述したら良いのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 05:38
回答2件
0
ExcelVBA
1Sub test() 2 Dim rngTopItem As Range 3 Dim rngSideItem As Range 4 Dim rngNumValue As Range 5 Dim rngDataBody As Range 6 Dim ixRow As Long 7 Dim ixCol As Long 8 9 With Worksheets(1) 10 '転記元のA24 11 Set rngSideItem = .Range("A24") 12 '転記元のB22 13 Set rngTopItem = .Range("B22") 14 '転記元のB24 15 Set rngNumValue = .Range("B24") 16 End With 17 '転記先 18 With Worksheets(2).Range("A1").CurrentRegion 19 Set rngDataBody = Intersect(.Cells, .Offset(1, 1)) 20 End With 21 22 With WorksheetFunction 23 '書き込み先行番号の検索 24 ixRow = .Match(rngSideItem.Value2, rngDataBody.Columns(1), 0) 25 '書き込み先列番号の検索 26 ixCol = .Match(rngTopItem.Value, rngDataBody.Rows(0), 0) 27 End With 28 29 '値の転記 30 rngDataBody(ixRow, ixCol).Value = rngNumValue.Value 31End Sub
僕が書くとこんな感じとか。
セル範囲を先に決めちゃって、
それに対してなにかする感じ^^;
ワークシート上で使うMatch関数を使ってます。
検索で見つからなかったらエラーになりますので、
エラー回避処理を入れないとだめかなぁ。。。。
あと、気になった点。
>転記元のA24に年月
単に年月と書かれてますが、
例えばセルに何も考えずに、
2020/4
と入れたら、2020/4/1を示す「数値」がセルの値に保存されます。
(43922というシリアル値)
で、勝手にエクセル君がセルの書式設定をYYYY/Mとかに変えてます。
そうでないなら、単にセルの書式設定を文字列にしてるとか。
とにかく、勝手にこちらが日付って思っていても、
中身が違ったり、エクセル君が日付と読んでくれない
可能性がエクセルには多々あります。
特にFindメソッドを使った検索では、
「値」としても、表示されている文字列を検索するため、
値が同じでも、セルの表示形式の違いでヒットしない場合がるので、
Findメソッドの日付の検索はトラブルが多いです。
(細心の注意を払えば大丈夫ですが。)
Match関数の方は「セルの値」で検索しますので、トラブルが少ないですが、
そもそもの「セルの値」=「セルに表示されている文字列」とは、
エクセルでは担保されないので注意が必要です。
投稿2020/05/07 09:33
総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/08 01:10 編集
2020/05/09 03:09
0
ベストアンサー
test1.xlsmとtest2.xlsxをDドライブのカレントでテストしました。
VBA(test1.xlsm)
1Sub tes() 2 3Dim Wb As Workbook 4Dim Sh As Worksheet 5Dim ThisSh As Worksheet 6Dim Clo As Long 7Dim Rws As Long 8 9Set Wb = Workbooks.Open(Filename:="d:\test2.xlsx") 10Set Sh = Wb.Sheets("Sheet1") 11 12Set ThisSh = ThisWorkbook.Sheets("Sheet1") 13 14col = ThisSh.Range("1:1").Find(What:=Sh.Range("B22")).Column 15Rws = ThisSh.Range("A:A").Find(What:=Sh.Range("A24")).Row 16ThisSh.Cells(Rws, col).Value = Sh.Range("B24") 17 18Set ThisSh = Nothing 19Set Sh = Nothing 20Set Wb = Nothing 21 22End Sub
追記
test1.xlsxとtest2.xlsmとする場合
開くファイルがtest1.xlsxになり、ShとThisShを入れ替えることになります。
VBA
1Sub tes2() 2 3Dim Wb As Workbook 4Dim Sh As Worksheet 5Dim ThisSh As Worksheet 6Dim Clo As Long 7Dim Rws As Long 8 9Set Wb = Workbooks.Open(Filename:="d:\test1.xlsx") 10Set Sh = Wb.Sheets("Sheet1") 11 12Set ThisSh = ThisWorkbook.Sheets("Sheet1") 13 14col = Sh.Range("1:1").Find(What:=ThisSh.Range("B22")).Column 15Rws = Sh.Range("A:A").Find(What:=ThisSh.Range("A24")).Row 16Sh.Cells(Rws, col).Value = ThisSh.Range("B24") 17 18Set ThisSh = Nothing 19Set Sh = Nothing 20Set Wb = Nothing 21 22End Sub 23
追記2
実行している.xlsmファイルのある場所(フルパス)は
VBA
1Path =ThisWorkbook.Path
で取得できます。
またデスクトップへのフルパスは
VBA
1Dim Path As String, WSH As Variant 2 Set WSH = CreateObject("WScript.Shell") 3 Path = WSH.SpecialFolders("Desktop")
投稿2020/05/06 08:03
編集2020/05/08 03:09総合スコア392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 23:57
2020/05/07 01:07
2020/05/07 01:23
2020/05/07 04:30
2020/05/07 04:30
2020/05/07 07:34
2020/05/07 08:23
2020/05/07 09:32 編集
2020/05/07 09:32
2020/05/07 09:33
2020/05/07 09:35
2020/05/07 09:38
2020/05/07 09:46
2020/05/07 09:58
2020/05/07 10:06
2020/05/07 11:04
2020/05/08 01:05
2020/05/08 03:14
2020/05/08 06:01
2020/05/08 08:28
2020/05/08 09:20
2020/05/09 06:51
2020/05/10 00:47
2020/05/10 02:05
2020/05/11 02:30
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。