[[20150831115402]] 『各シートのデータを1つのシートにまとめたいが、ax(masa) ページの最後に飛ぶ

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

 

『各シートのデータを1つのシートにまとめたいが、まとめるシートの範囲指定を可能にしたい』(masa)

Sub シートのデータを一本化()

Dim ws As Worksheet, i As Long, n As Long, x As Long, tbl
n = Sheets.Count
Set ws = Sheets.Add(after:=Sheets(n))
ws.Name = "まとめシート"
For i = 1 To n

    tbl = Sheets(i).Range("A1").CurrentRegion.Resize(, 19).Value
    If x = 0 Then
        ws.Range("A1").Resize(UBound(tbl, 1), 19).Value = tbl
    Else
        ws.Range("A65536").End(xlUp).Offset(1).Resize(UBound(tbl, 1), 19).Value = tbl
    End If
    x = x + UBound(tbl, 1)
    If x > 50000 Then
        x = 0
        Set ws = Sheets.Add(after:=Sheets(Sheets.Count))
        ws.Name = "入力シート" & Sheets.Count - Sheets("まとめシート").Index
    End If
Next
End Sub

◆これでブック内のシートをすべて結合できますよね。(みなさんに教えてもらったコードそのままですが)複数のシート、A・B・C・D・その他数シートあるとします。
A・B・C・Dだけを結合したい場合などの範囲指定方法を知りたいです。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 以下は参考になりますか?

 Sub Sample()
    Dim shN As Variant

    For Each shN In Array("Sheet2", "Sheet4", "Sheet6")
        MsgBox Sheets(shN).Name
        MsgBox Sheets(shN).Range("A1").Value
    Next

 End Sub

 Sub Sample2()
    Dim sh As Variant

    For Each sh In Array(Sheets("Sheet2"), Sheets("Sheet4"), Sheets("Sheet6"))
        MsgBox sh.Name
        MsgBox sh.Range("A1").Value
    Next

 End Sub

(β) 2015/08/31(月) 12:50


βさんへ

なんか違いました。
ABCDとは、シート名のことです。
勘違いさせちゃいましたよね・・・

単純に、指定された複数のシートのデータを一つのシートにつなげたいのです。。。
(masa) 2015/08/31(月) 13:29


 わかってますよ〜

 アップしたのはヒントというか参考コードです。
 そのものずばりの回答コードではないですよ。

 ですから「参考になりますか?」とコメントしています。

 アップしたコードの "Sheet2" 等は 「シート名」です。
 そのシート名が 実際には、"A" だったり "B" だったりするんですよね。
 そういったシート名を必要なだけ書けばいいのですが?

(β) 2015/08/31(月) 13:56


 現在の Sheets(i) を踏まえたコードをいかすとすれば以下の書き方も。

 Sub Sample3()
    Dim ws As Worksheet, i As Long, n As Long, x As Long, tbl
    n = Sheets.Count
    Set ws = Sheets.Add(after:=Sheets(n))
    ws.Name = "まとめシート"
    For i = 1 To n
        Select Case Sheets(i).Name
            Case "A", "B", "C", "D" 'いくつでも必要なだけ

                'ここに現在の統合処理コードを

        End Select
    Next

 End Sub

(β) 2015/08/31(月) 14:03


 全く別のポイントで。

 このブックは、Excel97-2003ブック(xls いわゆる互換ブック)ですか。
 もし、そうであれば以下はスルーしてください。

 そうではなく、2007以降の xlsm ブックだとします。
 2003まではシートの行数が 65536 でした。なので、50000 をめやすに新しい統合シートに書きこむという
 制御を行っていますね。
 (それでも、書きこんだ後のチェックになっていますので、理屈としては、65536をオーバーする危険性はありますよ)

 2007以降は、シートの行数が 1048576 !!  それでも、統合シートをわける必要がありますか?
 もし、そういうブックだとすると、統合以前に、きわめて重い、膨大なサイズのブックだということになりますので
 エクセルで、そのようなブックを保持していること、そのものが、ちょっと問題あるかもですよ。

 まぁ、いずれにしても Range("A65536") という記述は、これを機会にやめましょう。
 Range("A" & Rows.Count)  たとえ xls互換ブックであったとしても、この記述にしましょう。

(β) 2015/08/31(月) 19:52


こんにちは。

ユーザーインターフェイスの問題じゃないのですか?
シートの一覧をユーザーさんに提示して(どうやって?)
「どのシートを結合の対象としたいですか?」と。

で、ユーザーさんの指定をどうにかして読み込んで
それらのシートを処理の対象となるようにうまいこと
コーディングすればよいかと。

コードが楽なのは、シートの数だけメッセージボックスを出して
「○○シートを結合しますか? はい・いいえ」です。
いまのコードにちょこっと付け足すだけで済みます。
ですが使い勝手はよくないですね。
これはほかに方法のないとき(コードのかけないとき)の最後の手段
としてとっておきましょうか。

ほかにどうすればいいかと考えるに、結局、一般機能でのシートの指定の仕方と
それをVBAで読み取る方法とのせめぎあいになろうかと思います。
どういう合図の出し方をしてもらえば、自分には読み取りようのコードが書ける
だろうかというコトです。

( 佳 ) 2015/08/31(月) 22:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.