• ベストアンサー

複数のシートを1つのシートにまとめるには

都道府県別に47個あるシートを1つのdataと言う名前のシートに47個のシートを移したいんですが、どうしたら出来ますか? 5行目まではコードが書けたのですが、その下が書けません。 Sub () Dim i As Integer Dim n As Integer Dim MyS1 As Worksheet Dim MyC As Worksheet よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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でのアドバイスとは、全く関連がないですし。 あちこちでコードを提示されて混乱しているのではないですか? それでは、ご自身が困るだけだと思いますけど。

nodoame4
質問者

お礼

いろいろ説明をして頂き本当に感謝しています。 ありがとうございました。

その他の回答 (8)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

ANo.3のコードにUsedRange プロパティを調べる事で、解決できると 思いますよ。 或いは、ANo.5さんの”最終行の取得”にてコピー範囲を限定すると 言う方法もあります。 ”新しいシートを追加して名前をdataとする”のは、マクロの記録 で試されては?

nodoame4
質問者

補足

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)
回答No.7

>A1とA2しかdataの名前のSheetに書き込みがされないのですが・・・ 正確なデータ範囲の情報の提示がないからですね。 ファイルを見ましたが、”全国”が”data”に該当するのでしょうか? 必要な範囲は12行目以下になるのかな?(1回だけ11行目が必要?) こうゆう場合って、どのシート名から引っ張ってきたのかの情報も 書き込まないと、後々まずいですよね? そこが不明確。

nodoame4
質問者

補足

ご解答ありがとうございます。 全国がdataでは無くて、ファイルには乗っていませんが、挿入→ワークシートで新しいSheet、dataを作ります。 それから必要なファイルは、47個のSheet1行目から28行目までの全部となります。それら全部のデータをdataという名前のSheetに移したいということです。 申し訳ありませんでした。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#5です。 #5で言ったことが載った、私の質問回答が見つかったので参考に。 >X,Yとそのままだと、どちらのシートのセル範囲かわからなくなるので の部分に対しての実例 http://okwave.jp/qa3697421.html

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

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)
回答No.4

>インデックスが有効範囲にありません。と表示されてしまうのですが・・・ dataと言う名前のシート ⇒Worksheets("data") あってますか?

nodoame4
質問者

補足

インデックスが有効範囲にありませんとは表示されなくなったのですが、A1とA2しかdataの名前のSheetに書き込みがされないのですが・・・

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

>データの転記順は決まりはありません。 >ただ、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 こうゆう感じの事ですか?

nodoame4
質問者

補足

インデックスが有効範囲にありません。と表示されてしまうのですが・・・ 解答していただいたのに申し訳ありません。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>都道府県別に47個あるシートを1つのdataと言う名前のシートに47個のシートを移したいんですが データの転記順(シート選択順)に決まりはありますか? ・左のシートから ・右のシートから ・その他

nodoame4
質問者

補足

ご回答ありがとうございます。 データの転記順は決まりはありません。 ただ、For~NextかDo~Loopで処理が出来たら嬉しいです。

noname#52439
noname#52439
回答No.1

こんな感じでできます。 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

nodoame4
質問者

補足

ありがとうございました! もし宜しければ、1行ごとにコードはどのような処理をしているのか説明していただけたら嬉しいです。 例えば、Worksheets.Add ←新しいシートを挿入する。 ActiveSheet.Name="data" ←挿入されたシートは必ずアクティブになるので、アクティブシートの名前にdataを代入する

