まとめるとはどういう意味かはっきりさせてください。
同一フォーマットの毎月のデータを集計するということなら、いわゆる串刺し計算(集計)があります。
集計ではなく、一表化(どういう形か存じませんが)ということなら、そんな手はありませんし、
都合のいいマクロが既製品で転がっているとは思えません。
--
メイルアドレスが不正です
ニュースグループの購読にはOutlook Express などのニュースリーダーを
使用してください。
下記のサイトをご覧下さい
http://www.microsoft.com/japan/support/newsgroup/faq/q3.asp
http://www.microsoft.com/japan/support/newsgroup/grouplist.asp
y sakuda
sakudaya...@hotmail.com
VBA,VBSによるツールなどがあります
http://www16.plala.or.jp/ysakuda/ystop.htm
7月31日 ExcelVBA用プログレスバー組込みキットを追加しました
その程度だと、投稿できるような比較的単純なマクロでも何とかなるかなという気もします。
私の理解が正しいとしての話ですが、以下の点を明らかにしてみませんか?
1.ブックの中のシートすべてをまとめるのか?もし一部ということであれば、集計するシートは
シート名などから識別する手段があるか?(シート名に何らかの特徴があるかという意味です)
2.各集計対象シートの見出し行の有無。見出しが何行でどこからデータが始まっているかと言う意味。
3.データは空行なしでつまっているか否か?
4.何シートくらい集計して、レコードの総量はどの程度か?
(Excelでは65536行がシートの行数の限度ですので、これを上回ると問題が複雑化します)
5.各シート毎にデータを補う必要はあるか? 例えば、各シートが月別とか、事業所別に作成されて
おり、一本化する際それらのデータを補足する必要があるかどうかということです。
6.後先になりましたが、1行/1レコードと言う理解でよろしいか?
単純な場合は20行程度のマクロでできるかもしれませんので、ダメモトで情報を
出されてはいかがですか(^^)
マクロと違ってごちゃごちゃしてしまいますが、全ての列の
データ数が共通と仮定して、以下の方法でも可能です。
A列を使って行数を求めていますが、空セルがある場合は
別の方法を考える必要があります。
# 以下、1行目は見出しとしています。
「データ数」シートを追加し、以下の式を入力
A1:境界
A2:=IF(ROW()<=2,0,A1+$C1)
A3:A2をコピー
B1:シート名
B2:Sheet1
B3:Sheet2
C1:データ数
C2:=COUNTA(INDIRECT($B2&"!A:A"))-1
C3:C2をコピー
データをまとめるシートへ、以下の式を入力
A1:=OFFSET(INDIRECT(データ数!$B$2&"!A1"),0,COLUMN(A1)-1)
A2:=IF(OFFSET(INDIRECT(VLOOKUP(ROW()-2,データ数!$A$1:$B$100,2,TRUE)&"!A1"),(ROW()-2)-VLOOKUP(ROW()-2,データ数!$A$1:$B$100,1,TRUE)+1,COLUMN(A1)-1)="","",OFFSET(INDIRECT(VLOOKUP(ROW()-2,データ数!$A$1:$B$100,2,TRUE)&"!A1"),(ROW()-2)-VLOOKUP(ROW()-2,データ数!$A$1:$B$100,1,TRUE)+1,COLUMN(A1)-1))
B1:A1をコピー
B2:A2をコピー
空のセルが無ければ、A2 の IF 文は必要ないです。
杉田さんマクロも強いはずなんで、なぜシート式のフォローをされたのか分かりませんが
ほぼ同一条件でのマクロを提示しておきます。
条件は以下のとおりです
1.ブック内のすべてのシートを統合対象とする(空のシートなどは存在しない)
2.第1行目は必ず見出しになっている
3.空白行はあっても可です
4.すべてのデータを集めても65536行に収まる
5.A列からデータになっている
マクロの使い方
1.ALT+F11 でVBE(マクロエディタを呼び出す)
2.挿入⇒標準モジュール
3.2で表示される標準モジュールに↓のマクロを丸ごとコピー&ペースト
Sub SheetMerge()
Dim wSht As Worksheet, wMergeSht As Worksheet
Dim wLast, wOffset
wOffset = 0
Set wMergeSht = Worksheets.Add
wMergeSht.Name = "統合シート"
For Each wSht In Worksheets
If wSht.Name <> wMergeSht.Name Then
If wOffset = 0 Then
wSht.Rows(1).Copy
wMergeSht.Range("a1").PasteSpecial
wOffset = 2
End If
wLast = wSht.Range("a65536").End(xlUp).Row
wSht.Rows("2:" & wLast).Copy
wMergeSht.Rows(wOffset).PasteSpecial
wOffset = wOffset + wLast - 1
End If
Next
End Sub
4.VBEを終了させる
5.Excel画面にもどって ALT+F8
6.表示されたダイアローグでSheetMergeを選択して 実行
7.統合シートというシートが作成され一本化されたデータが残ります。
--
> 杉田さんマクロも強いはずなんで、なぜシート式のフォローを
> されたのか分かりませんが
> ほぼ同一条件でのマクロを提示しておきます。
単純に、シート式で問題を解くのが好きなもので・・・(^^;
なので、どうにかなりそうなものは、多少複雑になっても
シート式でフォローを入れるようにしています。
どちらかと言うとマクロ寄りの方なんですが,確かにこちらの方が
適切なエクセルの使い方かもしれませんね。(個人的な思いですが。)
難点と言えば,LISPのような括弧のお化けになりやすく,普通の人
には理解し難い式になり,誤って式をいじくった時,元に戻せない
恐れがある。
マクロの場合,スパケッティみたいなものでもなんとか動くようにする
ことはできるけど,こちらの場合,そんな行き当たりばったりでは
通用しない。ある意味,よりプログラミング的センスが要求される
ようにも思います。まあ,私にはちょっと難しいってところですが,
たしかに,こちらの方がクールだ!・・・と思います。
--
******************************
keizi kounoike
******************************
ただ、括弧のお化けと言うのは確かに似ているのですが、あちらは再帰定義ですので
頭の中のねじり方が少し違うかなと思います。
ニュースグループをご覧になっている方で実際にLISPを使ったことがある方が
どのくらいいるか分かりませんが、極めて少数であろうと想像してます(^^)
#個人的には、神業的なシート式を解読してみるのは好きな方ですが、
#自分のニーズの場合、ほとんどの場合、必要以上に複雑になりそうな気配がでると
#マクロで書いてしまうか、シート式の中で使用するFunctionをマクロにして簡略化
#します。(あまりややこしいものを作ると後で自分でも修正するとき大変!)