Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Microsoft 365)
Resizeと変数の使い方が理解できません?
投稿日時: 22/08/30 12:41:35
投稿者: momo1123

まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。このマクロで条件が一致したら10行コピーするへ変更するにはどのような修正を加えればよいでしょう?教えていただける方がいらっしゃいましたら宜しくお願い致します。
 
Sub Sample()
    Dim x As Variant
    Dim c As Range
    Dim cols As Long
    With Sheets("まとめ")
        'シート1の列数取得
        cols = .Cells(1, .Columns.Count).End(xlToLeft).Column
    End With
    With Sheets("集計")
        '最初に転記領域のクリア
        .Columns("B").Resize(, cols).ClearContents
        'シート2のA1からA列のデータ最終行までのセルを1つずつ取り出す
        For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
            'その値でシート1のD列をMach検索
            x = Application.Match(c.Value, Sheets("まとめ").Columns("B"), 0)
            If IsNumeric(x) Then 'もしあれば
                '1行分を転記
                c.Offset(, 2).Resize(, cols).Value = Sheets("まとめ").Cells(x, "A").Resize(, cols).Value
            End If
        Next
    End With
 End Sub

回答
投稿日時: 22/08/30 13:04:48
投稿者: taitani
投稿者のウェブサイトに移動

10行というより、該当データを一度配列に保管して、一気に集計シートへ貼り付けた方がいいと思います。
 
・参考ページ
https://excel-ubara.com/excelvba1/EXCELVBA414.html

回答
投稿日時: 22/08/30 14:45:01
投稿者: simple

Resizeの使い方はヘルプを見れば理解されると思います。
 
ただし、あなたの対象としているシート内容がこちらにはよくわかりませんので、
コードでの説明は難しいです。
 
まとめシート、集計シートのサンプルを、いずれも3列と仮定して、
10行ではなく4行ずつくらいの例で、サンプルを示してもらえますか?
処理前と処理後でどのようなものにしたいのでしょうか。

回答
投稿日時: 22/08/30 16:27:52
投稿者: WinArrow
投稿者のウェブサイトに移動

>このマクロで条件が一致したら10行コピーするへ変更するにはどのような修正を加えればよいでしょう?
  
小手先だけでよければ
> c.Offset(, 2).Resize(, cols).Value = Sheets("まとめ").Cells(x, "A").Resize(, cols).Value

  c.Offset(, 2).Resize(10, cols).Value = Sheets("まとめ").Cells(x, "A").Resize(10, cols).Value
 
のように修正すればよいが、あなたの意図通りになっているかわかりませんよ。
 
・・・大丈夫なんでしょうか?
 
 
このコードの条件は、
「1件毎に、「まとめ」シートと照合しています」が、
あなたの「このマクロで条件が一致したら、10行を複写」とは、
別のデータも複写することになるかもしれませんし、重複した複写するかもしれません。
  
再度、検討してみた方がよいかもしれませんね・・・・・
 

回答
投稿日時: 22/08/30 16:34:40
投稿者: Suzu

引用:
10行コピーする

が あいまいな表現なので具体的な動作として希望と合致しているか判りませんが
 
シート まとめ のセルの値が
	A	B	C
1	A1	B1	C1
2	A2	B2	C2
3	A3	B3	C3
4	A4	B4	C4
5	A5	B5	C5

シート 集計 のセルの値が
	A
1	B1
2	B2
3	B3

上記の様になっているとして、
 
 
現状のコードの動作 と 10行 のコピー のワードから推測し
説明の為、10行のコピーを 4行のコピー として 表現しますが
 
	A	B	C	D	E
1	B1		A1	B1	C1
2	B2		A1	B1	C1
3	B3		A1	B1	C1
4			A1	B1	C1
5			A2	B2	C2
6			A2	B2	C2
7			A2	B2	C2
8			A2	B2	C2
9			A3	B3	C3
10			A3	B3	C3
11			A3	B3	C3
12			A3	B3	C3
こう したいとするなら
 
Sub Sample()
  Const rs As Long = 4 '行毎
 
  Dim x As Variant
  Dim c As Range
  Dim r As Long '転記先カウンター
  Dim cols As Long
 
  With Sheets("まとめ")
    'シート1の列数取得
    cols = .Cells(1, .Columns.Count).End(xlToLeft).Column
  End With
 
  With Sheets("集計")
    '最初に転記領域のクリア
    .Columns("B").Resize(, cols).ClearContents
    'シート2のA1からA列のデータ最終行までのセルを1つずつ取り出す
    For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
      'その値でシート1のD列をMach検索
      x = Application.Match(c.Value, Sheets("まとめ").Columns("B"), 0)
      If IsNumeric(x) Then 'もしあれば
        '1行分を転記
        c.Offset(r, 2).Resize(rs, cols).Value = Sheets("まとめ").Cells(x, "A").Resize(, cols).Value
        r = r + rs - 1
      End If
    Next
  End With
 End Sub
 
こんな感じかと。
 
多分、希望と違うでしょうが、実例を挙げる説明の仕方として参考にしてください。

トピックに返信