アプリ版:「スタンプのみでお礼する」機能のリリースについて

マクロでシート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

A 回答 (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
    • good
    • 0
この回答へのお礼

何度も何度もすいませんでした。
説明が悪くてすいませんでした。

>シート1のA1から貼り付けて良いのですね。

はいそうです。
1行目は項目行なんです。
ですからシート1は一旦全部クリアしてまっさらにして
シート2は全行を
シート1の1行目から貼付。
これで1行目がまた項目行になります。
でシート3~6はもう項目行は不要なので
2行目~最終行を
貼り付けていきます。

今回の記述で思ったとおりに動きました。

またシート名を変更して他にも流用が可能です。
どうもありがとうございました。

お礼日時:2010/11/22 16:45

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
    • good
    • 0
この回答へのお礼

思ったとおりできました。
どうもありがとうございました。

お礼日時:2010/11/19 10:40

#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
    • good
    • 0
この回答へのお礼

ありがとうございます。
思ったとおり動きました。

ただ、
シート2は1行目から最終行を
シート1の1行目から転記、

シート3~6は2行目から最終行を
シート1の最終行(前回の転記後の最終行)から転記なのですが

一番最初の
シート2をシート1に転記する所で
シート1の2行目から転記されています。
この時点でシート1の1行目が空白です。
よって転記完了時(シート2~6までが転記された状態)
シート1の1行目が空白行になっています。

記述のどこを修正していいかよく分かりません。
申し訳ありません。

お礼日時:2010/11/19 09:07

一例です。


マクロ記録のコードは操作をシリアルに記録しているだけですから短くするのは難しい。
サンプルですが、以下のコードを標準モジュールに貼り付けてお試しください。

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
    • good
    • 0
この回答へのお礼

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

申し訳ありません。
シート2~6ですが
シート名は変更されていました。

シート2:みかん
シート3:いちご
シート3:りんご
シート4:バナナ
シート5:パイン

という感じです。

記述の中には
シート1とシート2しか出ていませんが
シート2をみかんに変更するだけで動くのでしょうか?

お礼日時:2010/11/18 18:31

短さを狙ってやってみました。

アクティブワークブックには、シート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
    • good
    • 0
この回答へのお礼

>短さを狙ってやってみました。
>アクティブワークブックには、シート1~6しか存在しない事を前提にしています。
>(というか、処理対象外のシートが存在しない事を前提にしています)

申し訳有りません。
シートは1から10まであります。

その中のシート2~6をシート1に転記したいです。

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

お礼日時:2010/11/18 09:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!