dポイントプレゼントキャンペーン実施中!

例えばワークシートの表現を考えます。

自分は今まで以下のようにしてました。
Dim sheet1 As String
sheet1=Worksheets(1).Name
Worksheets(sheet1).Activate

オブジェクト型宣言を用いて以下のように書き換えられます。
Dim sheet1 As object
set sheet1=Worksheets(1)
sheet1.Activate

ソースコードとしてはスッキリしますが、見た目以外でどのようなメリットがあるのですか?

A 回答 (3件)

そうですねぇ。

。まぁ、そういう書き方でヤリタイ事がしっかり出来てる分には、どっちでも構わないとは思いますが。
どーしてこういうご質問が起きたのかなとちょっと考えて、シート名は一義的に定まるのだから、オブジェクトとしてのシートとシート名から呼び出すシートは1対1だというつもりのご相談でしょうか。


ごく単純な例を一つ挙げてみると

sub macro1()
 dim s as string
 s = activesheet(1).name
 worksheets(s).activate
 worksheets(s).name = "xxx"
 worksheets(s).range("A1") = "xxx"
end sub
なんて書いてたら、勿論ダメですね。

たとえば「シート名を変更した」場合、「シートの名前」という本来の目的の他に、もう一手間かけ変数のsも同期を取って変更しておかないと整合がとれなくなってしまいます。二度手間です。


sub macro2()
 dim w as worksheet
 set w = worksheets(1)
 w.activate
 w.name = "xxx"
 w.range("A1") = "xxx"
end sub

変数wでシートが(直接)参照されているので、「シート名を変更する」のも「シートの配下のA1セルを操作する」のも、いずれもwという現物を基点に配下の属性を操作するだけの共通した操作として整理できます。


あとはまぁ、同じシート名のシートを持った複数のブックが開かれている状況で、ブックを渡り歩いて何か仕事をしてる場合なんかも怖いですね。




ただ現実には(と言っても所詮シロートのレベルでは、という限定で)

sub macro3()
 dim r as long
 for r = 1 to 10
  cells(r, "A") = "xxx"
 next r
end sub
のようにインデックスで操作する場合もあれば

sub macro4()
 dim h as range
 for each h in range("A1:A10")
  h = "xxx"
 next
end sub
のようにオブジェクトで操作する場合もあります。片手間マクロでしたら、具体的な仕事の中身に応じて便利に使い分けるのでいいんじゃないですかね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
御推察の通り仕事の片手間に使っており、取り立ててobjectが必須というものではありません。
「これ使うと何か良い事あるのかな?」と思い質問しました。

他回答でも可読性を良くする変数等も紹介頂き、思いの外収穫がありました。

お礼日時:2014/02/04 19:15

Dim sheet1 As Object


→Dim mySheet1 As Worksheet

としましょう。
Object型ではなく、本来の型を用いるのが基本です。
Excel以外のオブジェクトを使用する時も、最初は参照設定して本来の型を使用すべきです。
こうする事で、mySheet1までキーインしたところで、インテリセンスが効いてシートオブジェクトのメンバが表示されますので、コード作成が楽になります。Rangeオブジェクトを使用すると、ビックリするほど多岐にわたるメンバの存在を知り、視野が広がるでしょう。
また、sheet1という変数名も、VBAが使いそうな気もするので、避ける方が無難でしょう。(君子危うきに近寄らずというやつです)
VBAを始めた頃、myほにゃららという変数名を使用しているのに違和感を覚えましたが、確実に予約語を避け、かつ分かり易い変数名という趣旨だと思い至り、今では真似しています。

なお、Set mySheet1=Worksheet(1)とした後で、Activateする必要はほとんど無いと思います。(ActiveCellに画像をペーストする時くらいしか必要性を感じません)せっかくのObject変数なので、そのメンバーに対する処理としてどんどん使ってみて下さい。

VBの記事ですが、インテリセンスのご参考に...
http://homepage1.nifty.com/rucio/main/nyumon/nyu …
    • good
    • 0
この回答へのお礼

ありがとうございます。
my~というのは見たことありませんが、予約語を避けるのですね。確かにそうかとおもいます。

お礼日時:2014/02/04 19:11

変数名sheet1は、Dimを見ないと目的がわからないのでソースの可読性がよろしくない。


私だったら、前半を strSheetNameに、後半をobjSheetかwssheetとする。
    • good
    • 0
この回答へのお礼

ありがとうございます。
変数名の付け方ですね。

お礼日時:2014/02/02 20:11

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