関連するQ&A

  • VBAでの説明がわかりません

    以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。 Sub まとめ() Dim i As Integer 'カウンタ変数iの宣言 Dim n As Integer  Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言 Dim MyC As Worksheet Worksheets.Add before:=Worksheets("全国") ActiveSheet.Name = "data" Set MyS1= Worksheets("data") With Worksheets("全国") MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value End With i=12 For Each MyC In Worksheets If MyC.Name<> "data" Then n = 12 MyS1.Cells(i,1)=MyC.Name i=i+1 Do While MyC.Cells(n,2).Value<>"" MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value i=i+1 n=n+1 Loop End If Next Myc End Sub

  • VBAのシートイベントで教えてください

    シートのN4以下で、既に同じ番号があれば「既に同じ番号があります」 と表示するようにしたく、下のように書きましたが、肝心な部分 の、どのように同じ番号をみつけるようにすのかわかりませんでした。 教えていただけないでしょうか。宜しくお願いします。 Private Sub worksheet_change(ByVal target As Range) Dim 範囲左 As Integer Dim 範囲右 As Integer Dim 範囲上 As Integer 範囲左 = 1 範囲右 = 16 範囲上 = 4 With target 'if '指定した範囲の列Nに既に同じ番号や文字列があれば MsgBox "既に同じ番号があります。" End If End With End Sub

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • シート名変更マクロ

    「1」というシートのH4にコピー数を入力し、「1」の後ろに挿入するマクロがあります。できたシートの名前は「1(2)」「1(3)」となってしまいます。このシート名を挿入した数の通し番号(「2」「3」に変更することはできるのでしょうか?挿入するシートの数は決まっていません。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) Next i End Sub

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • VBAで一番後尾のシート見出しの色を変更したい

    WIN XP エクセル2003 BOOK内の一番後尾のシート見出しの色を変更したいのですが 下記コードでは見出しの色が変わりません。 何処が間違っているのかわかりません。ご教授お願い致します。 Sub シート見出し色変更() Dim N As Integer Dim sh As Worksheet N = ActiveWorkbook.Worksheets.Count Worksheets(N).Activate Set sh = ActiveSheet sh.Tab.ColorIndex = 3 Worksheets(1).Select End Sub

  • VBA 複数シート選択について

    Sub test() Dim i As Integer i = ActiveWorkbook.Worksheets.Count Worksheets(Array(2, i)).Select End Sub シート2とシートi の選択ではなく、2~iまでの複数シート を選択するにはどのように書くのかご教示下さい。

  • 2つのブックに各々複数のシートがあります。これをユーザーフォームのリストで選択したシート間のコピーをしたい

    ------------------------------------------------------------ Private Sub UserForm_Initialize() Dim lstFsheet As Worksheet 'コピー元シート名格納リスト Dim lstTsheet As Worksheet 'コピー先シート名格納リスト Dim txtFline As Integer 'コピー元行数格納項目 Dim txtTline As Integer 'コピー先行数格納項目 'コピー元シート名リスト 設定 frmCopyNaka.lstFsheet.AddItem "販売台帳11月" frmCopyNaka.lstFsheet.AddItem "販売台帳12月" 'コピー先シート名リスト 設定 frmCopyNaka.lstTsheet.AddItem "2009.11.9" frmCopyNaka.lstTsheet.AddItem "2009.11.13" frmCopyNaka.lstTsheet.AddItem "2009.12.3" End Sub ---------------------------------------------------------- Private Sub cmdCopy_Click() Dim Fsheet As Worksheet Dim Tsheet As Worksheet ' Set Fsheet = Workbooks("販売台帳.xls").Worksheet(lstFsheet) Set Tsheet = Workbooks("申込書.xls").Worksheet(lstTsheet) Tsheet.Cells(txtTline, 2) = Fsheet.Cells(txtFline, 3) ------------------------------------------------------------ という感じでうまくいくと思ったのですが、 Set Fsheet = Workbooks("販売台帳.xls").Worksheet(lstFsheet) の[worksheet(lstFsheet)]で[型が一致しない]のエラーになります。 シート名を変数として扱う事は出来ないのでしょうか? 基礎の勉強が不足しているのに、見よう見まねでやっているから こんな事になるんでしょうね… わかりやすい説明をお願いします。

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

  • VBAで、35行3列の範囲を通し番号で埋めたい

    お世話になります。 表題のとおり、F5:H35の範囲で、通し番号を入力したいのですが、VBAコードのヒントを教えていただけませんでしょうか? 番号を振る規則は「5行が1・2・3」「6行が4・5・6」といった具合に、横に昇順に並べたいのです。 最後に「35行が103・104・105」としたいです。 下記のようにコードを書いてみました。 5行(1行目)まで走るんですが、6行(2行目)に改行してくれませんでした。 For構文の原理がいまひとつ理解できてないからでしょうか? --------------------------------------- Sub 通し番号() 1) Dim i As Integer, j As Integer, n As Integer 2) i = 5 3) j = 6 4) n = 1 5)For i = i To 35 6)For j = j To 8 7)Cells(i, j) = n 8)n = n + 1 9)Next 10)Next End Sub -------------------------------------- 以上です。 よろしくお願いいたいます。

専門家に質問してみよう