[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のシートをまとめ、A列に各シート名を表示したい』(えま)
こんばんは。
左から4番目以降の複数のシートのデータを、左から2番目の「まとめ」
シートにまとめたいのです。
各シートの1行目、列数は同じです。
最終行はバラバラです。
先日Mookさんに同じような質問をし、
https://www.excel.studio-kazu.jp/kw/20120407230100.html
新規ブックにまとめるサンプルを教えていただきました。
Sub MakeOneSheet() Dim dstWS As Worksheet Set dstWS = Workbooks.Add().Worksheets(1)
Dim ws As Worksheet Dim dstRow As Long dstRow = 1 For Each ws In ThisWorkbook.Worksheets lastRow = ws.UsedRange.Rows.Count dstWS.Cells(dstRow, "A").Value = ws.Name ws.Range("A1:S" & lastRow).Copy _ Destination:=dstWS.Range(dstWS.Cells(dstRow, "B"), dstWS.Cells(dstRow + lastRow - 1, "T")) dstRow = dstRow + lastRow Next End Sub
これを元に、同じブック内の「まとめ」シートにまとめることができないかと
試行錯誤したのですが、上手くいきません。
以下のプログラムにしてみました。
どこを直せば良いのでしょうか?
Sub 一つのシートにまとめる()
Dim dstWS As Worksheet
Set dstWS = ThisWorkbook.Sheets("まとめ")
Dim ws As worksheet
Dim dstRow as long
dstRow =1
Dim a as integer
a=ThisWorkbook.Worksheets.Count Dim iAs Integer For i = 4 to a For Each ws In ThisWorkbook.Worksheets lastRow = ws.UsedRange.Rows.Count dstWS.Cells(dstRow, "A").Value = ws.Name ws.Range("A1:S" & lastRow).Copy _ Destination:=dstWS.Range(dstWS.Cells(dstRow, "B"), dstWS.Cells(dstRow + lastRow - 1, "T")) dstRow = dstRow + lastRow Next End Sub
あと、Mookさんに教えていただいたサンプルでは、A列の1行目にシート名が
入るのですが、そのシート名を元のデータの行数分入れることはできますか?
Excel2007
Windows XP
どうぞ、よろしくお願いします。
(えま)
For 〜 Next の対は整合するようにしてくださいね。 インデント(字下げ)を付けると、不整合がわかりやすいです。
こんな感じの変更でできるでしょうか。 (Mook)
Sub 一つのシートにまとめる() Dim dstWS As Worksheet Set dstWS = ThisWorkbook.Sheets("まとめ")
Dim dstRow As Long dstRow = 1
Dim wsCount As Integer '// 変数は意味が分かる名前にした方が良いです。 wsCount = ThisWorkbook.Worksheets.Count
Dim ws As Worksheet Dim i As Integer For i = 4 To wsCount '// 4シート目から集計したいという事でしたらこれで OK Set ws = ThisWorkbook.Worksheets(i) lastrow = ws.UsedRange.Rows.Count '// dstWS.Cells(dstRow, "A").Value = ws.Name dstWS.Cells(dstRow, "A").Resize(lastrow, 1).Value = ws.Name '// 行数分シート名を記載 ws.Range("A1:S" & lastrow).Copy _ Destination:=dstWS.Range(dstWS.Cells(dstRow, "B"), dstWS.Cells(dstRow + lastrow - 1, "T")) dstRow = dstRow + lastrow Next End Sub
For 〜 Next の対は整合するようにしてくださいね。
インデント(字下げ)を付けると、不整合がわかりやすいです。
確かに私のはForが二つあるのに、Nestは一つですね。
次からはインデントを付け、見落とさないよう気をつけます。
変数は意味が分かる名前にした方が良いです。
「dst」は何かの略ですか?例えばDestinationとか。
(えま)
>「dst」は何かの略ですか?例えばDestinationとか。 あっ、例示のコードは少し分かりにくかったですね。
推測は大当たりです。
プログラムでは代入式の 元になるデータ(右辺)を Source、 代入する先(左辺)を Destination というので、私は変数の頭に src, dst のようにつけて区別しています。 自分で意味の分かる変数にすればよいと思いますし、VBA では日本語の変数名も付けら れるので変なローマ字表記よりは日本語の方が後々見やすいかもしれません。
脱線ですが、 最近の質問で興味本位で書いた例ですが、後ろの方に日本語変数で書いたことがありました。 [[20120308171951]] (Mook)
貼っていただいたリンクの内容を読みました。
プログラムの内容は「すごいなー(あぜん)」との理解しかできませんでしたが、
初心者の方が戸惑うのは、文法や関数かと思っていましたが、変数の意味の理解も意外に
手間取っているということなのでしょうか。
ここには激しく同意しました。
cntはcount, srcはserchで、母音を省いた3文字で作ると覚えておくといいのだろうと思ったのですが、
repはたぶんreplaceで、なぜrplと表記しないのか?
きっと昔からの慣習で、repかrplかはどうでもいいことなんだろう。
それからfResとは、、、
こんなことを考えながら読み解いていくと、肝心の文法や関数を理解する段階で頭の中が
ぐるぐる@@になってしまいます。
きっとプログラムを書くには英語表記の方が文字数が少なくて入力も早いでしょうし、
読むほうも読みやすいんだろうなと思うのですが、
慣れるまでは日本語表記がありがたいです。
日本語表記をして下さっているプログラムと、その元のプログラムをエクセルに並べて貼り付けたので、
今からじっくりと読み比べてみようと思います。
ありがとうございました。
(えま)
自分の分かりやすい言葉に直すと、後で見やすいと思いますが、 こんな感じで置換してみると、少しはわかりやすくなるでしょうか。
ソースをじっくり見てみるというのも、マクロの理解になると思いますので、 ご参考までに。 (Mook)
Sub 一つのシートにまとめる() Dim まとめシート As Worksheet Set まとめシート = ThisWorkbook.Sheets("まとめ")
Dim 貼り付け開始行 As Long 貼り付け開始行 = 1
Dim シート数 As Integer '// 変数は意味が分かる名前にした方が良いです。 シート数 = ThisWorkbook.Worksheets.Count
Dim 処理シート As Worksheet Dim 最終行 As Long Dim i As Integer '// まぁ、このくらいは^^ 「シート位置」としてもいいかもしれませんが・・・ For i = 4 To シート数 '// 4シート目から集計したいという事でしたらこれで OK Set 処理シート = ThisWorkbook.Worksheets(i) 最終行 = 処理シート.UsedRange.Rows.Count '// まとめシート.Cells(貼り付け開始行, "A").Value = 処理シート.Name まとめシート.Cells(貼り付け開始行, "A").Resize(最終行, 1).Value = 処理シート.Name '// 行数分シート名を記載 処理シート.Range("A1:S" & 最終行).Copy _ Destination:=まとめシート.Range(まとめシート.Cells(貼り付け開始行, "B"), まとめシート.Cells(貼り付け開始行 + 最終行 - 1, "T")) 貼り付け開始行 = 貼り付け開始行 + 最終行 Next End Sub
# 置換しただけだったので、おかしなコードになっていました。
# 修正
二つを並べて貼り付けましたが、やっぱり日本語で書いてあるほうが
すっと頭に入ってきます。
今後は変数を日本語で書こうと思います。
ありがとうございました^^
(えま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.