エクセル2000です。
VBAでの疑問点を教えてください。
Sub test1()
Sheet1.Activate
MsgBox ActiveSheet.Name
End Sub
これは問題なく作動します。
Sub test2()
x = ThisWorkbook.Worksheets.Count
For n = 1 To x
Sheet(n).Activate
MsgBox ActiveSheet.Name
Next
End Sub
これは「SubまたはFunctionがていぎされていません」というエラーになります。
もちろん、
Sub test3()
x = ThisWorkbook.Worksheets.Count
For n = 1 To x
Sheets(n).Activate
MsgBox ActiveSheet.Name
Next
End Sub
のように書けばOKなのは存じておりますが、これではSheet名に係らず、左から順番となってしまいます。
Sub test4()
x = ThisWorkbook.Worksheets.Count
For n = 1 To x
Sheets("Sheet" & n).Activate
MsgBox ActiveSheet.Name
Next
End Sub
のように明確にシート名として記述すればOKなのですが、それでは、Test1のSheet1.Activate が通って、Sheet(n).Activate が通らないのはなぜでしょう?
しょうもない質問でごめんさない。
No.1ベストアンサー
- 回答日時:
Sheet1 は Sheet1 という(Worksheet を継承した)オブジェクトなんです。
Sheets(n) や Sheets("Sheet" & n) は
Sheets コレクションのなかの n 番目、"Sheet" & n というシートということです。Sheets(index)プロパティで Worksheet オブジェクトを返します。
Sheet(n) はそもそも Sheet というオブジェクトがないのでエラーになってしまうというわけです。
No.4
- 回答日時:
こんばんは。
>しょうもない質問でごめんさない。
私は、そんなことないと思います。merlionXXさんの質問や回答を、もう、2年近くを見てきているので、なんとなく何に引っかかっている分かるような気がします。実は、私も、こういう部分が分かったのは、VBAをはじめて3年目ぐらいの時だったと思います。
#3 のtaocat さんの内容と重複してしまいますが、私も同じように考えています。(書いた後に、そう思いました)
>シート名を変更しても「オブジェクト名」Sheet1はそのままです。
のとおりなのですが、Sheet(n)というのは、ミスだとしても、Sheet1, Sheet2 というのは、オブジェクト名、またの名をCodeNameといいます。これがオブジェクトの本名なのですね。本名というのは、名指しすれば、それだけでオブジェクトを取得できるようになっています。そして、これらのオブジェクトは、複合的(別の名前、別の集まり=Collection)に出来ているのだと私は思っています。
想像の話で恐縮なのですが、通称名の、"Sheet1", "Sheet2" は、便宜的に、オブジェクト名と同じにしてしまったようなのです。VB6 には、このようなことは、なかったと思います。
それがVBAをややこしくさせているようです。私は、VBA入門当時は、どうして、こんな書き方に違いがあるのだろうか、ずっと引きずっていたわけです。ただ、今の私に言えることは、Sheet1, Sheet2 というオブジェクト名の使い方は、確かに、インテリセンスが出て見やすいのですが、通常、使わなくてよいものだと思います。ただし、実務では、オブジェクト名は、Sheet オブジェクトやVBAProject は、一意の名前を付けるようにしています。それは、ユーザーが名前を変えてしまう可能性があるのと、VBAProject は、呼び出しに混乱をさせるときがあるからです。
ワークシート側とVBA側は、それぞれ違う面を持っているのだと思います。だから、通称名は、おそらくは、何千分の一秒かで、そのオブジェクトを探しているのではないでしょうか?確かに、その分、使用範囲を割り引かれているような気がしますが、オブジェクト名の指定の方法は、変数が用いられないので、ループなどが利かずに、使いづらいのではないでしょうか?
No.3
- 回答日時:
お師匠さん、こんにちは。
>しょうもない質問でごめんさない
いやいやこれは「基本的なことではありますが非常に重要」なことだと思います。
こういった疑問が生じるということは、
「オブジェクト名とシート名」の区別がついてないからですね。
>Sheet(n).Activateが通らないのはなぜでしょう?
これは単に文法ミスです。
Sheetという名前のコレクションがないのに使ってるからです。
(n)とかのINDEXが使えるのはコレクション(同じものの集まり)の場合です。
WorkBooks(n) とか Sheets(n) 等々。。
●ここから本題●
>Test1のSheet1.Activate
(1)Sheet1.Activate
(2)Sheets("Sheet1").Activate
(3)Sheets(1).Activate
(1)のSheet1は、「オブジェクト名」
(2)のSheet1は、「シート名」
(3)は、シートコレクション(シートの集まり)をIndexで表わす
ここで新しいブックを開き
VBE画面でプロジェクトエクスプローラを見てください
Sheet1(Sheet1)
Sheet2(Sheet2)
Sheet3(Sheet3)
と同じ名前になっていますよね。
左が「オブジェクト名」で( )内が「シート名」です。
Sheet1のプロパティ画面を表示して
Nameプロパティ(シート名)の値を "売上" に変更して
再度エクスプロラー画面を見てください、
Sheet1(売上) となってるはずです
シート名を変更しても「オブジェクト名」Sheet1はそのままです。
で、上記(1)の、Sheet1.ActivateのSheet1はこの「オブジェクト名」を使っていることになりOKなのです。
もちろん、売上.Activate(シート名.Activate)はダメですよ。
このように新しいブックでは「オブジェクト名」と「シート名」が同じなのでそこらあたりをちゃんと理解しておかないとこんがらがってしまいます。
もちろん、オブジェクト名も変更はできますが、Sheetに関しては変更しないのが普通だと思います。
CommandButtonとかは、PrintBtnとかCmdBtn1とか変更したりはしますが。。。
以上です。
No.2
- 回答日時:
Sub test2()
x = ThisWorkbook.Worksheets.Count
For n = 1 To x
Sheet(n).Activate
MsgBox ActiveSheet.Name
Next
End Sub
は何をしたいのでしょうか。
どういう順番にシート名を出したいのでしょうか。
やっていることはうまくいっても、シートタブの言えている順番にシート名しか出ない内容でしょう。しかしSheet(n)という表現が許されていないからエラーになる。Index値で()で表せるのは、コレクションオブジェクトですが、コレクションオブジェクトは末尾にsがつきます。
自分の思う順序にシートをアクチブにしたいなら
シート名がSheet2、Sheet1,Sheet3のようであるとき
Sub test3()
Dim s As Variant
s = Array("Sheet2", "Sheet3", "Sheet1")
x = ThisWorkbook.Worksheets.Count
For n = 0 To x - 1
Worksheets(s(n)).Activate
MsgBox ActiveSheet.Name
Next
End Sub
これ自身は意味のないプログラムですが。シートを名前で指定してます。
お探しの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) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) VBA リスト表示していますが 3 2023/05/18 12:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
textBox isNot Nothing とは
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
AccessVBAで「dim dbs as datab...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
VB6 エクセルに画像貼り付け
-
EXCEL VBA COLLECTIONオブジェ...
-
VBScriptからDLL参照設定したい
-
python __del__()に関して
-
InternetExplorer.Application...
-
上下の位置揃えについて
-
UserForm1.Showでエラーになり...
-
エクセルのVBAの標準モジュール...
-
ActiveXコントロールを用いたマ...
-
AccessVBA NULLについて
-
VBで引数にDictionaryオブジェ...
-
Excel VBAでWordの複数ファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルのVBAの標準モジュール...
-
VBAで既に開いている別アプリケ...
-
VBAで Set wb = Sheets(1).Cop...
-
テキストボックス中の文字列の...
-
PowerPointVBAでスライドマスタ...
-
エクセルマクロエラー「'Cells'...
-
VBAからPDFファイルにパスワー...
-
Excelでフィルタをかけると警告...
-
オブジェクトが見つかりません
-
ある文字列が全て数字であるか...
-
EXCEL VBA オートシェイプナン...
-
[VBA]CDOメッセージ送信エラー
-
VBAで作成するメール(開封確認...
-
VBAについてです。 初心者です...
-
VBA:オートシェイプの線の長...
-
VBで引数にDictionaryオブジェ...
-
AccessVBAで「dim dbs as datab...
おすすめ情報