- ベストアンサー
複数のシートを1つのシートにまとめるには
都道府県別に47個あるシートを1つのdataと言う名前のシートに47個のシートを移したいんですが、どうしたら出来ますか? 5行目まではコードが書けたのですが、その下が書けません。 Sub () Dim i As Integer Dim n As Integer Dim MyS1 As Worksheet Dim MyC As Worksheet よろしくお願いします。
- nodoame4
- お礼率11% (93/823)
- Visual Basic
- 回答数9
- ありがとう数4
- みんなの回答 (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/17068)
#5です。 #5で言ったことが載った、私の質問回答が見つかったので参考に。 >X,Yとそのままだと、どちらのシートのセル範囲かわからなくなるので の部分に対しての実例 http://okwave.jp/qa3697421.html
- imogasi
- ベストアンサー率27% (4737/17068)
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を代入する
関連する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
- ベストアンサー
- Excel(エクセル)
- シート名変更マクロ
「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
- ベストアンサー
- オフィス系ソフト
- 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)]で[型が一致しない]のエラーになります。 シート名を変数として扱う事は出来ないのでしょうか? 基礎の勉強が不足しているのに、見よう見まねでやっているから こんな事になるんでしょうね… わかりやすい説明をお願いします。
- 締切済み
- Visual Basic
- 値渡しについて
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 **************************************** どなたか教えて下さい。
- ベストアンサー
- Visual Basic
- 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 -------------------------------------- 以上です。 よろしくお願いいたいます。
- ベストアンサー
- Visual Basic
お礼
いろいろ説明をして頂き本当に感謝しています。 ありがとうございました。