
No.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
のようにオブジェクトで操作する場合もあります。片手間マクロでしたら、具体的な仕事の中身に応じて便利に使い分けるのでいいんじゃないですかね。
ありがとうございます。
御推察の通り仕事の片手間に使っており、取り立ててobjectが必須というものではありません。
「これ使うと何か良い事あるのかな?」と思い質問しました。
他回答でも可読性を良くする変数等も紹介頂き、思いの外収穫がありました。
No.2
- 回答日時:
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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) VBA リスト表示していますが 3 2023/05/18 12:12
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
Excelマクロのエラーを解決した...
-
【ExcelVBA】全シートのセルの...
-
実行時エラー1004「Select メソ...
-
ユーザーフォームに入力したデ...
-
特定の文字を含むシートだけマ...
-
XL:BeforeDoubleClickが動かない
-
実行時エラー'1004': WorkSheet...
-
Access エクセルシート名変更
-
【VBA】特定の文字で改行(次の...
-
ブック名、シート名を他のモジ...
-
VBA 存在しないシートを選...
-
VBAで指定シート以外の選択
-
【エクセルVBA】「Protect User...
-
Excel チェックボックスにチェ...
-
VBA ThisWorkbookはSheet*で記...
-
Excel VBA リンク先をシート...
-
エクセルVBA ListBoxの並び...
-
シートが保護されている状態で...
-
userFormに貼り付けたLabelを変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報