[[20120428220856]] 『複数のシートをまとめ、A列に各シート名を表示しax(えま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のシートをまとめ、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


Mookさん、ありがとうございます。
できました!

For 〜 Next の対は整合するようにしてくださいね。
 インデント(字下げ)を付けると、不整合がわかりやすいです。

確かに私のはForが二つあるのに、Nestは一つですね。
次からはインデントを付け、見落とさないよう気をつけます。

変数は意味が分かる名前にした方が良いです。

「dst」は何かの略ですか?例えばDestinationとか。

(えま)


 >「dst」は何かの略ですか?例えばDestinationとか。 
 あっ、例示のコードは少し分かりにくかったですね。

 推測は大当たりです。

 プログラムでは代入式の
   元になるデータ(右辺)を Source、
   代入する先(左辺)を Destination
 というので、私は変数の頭に src, dst のようにつけて区別しています。
 自分で意味の分かる変数にすればよいと思いますし、VBA では日本語の変数名も付けら
 れるので変なローマ字表記よりは日本語の方が後々見やすいかもしれません。

 脱線ですが、
 最近の質問で興味本位で書いた例ですが、後ろの方に日本語変数で書いたことがありました。
[[20120308171951]] 
 (Mook)

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.