- 締切済み
EXCEL VBA
まことに幼稚な質問で申し訳ないが、バックに合って困っています。 どなたか教えていただけませんか?PCの先生はソフトのバグ!ではないかと云っています。 QT Sub データを作業場に1A() Sheets("データ").Select Range("A1:AB2000").Select Selection.Copy Sheets("作業場").Select Range("A1").Select ActiveSheet.Paste End Sub UQT Selection.Copyのところで”アプリケーション、オブジェクト等の定義エラーとでます。目を皿のようにしても虫はいないと思いますが? SELECTION.CUTの場合は問題ないのですが! 以上よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hotosys
- ベストアンサー率67% (97/143)
No.1です。 基本的にモジュールはどこに書いてもいいのですが、例えば電話番号を考えてみてください。 東京都にいる場合は、03-1234-5678と1234-5678は同じですが、大阪からの場合は03-1234-5678と1234-5678は別の番号になります。 シートのモジュールも同じで、同じシートだけで処理する場合はシートの指定は不要です。 Sheet1でシートの指定の無いRangeやCellはSheets("Sheet1").Range()やSheets("Sheet1").Cells()と指定したものとみなされます。 標準モジュール部の場合は今アクティブなシートのrangeやcellsを指定したとみなされ、ActiveSheet.Range()やActiveSheet.Cells()と指定したものとみなされます。 なので、 Sub データを作業場に1A() Sheets("データ").Select Range("A1:AB2000").Select Selection.Copy Sheets("作業場").Select Range("A1").Select ActiveSheet.Paste End Sub が標準モジュール部にある場合は、 Sub データを作業場に1A() Sheets("データ").Select Sheets("データ").Range("A1:AB2000").Select Selection.Copy Sheets("作業場").Select Sheets("作業場").Range("A1").Select ActiveSheet.Paste End Sub と言う意味になりますが、"データ"シートにあった場合は Sub データを作業場に1A() Sheets("データ").Select Sheets("データ").Range("A1:AB2000").Select Selection.Copy Sheets("作業場").Select Sheets("データ").Range("A1").Select'<==ここでエラーになる。 ActiveSheet.Paste End Sub とエラーになります。 RangeやCellsの.selectはアクティブなシートに対してのみ有効だからです。 シートのモジュール部にあった場合は Sub データを作業場に1A() Sheets("データ").Select Sheets("データ").Range("A1:AB2000").Select Selection.Copy Sheets("作業場").Select Sheets("作業場").Range("A1").Select ActiveSheet.Paste End Sub としなければなりません。 たとえれば、携帯電話のように必ず市外局番から指定すれば間違いないと思います。 なので質問のプログラムは場所によってエラーになると思うのです。 逆にSelectしなければエラーにならないので、 Sub データを作業場に1A() Sheets("データ").Range("A1:AB2000").Copy Sheets("作業場").Range("A1") End Sub で済みます。 Rangeだけの場合は標準シートではActive(Selectした)シートで、シートのモジュールではそのシートに対してという意味になります。 例えば、標準モジュールにある Sub sample() Sheets("Sheet1").Select Columns("A:A").Select Selection.Sort Key1:=Range("A1") End Sub をSheet2で行う場合は Sub sample() Sheets("Sheet1").Select Sheets("Sheet1").Columns("A:A").Select Selection.Sort Key1:=Sheets("Sheet1").Range("A1") End Sub または Sub sample() Sheets("Sheet1").Columns("A:A").Sort Key1:=Sheets("Sheet1").Range("A1") End Sub にしないとエラーになると思います。 特にKey1もSheets("Sheet1").Range("A1")と指定しないとエラーになるのに注意が必要です。 また、標準モジュールでもシートモジュールでも Range(Cells(??),Cells(??)) などでシート指定する場合は Sheets("Sheet名").Range(Sheets("Sheet名").Cells(??),Sheets("Sheet名").Cells(??)) にしないとエラーになる場合があると思います。 結局、標準モジュールでもシートのモジュールでも今アクティブなシートと、どのシートに対する命令かを明確にすれば問題ないと思います。 ただし、1シートしか使わないのにシート指定するのは間違いではないと思いますが、汎用性が無くなったり、分かりにくくなったりすると思います。
- end-u
- ベストアンサー率79% (496/625)
同じ動作をSelectせずに実行するコードです。 Sub test() Sheets("データ").Range("A1:AB2000").Copy Sheets("作業場").Range("A1") End Sub こちらもエラーが出ますか? その場合、(念の為)VBE(VisualBasicEditor)のメニュー[ツール]-[参照設定]で 参照不可: となっているライブラリはありませんか? また、新規Bookに"データ"と"作業場"のシート、そのコードだけ作成して実行してみてください。 エラーなく実行できたとして、 新規Bookにデータやコードをコピーして新たに作り直す事が可能なら、作成し直したほうが近道かも。
お礼
ありがとうございます。 testでそのままうまく行きました。これでかなりの処理がスムーズにいくのではないかと思われます。 それにしても色々な書き方があるものですね。 今後ともよろしくお願いします。
補足
今見ていましたが、参照可能なライブラリファイル5点にチェックが入っていますが、他に参照不能?は見あたりません(具体的にどのように表記されているのか分かりませんが)。 小生の行っている処理に問題があるのでしょうか? ロータスの場合は比較的に簡単なせいか一度問題なければそのまま永遠にOKとなるのですが、今まで問題なく出来ていたソートマクロも定義云々でエラーとなりました。だんだん時間もなくなり困惑しています。 初歩的な質問で申し訳ないが、なにせ七十のなんとかでエクセルは今回初めてで走りながら処理が出来れば良いとの感覚で本を読みながら良いとこ取りで手探りで行っています。 なにか根本的な理解不足があるのでしょうか? 出来うればご教授お願いします。 以上よろしくお願いします。
- hotosys
- ベストアンサー率67% (97/143)
Selection.Copyの場所でエラーが起こるという事ですが、ここで起こるはずはないので違うかもしれませんが、このプログラムは標準モジュール部に無いとエラーが起こると思いますが、"データ"または"作業場"またはその他のシートのモジュール部にあったりしませんか?
お礼
ありがとうございます。 小生にはそこまで理解できません。次回PC教室で聞いてみたいと思います。 こんごともよろしくお願いします。
補足
初歩的な質問で申し訳ないが、現在行っている事務処理のマクロは必要に応じて新しいBOOKにデータを写し込みそのままマクロを書き入れて行っています。もしくは既存のブックを変名して進化させています。従ってデータのシートのモジュール部(?)で作成していると思うのですが、標準モジュール部は解説書では散見するのですが、実際にその使い方の理由が分からずにいるのが実状です。ロータスは経験あるのですが、なにせ七十のなんとかでエクセルは今回初めてで走りながら処理が出来れば良いとの感覚で本を読みながら良いとこ取りで手探りで行っています。 なにか根本的な理解不足があるのでしょうか? 出来うればご教授お願いします。 先ほども今まで問題なく出来ていたソートマクロも定義云々でエラーとなりました。だんだん時間もなくなり困惑しています。 長々と書きましたが以上よろしくお願いします。
お礼
hotsysさん ありがとうございます。 本屋でこの説明が出ている参考書をみつけたらこの項目で 購買価値あり、他はどうでもう良い気分です。 ほんとに助かりました。 こんごともよろしくお願いします。