こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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の場合は問題ないのですが!
以上よろしくお願いします。
 

投稿日時 - 2009-06-03 20:04:18

QNo.5014331

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

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シートしか使わないのにシート指定するのは間違いではないと思いますが、汎用性が無くなったり、分かりにくくなったりすると思います。

投稿日時 - 2009-06-05 10:43:54

お礼

hotsysさん
ありがとうございます。
本屋でこの説明が出ている参考書をみつけたらこの項目で
購買価値あり、他はどうでもう良い気分です。
ほんとに助かりました。
こんごともよろしくお願いします。

投稿日時 - 2009-06-05 19:57:07

ANo.2

同じ動作をSelectせずに実行するコードです。

Sub test()
  Sheets("データ").Range("A1:AB2000").Copy Sheets("作業場").Range("A1")
End Sub

こちらもエラーが出ますか?

その場合、(念の為)VBE(VisualBasicEditor)のメニュー[ツール]-[参照設定]で
参照不可: となっているライブラリはありませんか?

また、新規Bookに"データ"と"作業場"のシート、そのコードだけ作成して実行してみてください。
エラーなく実行できたとして、
新規Bookにデータやコードをコピーして新たに作り直す事が可能なら、作成し直したほうが近道かも。

投稿日時 - 2009-06-03 22:41:34

補足

今見ていましたが、参照可能なライブラリファイル5点にチェックが入っていますが、他に参照不能?は見あたりません(具体的にどのように表記されているのか分かりませんが)。
小生の行っている処理に問題があるのでしょうか?
ロータスの場合は比較的に簡単なせいか一度問題なければそのまま永遠にOKとなるのですが、今まで問題なく出来ていたソートマクロも定義云々でエラーとなりました。だんだん時間もなくなり困惑しています。

初歩的な質問で申し訳ないが、なにせ七十のなんとかでエクセルは今回初めてで走りながら処理が出来れば良いとの感覚で本を読みながら良いとこ取りで手探りで行っています。
なにか根本的な理解不足があるのでしょうか?
出来うればご教授お願いします。
以上よろしくお願いします。

投稿日時 - 2009-06-05 05:02:41

お礼

ありがとうございます。
testでそのままうまく行きました。これでかなりの処理がスムーズにいくのではないかと思われます。
それにしても色々な書き方があるものですね。
今後ともよろしくお願いします。

投稿日時 - 2009-06-04 23:00:23

ANo.1

Selection.Copyの場所でエラーが起こるという事ですが、ここで起こるはずはないので違うかもしれませんが、このプログラムは標準モジュール部に無いとエラーが起こると思いますが、"データ"または"作業場"またはその他のシートのモジュール部にあったりしませんか?

投稿日時 - 2009-06-03 21:36:48

補足

初歩的な質問で申し訳ないが、現在行っている事務処理のマクロは必要に応じて新しいBOOKにデータを写し込みそのままマクロを書き入れて行っています。もしくは既存のブックを変名して進化させています。従ってデータのシートのモジュール部(?)で作成していると思うのですが、標準モジュール部は解説書では散見するのですが、実際にその使い方の理由が分からずにいるのが実状です。ロータスは経験あるのですが、なにせ七十のなんとかでエクセルは今回初めてで走りながら処理が出来れば良いとの感覚で本を読みながら良いとこ取りで手探りで行っています。
なにか根本的な理解不足があるのでしょうか?
出来うればご教授お願いします。
先ほども今まで問題なく出来ていたソートマクロも定義云々でエラーとなりました。だんだん時間もなくなり困惑しています。
長々と書きましたが以上よろしくお願いします。

投稿日時 - 2009-06-05 04:51:00

お礼

ありがとうございます。
小生にはそこまで理解できません。次回PC教室で聞いてみたいと思います。
こんごともよろしくお願いします。

投稿日時 - 2009-06-04 23:06:40

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-