- ベストアンサー
複数のシートを1つのシートにまとめるには
都道府県別に47個あるシートを1つのdataと言う名前のシートに47個のシートを移したいんですが、どうしたら出来ますか? 5行目まではコードが書けたのですが、その下が書けません。 Sub () Dim i As Integer Dim n As Integer Dim MyS1 As Worksheet Dim MyC As Worksheet よろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>書いてみたんですが、エラーが出てしまいます。どこがいけないのでしょうか? まず、どこがエラーなのかを提示しなければいけません。 >Dim mya As Integer >Set mya = Worksheets("data") >For Each mya In Worksheets 変数myaの宣言と使い方が一致してません。 そもそもご自身で作られた部分にはない変数名ですが。。。 >Sub () >Dim i As Integer >Dim n As Integer >Dim MyS1 As Worksheet >Dim MyC As Worksheet ANo.8でのアドバイスとは、全く関連がないですし。 あちこちでコードを提示されて混乱しているのではないですか? それでは、ご自身が困るだけだと思いますけど。
その他の回答 (8)
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3のコードにUsedRange プロパティを調べる事で、解決できると 思いますよ。 或いは、ANo.5さんの”最終行の取得”にてコピー範囲を限定すると 言う方法もあります。 ”新しいシートを追加して名前をdataとする”のは、マクロの記録 で試されては?
補足
Sub ya() Dim i As Integer Dim n As Integer Dim mya As Integer Set mya = Worksheets("data") n = 5 b = 7 For Each mya In Worksheets If myb.Name = "data" Then ElseIf i = 0 Then mya.Range(mya.Cells(1, 1), mya.Cells(94, 4)) = myb.Range(myb.Cells(1, 1), myb.Cells(94, 4)).Value i = i + 1 Else mya.Range(mya.Cells(1, n), mya.Cells(94, b)) = myb.Range(myb.Cells(1, 2), myb.Cells(94, 4)).Value n = n + 3 b = b + 3 End If Next myb End Sub ありがとうございます。 書いてみたんですが、エラーが出てしまいます。どこがいけないのでしょうか?
- n-jun
- ベストアンサー率33% (959/2873)
>A1とA2しかdataの名前のSheetに書き込みがされないのですが・・・ 正確なデータ範囲の情報の提示がないからですね。 ファイルを見ましたが、”全国”が”data”に該当するのでしょうか? 必要な範囲は12行目以下になるのかな?(1回だけ11行目が必要?) こうゆう場合って、どのシート名から引っ張ってきたのかの情報も 書き込まないと、後々まずいですよね? そこが不明確。
補足
ご解答ありがとうございます。 全国がdataでは無くて、ファイルには乗っていませんが、挿入→ワークシートで新しいSheet、dataを作ります。 それから必要なファイルは、47個のSheet1行目から28行目までの全部となります。それら全部のデータをdataという名前のSheetに移したいということです。 申し訳ありませんでした。
- imogasi
- ベストアンサー率27% (4737/17069)
#5です。 #5で言ったことが載った、私の質問回答が見つかったので参考に。 >X,Yとそのままだと、どちらのシートのセル範囲かわからなくなるので の部分に対しての実例 http://okwave.jp/qa3697421.html
- imogasi
- ベストアンサー率27% (4737/17069)
1つの道具立てでこの課題は解決するはず。 都道府県の1つのシートの最終行を d1=Range("A65536").End(xlUp).Row (x) で捉える。 2行目-最終行の範囲をコピーする Data集約シートの最終行を上記と同じく捕まえる。 d2=Range("A65536").End(xlUp).Row (Y) その次行を基点として張り付ける。 以上の47回の繰り返し(For Each Sh In Worksheets) 注意点 ●コピー貼り付けにDestinationを使うほうがよい。やたらにActivateを繰り返さ無いため。 ●X,Yとそのままだと、どちらのシートのセル範囲かわからなくなるので、前にオブジェクトを限定・区別する記述が必要。 以上のヒントぐらいで、何を言っているか推測が付かないなら、この課題を自力でやるまでに勉強が進んでいない。本質問は回答コードを回答者に書かせて、そっくり頂きの風であり、望ましくない。
- n-jun
- ベストアンサー率33% (959/2873)
>インデックスが有効範囲にありません。と表示されてしまうのですが・・・ dataと言う名前のシート ⇒Worksheets("data") あってますか?
補足
インデックスが有効範囲にありませんとは表示されなくなったのですが、A1とA2しかdataの名前のSheetに書き込みがされないのですが・・・
- n-jun
- ベストアンサー率33% (959/2873)
>データの転記順は決まりはありません。 >ただ、For~NextかDo~Loopで処理が出来たら嬉しいです。 Sub test() Dim ws As Worksheet Dim r As Range Dim rr As Range With Worksheets("data") Set rr = .Range("A1") For Each ws In Worksheets If ws.Name <> .Name Then Set r = ws.Range("A1").CurrentRegion rr.Resize(r.Rows.Count, r.Columns.Count).Value = r.Value Set rr = rr.Offset(r.Rows.Count) End If Next End With End Sub こうゆう感じの事ですか?
補足
インデックスが有効範囲にありません。と表示されてしまうのですが・・・ 解答していただいたのに申し訳ありません。
- n-jun
- ベストアンサー率33% (959/2873)
>都道府県別に47個あるシートを1つのdataと言う名前のシートに47個のシートを移したいんですが データの転記順(シート選択順)に決まりはありますか? ・左のシートから ・右のシートから ・その他
補足
ご回答ありがとうございます。 データの転記順は決まりはありません。 ただ、For~NextかDo~Loopで処理が出来たら嬉しいです。
こんな感じでできます。 Sub MergeWorkSheets() Dim i As Long Application.DisplayAlerts = False With Application.ActiveWorkbook For i = .Worksheets.Count To 2 Step -1 .Worksheets(i).Delete Next .Worksheets(1).Cells.Delete Shift:=xlUp .Save End With End Sub
補足
ありがとうございました! もし宜しければ、1行ごとにコードはどのような処理をしているのか説明していただけたら嬉しいです。 例えば、Worksheets.Add ←新しいシートを挿入する。 ActiveSheet.Name="data" ←挿入されたシートは必ずアクティブになるので、アクティブシートの名前にdataを代入する
お礼
いろいろ説明をして頂き本当に感謝しています。 ありがとうございました。