マクロでシート2~6のデータをシート1に転記したいです。
シート2~6のデータを
シート1に順番に転記したくてマクロの記録を利用して作成しました。
シート2~6は列は同じですが行数は異なります。
また行数は作業の都度異なります。
同じ記述が繰り返されているので
もう少し記述が短くできるのではと思うのですが
どうすればいいでしょうか?
Sub データ更新()
'シート1の前回データをクリア
Sheets("シート1").Select
Range("A2:Q2").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("A2").Select
Sheets("シート1").Select
Range("A1").Select
Sheets("シート2").Select
Range("A1").Select 'ヘッダーも合わせて取得
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("シート1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
Sheets("シート3").Select
Range("A2").Select 'データのみ取得
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("シート1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
Sheets("シート4").Select
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("シート1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
Sheets("シート5").Select
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("シート1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
Sheets("シート6").Select
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("シート1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
End Sub
No.5ベストアンサー
- 回答日時:
#1,3です。
誤解しておりましたが、シート1のA1から貼り付けて良いのですね。どこをいじれば良いか、質問者様ならお分かりになると思いますが、
シート1をまっさらにして良いのなら、冗長なところを除いて下記でいけると思います。
Sub データ更新()
Dim sh As Worksheet
Dim destRange As Range, srcRange As Range
With Sheets("シート1")
.Cells.Clear
Set destRange = .Cells(1)
End With
For Each sh In ActiveWorkbook.Worksheets
Select Case sh.Name
Case "シート2"
Set srcRange = sh.Range("A1").CurrentRegion
srcRange.Copy destRange
Set destRange = destRange.End(xlDown).Offset(1, 0)
Case "シート3", "シート4", "シート5", "シート6"
Set srcRange = sh.Range("A1").CurrentRegion
Set srcRange = Intersect(srcRange, srcRange.Offset(1, 0))
srcRange.Copy destRange
Set destRange = destRange.End(xlDown).Offset(1, 0)
Case Else
'何もしない
End Select
Next sh
End Sub
何度も何度もすいませんでした。
説明が悪くてすいませんでした。
>シート1のA1から貼り付けて良いのですね。
はいそうです。
1行目は項目行なんです。
ですからシート1は一旦全部クリアしてまっさらにして
シート2は全行を
シート1の1行目から貼付。
これで1行目がまた項目行になります。
でシート3~6はもう項目行は不要なので
2行目~最終行を
貼り付けていきます。
今回の記述で思ったとおりに動きました。
またシート名を変更して他にも流用が可能です。
どうもありがとうございました。
No.4
- 回答日時:
NO2です。
>シート2をみかんに変更するだけで動くのでしょうか?
⇒シート名を拠り所にしているので動きません。
前提として、シート構成が左から「シート1」→「みかん」~「パイン」(この部分は任意)→「その他シート」順ならば以下のコードで可能です。
Sub シート結合()
Application.ScreenUpdating = False
Sheets(1).Cells.Clear
Sheets(2).Range("1:1").Copy Sheets(1).Range("A1")
For i = 2 To 6
With Sheets(i)
最終行 = .Cells(Rows.Count, 1).End(xlUp).Row
最終列 = .Cells(1, Columns.Count).End(xlToLeft).Column
If 最終行 >= 2 Then
開始行 = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
.Activate
.Range(Cells(2, 1), Cells(最終行, 最終列)).Copy _
Sheets("シート1").Cells(開始行, 1)
End If
End With
Next
Sheets(1).Activate
Range("A1").Select
Application.ScreenUpdating = True
End Sub
No.3
- 回答日時:
#1です。
コードをご覧になれば分かると存じますので、シート名をお好きな様に変更してお使い下さい。Sub データ更新3()
Dim sh As Worksheet
Dim destRange As Range, srcRange As Range
With Sheets("シート1")
If .Range("A2").Value = "" Then
Set destRange = .Range("A2")
Else
Set destRange = .Range(.Range("A2"), .Range("A2").End(xlToRight))
Set destRange = .Range(destRange, destRange.End(xlDown))
destRange.ClearContents
Set destRange = destRange.Cells(1)
End If
End With
For Each sh In ActiveWorkbook.Worksheets
Select Case sh.Name
Case "シート2"
Set srcRange = sh.Range("A1").CurrentRegion
srcRange.Copy destRange
Set destRange = destRange.End(xlDown).Offset(1, 0)
Case "シート3", "シート4", "シート5", "シート6"
Set srcRange = sh.Range("A1").CurrentRegion
Set srcRange = Intersect(srcRange, srcRange.Offset(1, 0))
srcRange.Copy destRange
Set destRange = destRange.End(xlDown).Offset(1, 0)
Case Else
'何もしない
End Select
Next sh
End Sub
ありがとうございます。
思ったとおり動きました。
ただ、
シート2は1行目から最終行を
シート1の1行目から転記、
シート3~6は2行目から最終行を
シート1の最終行(前回の転記後の最終行)から転記なのですが
一番最初の
シート2をシート1に転記する所で
シート1の2行目から転記されています。
この時点でシート1の1行目が空白です。
よって転記完了時(シート2~6までが転記された状態)
シート1の1行目が空白行になっています。
記述のどこを修正していいかよく分かりません。
申し訳ありません。
No.2
- 回答日時:
一例です。
マクロ記録のコードは操作をシリアルに記録しているだけですから短くするのは難しい。
サンプルですが、以下のコードを標準モジュールに貼り付けてお試しください。
Sub シート結合()
Application.ScreenUpdating = False
Sheets("シート1").Cells.Clear
Sheets("シート2").Range("1:1").Copy Sheets("シート1").Range("A1")
For i = 2 To 6
With Sheets("シート" & Application.Dbcs(i))
最終行 = .Cells(Rows.Count, 1).End(xlUp).Row
最終列 = .Cells(1, Columns.Count).End(xlToLeft).Column
If 最終行 >= 2 Then
開始行 = Sheets("シート1").Cells(Rows.Count, 1).End(xlUp).Row + 1
.Activate
.Range(Cells(2, 1), Cells(最終行, 最終列)).Copy _
Sheets("シート1").Cells(開始行, 1)
End If
End With
Next
Sheets("シート1").Activate
Range("A1").Select
Application.ScreenUpdating = True
End Sub
ありがとうございました。
申し訳ありません。
シート2~6ですが
シート名は変更されていました。
シート2:みかん
シート3:いちご
シート3:りんご
シート4:バナナ
シート5:パイン
という感じです。
記述の中には
シート1とシート2しか出ていませんが
シート2をみかんに変更するだけで動くのでしょうか?
No.1
- 回答日時:
短さを狙ってやってみました。
アクティブワークブックには、シート1~6しか存在しない事を前提にしています。(というか、処理対象外のシートが存在しない事を前提にしています)
もっと分かり易い回答が、他の方からあると存じます。
Sub データ更新2()
Dim sh As Worksheet
Dim destRange As Range, srcRange As Range
With Sheets("シート1")
If .Range("A2") = "" Then
Set destRange = .Range("A2")
Else
Set destRange = .Range(.Range("A2"), .Range("A2").End(xlToRight))
Set destRange = .Range(destRange, destRange.End(xlDown))
destRange.ClearContents
Set destRange = destRange.Cells(1)
End If
End With
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> "シート1" Then
Set srcRange = sh.Range("A1").CurrentRegion
If sh.Name <> "シート2" Then Set srcRange = Intersect(srcRange, srcRange.Offset(1, 0))
srcRange.Copy destRange
Set destRange = destRange.End(xlDown).Offset(1, 0)
End If
Next sh
End Sub
>短さを狙ってやってみました。
>アクティブワークブックには、シート1~6しか存在しない事を前提にしています。
>(というか、処理対象外のシートが存在しない事を前提にしています)
申し訳有りません。
シートは1から10まであります。
その中のシート2~6をシート1に転記したいです。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Excel(エクセル) エクセルで最下行にデータを追加するVBA 6 2023/05/09 09:30
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) 別のシートの最終行の値を参照するには 5 2022/12/15 13:18
- Excel(エクセル) 【VBA】A列にある連続したデータの1番下に文字列を入力したい 1 2023/01/28 04:40
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
括弧があるとHYPERLINKで飛べな...
-
エクセルで複数のシートをフォ...
-
原付 レッツシート開け方
-
車のシートがへたってきました...
-
リアシート無しで運転してたら...
-
Excel複数シートから日付と文字...
-
台所流しの水音を小さくしたい
-
シートベルトの固定解除
-
車のシートでおもらし
-
マクロの別シートのデータ振り...
-
癒着してしまったテレビの液晶...
-
車内ビショビショ・・・
-
土間シートはどこに行けば買え...
-
エクセルVBA 4行飛ばしで転記す...
-
エストレヤの鞍型シートを純正...
-
エストレヤのシートが外せない…
-
建築模型、カーブの作り方
-
マグネットシートって・・・
-
ホンダのフリードの7人乗りは...
-
バイクのシートをペイントする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
括弧があるとHYPERLINKで飛べな...
-
原付 レッツシート開け方
-
エクセルVBA 4行飛ばしで転記す...
-
防風目的で使おうと写真の白い...
-
シートベルトの固定解除
-
車のシートでおもらし
-
ポケットにミシンでワッペンを...
-
Excel複数シートから日付と文字...
-
リアシート無しで運転してたら...
-
水の染み込んだバイクのシート...
-
Excel VBA シート名変更時、重...
-
電車のシートって何でこんな暑...
-
バイクのシートを取り替えても...
-
フォルツァ バッテリーを外して...
-
ポップコーンの捨て方
-
建築模型、カーブの作り方
-
マグナ250とマグナ50でパーツの...
-
Googleのスプレッドシートでシ...
-
アドレスV125G(K7)の整備に詳...
おすすめ情報