- ベストアンサー
エクセルVBAの別sheetの空白行削除について
- エクセルVBAで複数のシートの情報を1つにまとめる方法について質問があります。
- シート1とシート2の情報をシート3にコピーし、シート1とシート2の内容が変更されるたびに自動的にマクロを実行する方法を知りたいです。
- 現在固まってしまうエラーが発生しており、空白行を削除する部分の書き方に問題があるかもしれません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
同じ事を何度も言うのは全く気が引けるのですが,このままではマルで先に進みません。 具体的な確認のポイントは,既に沢山の行数を費やしてご説明済みですが,まるっきりスルーされてしまいました。 「ダメでした」じゃ,いったい何をどう確認してどこがどうダメだったのか,全然情報がありませんので説明のとっかかりもありません。 再掲: 「正しく動く」姿を理解するため,まず次の通りに手を動かしてください。 1.まっさらのブックを一つ用意する 2.「シートあ」と「シートい」「シートう」のシートモジュールにマクロを登録する 3.標準モジュールを追加しマクロを登録する 4.シートあ,い,うに何かサンプルでデータ(数字や文字)を記入する 5.データを記入した行が,空白行を省いて「実行シート」に自動でコピーされる様子を確認する。 特に手順の4および5が確認できていないと推測されます。 あなたの実際のエクセルが,上述で動作確認したサンプルと何がどうちがうのかよく観察し,必要に応じて必要な箇所を(シートの内容を?マクロの記述を?適切に)修正してください。 次に。 あなたが試した「動かないエクセル」で「シートあ」のシートモジュールのマクロを次の通りに変更します Private Sub worksheet_change(ByVal Target As Excel.Range) stop Call macro1 End Sub 「シートあ」に何か文字か数字を記入します 特にこの手順を行っていない可能性が推測されます VBE画面でStop命令が自動で黄色反転したら,F8キーを連打してマクロを「ステップ実行」します 正しくmacro1に自動で実行が移り,さらに一行ずつ進行していくか確認します 以上の手順もちゃんと実行したのかどうなのか,さっぱり不明です。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>マクロを実行しても何も起きません。 >マクロは有効にしてあります。 動かない原因はさまざま考えつくので,今の乏しいご説明だけで「それならこれが原因だからこうしましょう」と特定する事はできません。 ●シート1,シート2の具体的な姿について説明されていないのが原因かもしれません ●「マクロを実行する」方法が間違っているのかもしれません ●そもそもマクロを登録するところから何か判りませんが問題を起こしているのかも?しれません 「正しく動く」姿を理解するため,まず次の通りに手を動かしてください。 1.まっさらのブックを一つ用意する 2.Sheet1とSheet2のシートモジュールに先に回答したマクロを登録する 3.標準モジュールを追加し先に回答したマクロを登録する 4.シート1,シート2に何かサンプルでデータ(数字や文字)を記入する 5.データを記入した行が,空白行を省いてシート3に自動でコピーされる様子を確認する。 あなたの実際のエクセルが,上述で動作確認したサンプルと何がどうちがうのかよく観察し,必要に応じて必要な箇所を(シートの内容を?マクロの記述を?適切に)修正してください。 次に。 あなたが試した「動かないエクセル」でシート1のシートモジュールのマクロを次の通りに変更します Private Sub worksheet_change(ByVal Target As Excel.Range) stop Call macro1 End Sub シート1に何か文字か数字を記入します VBE画面でStop命令が自動で黄色反転したら,F8キーを連打してマクロを「ステップ実行」します 正しくmacro1に自動で実行が移り,さらに一行ずつ進行していくか確認します #こういう動作確認を「デバッグ」と言います。 漫然とマクロを実行して「うごいたーとまったー」と一喜一憂するのではなく,いま動かしているマクロが一行ずつ正しく進行しているか,意図しない結果に終わったときはどこで道を間違えているのか,ご自分の手を動かして確認を必ず実行してください。 正しくmacro1が実行され終了し,なおかつ「意図した結果」が起こらないときは,シート1,2の具体的な姿や「実際の使い方」がご質問で正しく情報提供できていないのが原因です。 シート1や2で「具体的に何をしたとき」「どの行はコピーされる必要があり」「どの行はコピーされて欲しくない」のか,その具体的な理由と判断基準を「具体的なエクセルの姿によって」説明してください。その情報を使い,正しいマクロをイチから作り直す必要があります。
- keithin
- ベストアンサー率66% (5278/7941)
間違いのその1: 今のマクロは,changeイベントが走った時点でのactivesheetに対して諸々処理をするマクロになってしまっています。少なくともそうじゃなく,Sheet3に対して削除なりをするように直す必要がありますね。 付随しての間違いのその2: 上述の結果,シート1/2の空行を削除してしまっています。するとそのアクションがまたchangeイベントをトリガします。結果してchangeイベントから「マクロ」マクロの呼び出しが多重で発生し,場合によってはスタックオーバーフローで停止します。 で。こんなカンジですかね。 シート1とシート2のシートモジュールに: private sub worksheet_change(byval Target as excel.range) call macro1 end sub 標準モジュールに: sub macro1() with worksheets("Sheet3") .cells.clearcontents on error resume next worksheets("Sheet1").range("C1:BE50").specialcells(xlcelltypeconstants).entirerow.copy _ destination:=.range("A1") worksheets("Sheet2").range("C1:BE100").specialcells(xlcelltypeconstants).entirerow.copy _ destination:=.range("A" & .usedrange.rows.count + 1) end with end sub
補足
ありがとうございます。 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめ、 sheet1とsheet2の間にある空白行を削除する件ですが、 アドバイスをいただいたコードをそのままコピペしましたが マクロを実行しても何も起きません。 マクロは有効にしてあります。 コピペしたコードの貼付場所はMicrosoft Excel Objectsのsheet1とsheet2に Private Sub worksheet_change(ByVal Target As Excel.Range) Call macro1 End Sub といれ、 標準モジュールのModule1に Sub macro1() With Worksheets("Sheet3") .Cells.ClearContents On Error Resume Next Worksheets("Sheet1").Range("C1:BE50").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A1") Worksheets("Sheet2").Range("C1:BE100").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A" & .UsedRange.Rows.Count + 1) End With End Sub を入れました。原因は何でしょうか・・・
補足
詳しくアドバイスして頂き、ありがとうございます。 いろいろ試してみましたが、やはりダメでした。 ↓その作業画面を画像にして、アップロードしました。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/newfile_sample.html