プロが教える店舗&オフィスのセキュリティ対策術

おはようございます。
ExcelのVBAを独学しております。

いまさらな質問だとは思いますが、
そこで、色々調べていたところ
「Select」はあまり使うな!
ということが良く出てきました。

selectを使わず、上手くシート移動などができるのでしょうか?

私が組んでいるものは、色んなシートを切り替えなければならなく、
毎回Selectしています。
Activateを使ったこともありますが、
エラーが多発し、良く分からなかったためSelectを使用しています。

出来れば、シートをアクティブにすることなく
操作ができれば良いのですが・・・

例)「データ」「コピー」のシートがあります。
「データ」シートのAからD列を「コピー」シートにコピー
しようとするものです。


WorkSheets(データ).select
Range("A1").select

Range("A:D").select
selection.copy

Worksheets("コピー").select
Range("A1").select
ActiveSheet.Paste

どうしてもSelectを多様してしまいます。


●Selectを使わないデータの入力方法
●Selectを使わず、シートをアクティブにしなくても良い参照方法
●どうしてもSelectを使わないといけない場面
●Selectを使うのを回避するためには・・・

などなど、ご存知でしたら回答お願い致します。

A 回答 (2件)

ご提示のコードは、VBAというよりマクロですね。

やりたいことを直接やるのではなく、人間がコピーするのだったらこうするなという操作を忠実に再現しようとしているように見えます。

●どうしてもSelectを使わないといけない場面
通常はありません。強いて言うなら、処理中シートを切り替えながらいろいろやっている様子をみせ、「なんかいろいろやっているんだな」という印象を与えたい時ですね。もしくは、結果だけが同じになればいいというわけではなく、完全に人間と同じ操作をさせたい場合。そんな場合があるのかわかりませんが。

通常はコピーさえできればいいので、人間と同じ方法を忠実に再現させるなどということはしません。そんなことをすると処理が遅くなりますし。

select
ActiveSheet
copy
Paste
この辺は普通は使用しません。遅いし、素人っぽく思われます。


●Selectを使わないデータの入力方法
●Selectを使わず、シートをアクティブにしなくても良い参照方法
●Selectを使うのを回避するためには・・・
例0の書き方から、例1や例2の書き方に変えればOKです。例0や例2の場合には、それだけだと1つのシート内の操作しかできません。あるシートの内容を別のシートに書き込むという場合には例1のような書き方が必要になります。

複数のシートを扱う場合には「どのシート」という指定を省略してしまうとあいまいになりバグを埋め込む原因にもなりかねません。『「どのシート」の「どの部分」』を両方明示した方がいいです。

ご提示のコードを丸ごと書き換えると、例3のような感じにするといいと思います。Dまで選択する必要があるのか、値以外の書式などをコピーする必要があるのかわかりませんので、「A1の値のみをコピーする」という内容で書いています。

いくつかの値をコピーすると言う場合には、詳しくは書きませんが、RangeではなくCellsを使いFor文などで繰り返し処理をするといいでしょう。わからなければ最初は
s2.Range("A1").Value = s1.Range("A1").Value
s2.Range("B1").Value = s1.Range("B1").Value
などと複数行書いていくのがいいと思います。

例0 -------------
WorkSheets("データ").select
Range("A1").select
-----------------

例1 -------------
Dim s As Worksheet
Set s = Worksheets("データ")
s.Range("A1").select
-----------------

例2 -------------
With ThisWorkbook.Sheets("データ")
Range("A1").select
End With
-----------------


例3 -------------
Dim s1 As Worksheet
Dim s2 As Worksheet
Set s1 = Worksheets(データ)
Set s2 = Worksheets(コピー)

s2.Range("A1").Value = s1.Range("A1").Value
-----------------

この回答への補足

回答ありがとうございます!
シート名まで変数にしてしまうと、
色んなシートがあるので変数迷子になってしまいそうなため
今まで変数に格納することは避けてきました。
他の人が見た際に分かりやすいプログラム
(他の人が見ても編集できるプログラム)を書きたいと
思ったのですが、やはり難しそうです・・・

回答ありがとうございました!

補足日時:2013/11/25 13:23
    • good
    • 1

WorkSheets(データ).select


Range("A1").select

Range("A:D").select
selection.copy


WorkSheets("データ").Range("A:D").copy


Worksheets("コピー").select
Range("A1").select
ActiveSheet.Paste


Worksheets("コピー").Range("A1").PasteSpecial

つまりは

Sub Macro1()
Worksheets("データ").Range("A:D").Copy

Worksheets("コピー").Range("A1").PasteSpecial
End Sub

選択(Select)しなくとも、指定すれば動きます
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
1つにまとめれば大丈夫!という感じでしょうか?
ありがとうございました!

お礼日時:2013/11/25 13:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています