• ベストアンサー

Shをウォッチウインドウに登録して値を確認した時

vbaの事でよくわからないので教えてください。 エクセルなのですが Private Sub Workbook_NewSheet(ByVal Sh As Object) Debug.Print Sh.Name End Sub で、 End Subの所にブレークポイントを設置して Shをウォッチウインドウに登録して値を確認した時、値に何も入ってないのですがなぜですか? Debug.Print Sh.Name した時にシート名は取得されるのだから値は入ってるべきだと思うのですが 画像のように「変数なし」となります。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

Private Sub Workbook_NewSheet(ByVal Sh As Object) Debug.Print Sh.Parent.Name End Sub ↑を、試してみてください。 どうやら、親オブジェクトとの関連付けが未定義のままイベントが発効しているようですね。 一度でもSh.Parentを参照すれば、以降、ブックが開いている間は ウォッチウィンドウ、ローカルウィンドウ、共に、正しく表示されます。 値に何も入っていない訳ではなくて、Propertiesが確定していないから表示できない、 といったところでしょうか。 何故、そういう仕様にしているのか?ということはわかりません。 ウォッチウィンドウの場合はShの代わりにActiveSheetを指定すれば、不足はないですから、 MSも仕様を直す気にならないのかも知れませんね。 むしろ、ローカルウィンドウに表示されないことの方が、問題あり、と私は思いますけれど。

HJHDYTEHYNTFO
質問者

お礼

ありがとうございます。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#2、撤回します。 そんなに単純な話ではなかったです。 失礼しました。

HJHDYTEHYNTFO
質問者

お礼

ありがとうございます。

回答No.3

VBA自体の質問とは違うような気がします。 ずいぶん、ややこしい設定をして、それで、うまく行っていないのは、なぜかと言われても、実務上の問題とは違うわけですね。 ウォッチウィンドウを見る限りは、Shって、Objectだから、それ自体は取れているわけです。確かに、Shは、変数ではあるけれども、ウォッチ式は、その中の「値」をみるためではないでしょうか?Shでしたら、.Name や .Index などの見れるプロパティを「ウォッチ式の編集」でつけます。この「変数」は、変化する値だと思います。 こういう場合、私は、ローカルウィンドウだけを使って内容を確認します。そのほうが早いからです。

HJHDYTEHYNTFO
質問者

お礼

ありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> Shをウォッチウインドウに登録して shには.(ドット)があるから、Sh.nameまで指定して初めて変数となるのでは?

HJHDYTEHYNTFO
質問者

お礼

ありがとうございます。

関連するQ&A

  • なぜ、ByVal Sh As Objectは

    NewSheetイベントについて質問なのですが、 なぜ、ByVal Sh As Objectは、Objectなのでしょうか? Sub Workbook_NewSheet(ByVal Sh As Worksheets) や Sub Workbook_NewSheet(ByVal Sh As Worksheet) にしたら、コンパイルエラーになります。 シートの方では、 Private Sub Worksheet_Change(ByVal Target As Range) のようにrange型で宣言しているのに、なぜシートはオブジェクト型で宣言するのでしょうか?

  • コンパイルエラー Target.Range

    シート上のセルに値を入力したら、 入力した値をイミディエイトに表示させたいのですが Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Debug.Print Target.Range End Sub こうすると、 コンパイルエラー 引数は省略できません。 になります。 .Range の部分がエラーになります。 原因と対策を教えてください。

  • マクロでシート名を変更を変更したい

    A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • SheetBeforeDoubleClick

    ダブルクリックすると、選択セルが切り取り状態になるようにしたいのですが。 Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Selection.Cut End Sub 上記ではダメでした。 正しい表記法を教えて下さい。 よろしくお願いします。

  • VBAで二つの構文を繋げるには

    いつもお世話になります。 WIN7 EXCELL2010 です。 1) A1に 数値化した日付を入力するとシート名表示に反映される。  例えば 2014/07/31 で A1 には 20140731 と入力するとシート名にも      20140731 が表示 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub 2) 1)で表示された複数のシートから今日のシート名になっているシートの色付けです。 Private Sub Workbook_Open() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Tab.ColorIndex = 19 If mySheet.Name = Format(Now(), "yyyymmdd") Then mySheet.Tab.ColorIndex = 3 End If Next End Sub 3) 各月をまとめたシートで シート名は 1~12 あります。 このシート名にも色付けするため下記マクロを追加したいのですが、1)のマクロとどう繋げばいいか分かりません。 Private Sub Workbook_Open() Dim sh As Worksheet     For Each sh In Worksheets         If isnumeric(sh.Name) Then             sh.Tab.ColorIndex = xlNone             If sh.Name = Month(Now) Then                 sh.Tab.Color = 255 ' 赤             End If         End If     Next End Sub 同じ Private Sub Workbook_Open() で始まるので丸められることが可能ならも含めていい方法を御指導いただけると幸甚です。 宜しくお願いします。

  • ExcelのVBAについてです。

    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) UserForm1.Show End Sub というコードで、シート上で右クリックしたら、ユーザーフォームを表示するようにしたんですが、ユーザーフォームを閉じると右クリックメニューが出てきます。これを出なくするにはどのようにしたらいいのでしょうか。教えてください。よろしくお願いします。

  • エクセル シートのコピーとシート名の問い合わせ

    エクセルで日報を作っています。 PC初心者の方がいるので、なるべく簡単なものを作ろうとしています。 まず、各曜日のフォームを6つ作成し、シート1に各曜日のコマンドボタンを置いて、月曜日なら、その曜日のボタンをクリックしてもらうようにしています。 <例 月曜日> Private Sub CommandButton1_Click() Sheets("月").Copy After:=Sheets(Sheets.Count) End Sub で、お聞きしたいのは、シートを挿入する際にダイアログボックスでシート名を問い合わせるものを作りたいのです。 で、調べていたら、下記のようなものが見つかりました。 Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim strSheet strSheet = Application.InputBox("シートの名前を入力してください" & vbCr & vbCr & _ "キャンセルでシートの挿入を取り消します") Select Case strSheet Case False Application.DisplayAlerts = False Sh.Delete Application.DisplayAlerts = True Case Else Sh.Name = strSheet End Select End Sub 別にこれを使わなくてもいいのですが、この2つが合わさったものをつくりたのですが、どうすればいいのでしょうか。 教えてください。

  • Excelのマクロを実行するきっかけとなるイベントについて

    マクロのイベントに「ワークシートの追加」(Private Sub Workbook_NewSheet(ByVal Sh As Object))がありますが、「ワークシートのコピー」をきっかけに、マクロを実行したい場合は、どのようにすればよいでしょうか? シートタブを右クリックして、コピーを追加のチェックボックスをONにして、同一ブック内にシートをコピーする操作の直後に、マクロを実行したいと考えています。 お知恵をお貸しください。

  • 今日の日付に該当するシート名に赤色を

    いつもお世話になります。 WIN7 EXCELL2010 です。 A1に「20140721」と記入しエンターキーを押すと下記のマクロでシート名が自動で「20140721」となるようにしています。 例えば今日(7月21日)になったら自動で赤色にしていくつかあるシートの中で今日のシートを目指させたいのでご指導いただけませんでしょうか。 参考に Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub 是非ご協力をお願いします。

専門家に質問してみよう