- 締切済み
エクセルシートへの参照(コピー)方法
1.allのシートがあります。 2.1と同じbookに複数のシート(シート名:a~c)があります。 ※a~cのシートにはフォーマットが同じ(列は一緒・行はシートによって異なる)表が記載されています。 3.a~cのシートの内容を「all」シートにマージされた状態で表示したいです。 a ↓ b ↓ c といったレイアウトです。 a~cのシートが保存、もしくはallシートで更新ボタン押下のアクションでallが最新の情報になればと思います。 VBAなどを利用して検索してみましたが、a~cの行数が異なるので きれいにallのシートにコピーできません。 考え方などご教授いただければと思います。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
>allのシートなどとややこしい書き方をせず、累積シートなどと説明したほうが良い。 >マージされた状態で プログラムでマージアルゴリズムなども有るが、プログラムの熟達者でなければ、コピーして貼り付けを3シート分行い、キー列でソートすると考えると、おのずとVBAでのやり方も見えてくる。 ーー 使うべき要素技術(コーディング上の)は (1)全てのシートを順次対象にするコード ただし「all」シートは除外する。 Sub twat01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "all" Then MsgBox sh.Name End If Next End Sub を実行して納得のこと。 ーーー (2)あるシートを捕まえることが出来るが その最終行を捉まえるのは、良くやるところの Sub twat01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "all" Then MsgBox sh.Name MsgBox sh.Range("A65536").End(xlUp).Row End If Next End Sub でやってみて納得のこと。各シートのA列には適当な行数のデータを入れてテスト。 ーー (3)コピー元の範囲は Sub twat01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "all" Then sh.Select MsgBox sh.Name MsgBox sh.Range("A65536").End(xlUp).Row d = sh.Range("A65536").End(xlUp).Row Range(Cells(1, "A"), Cells(d, "G")).Select MsgBox "A" End If Next End Sub を実行すれば判る。 ーー (4)コピー先へのコピーだが その貼り付ける時どきの、最終行を捉える。それは先ほども出たやり方で d2 = Worksheets("all").Range("A65536").End(xlUp).Row ーー Sub twat01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "all" Then sh.Select MsgBox sh.Name MsgBox sh.Range("A65536").End(xlUp).Row d = sh.Range("A65536").End(xlUp).Row sh.Range(sh.Cells(1, "A"), sh.Cells(d, "G")).Select MsgBox "A" d2 = Worksheets("all").Range("A65536").End(xlUp).Row MsgBox d2 sh.Range(sh.Cells(1, "A"), sh.Cells(d, "G")).Copy Worksheets("all").Activate Worksheets("all").Range("A" & (d2 + 1)).Select ActiveSheet.Paste End If Next End Sub 納得したらMsgbox行は削除してください。 後はソートする。 キー列でのソートをするが、手作業で済ますとか、コードはマクロの記録でわかるから略。 しかしSh。でシートを限定できるとか、範囲RangeのCellsの前のShとか、コピー貼り付けなどは、私の場合長い経験によっている。 今まで何度同じような回答をしたことか。 ーーー 他のやり方ももちろんあるが、ロジックが素直で易しいと思う。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
AからD列までデータがあり、A列のデータはすべて埋まっているとして マクロの記録 と+ちょっと Sub Macro1() 'allシートのデータを消す Sheets("all").Select Columns("A:D").Select Selection.ClearContents 'aシートのデータをコピペ1行目含む Sheets("a").Select Range("A1").Select Selection.CurrentRegion.Select Selection.Copy Sheets("all").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False 'bシートのデータをコピペ Sheets("b").Select Range("A65536").Select Selection.End(xlUp).Select '↓マクロの自動記録外 Range(Selection, Range("D2")).Select Selection.Copy Sheets("all").Select Range("A65536").Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False 'cシートのデータをコピペ Sheets("c").Select Range("A65536").Select Selection.End(xlUp).Select '↓マクロの自動記録外 Range(Selection, Range("D2")).Select Selection.Copy Sheets("all").Select Range("A24").Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub もちろん レベルに応じてもっとすっきりできると思います
- ookami1969
- ベストアンサー率14% (137/953)
僕も結構 同じような事をやってて「何か便利な方法はないかなぁ?」 などと思いながらも力技で何とかやってます。 で、その力技の方法ですが 『「allシート」に反映させたレコードにフラグを立てる』というだけです。 で、フィルタで そのフラグの列で空白のセルを抽出するマクロをボタンに登録しといて その増えた分allシートの行を挿入して そこに貼り付け。 何か他にいい方法ないですかね? ホント面倒でしょうがないですよ。。。 多分 accessが使えれば一発で解決するんでしょうが。。