『ワークシートをオブジェクト名で指定する』(匿名)
Sub test()
Dim wb As Workbook
Dim ws As Worksheet
Dim strFile As String
strFile = "d:\a.xlsx"
Set wb = Workbooks.Open(strFile)
wb.Worksheets(Sheet1).Range("A1").Value = "test" 'A
wb.Sheet1.Range("A1").Value = "test" 'B
Sheet1.Range("A1").Value = "test" 'C
End Sub
コメント「A」の行
wb.Worksheets(Sheet1).Range("A1").Value = "test"
を実行すると「型が一致しません」
というエラーが出ます。
という事は、Worksheetsオブジェクトの引数としては、
インデックス番号か、シート名しか指定できないのかと思います。
コメント「B」の行
wb.Sheet1.Range("A1").Value = "test"
を実行すると「プロパティまたはメソッドをサポートしていません」
というエラーが出ます。
これは、Workbook型で宣言した変数では、
Sheet1というプロパティまたはメソッドがないという事だと思います。
コメント「C」の行
Sheet1.Range("A1").Value = "test"
を実行すると、「a.xlsx」ファイルのSheet1オブジェクトではなく、
ThisWorkbookのSheet1オブジェクトのRange("A1")に"test"と入ってしまいます。
実際のファイル(a.xlsx)は、NAS上にあり、複数人が共有で使用するため、
ワークシート名を変えられたり、ワークシートの順番を変えられてしまいます。
どちらをされても良いように、オブジェクト名で指定したいと思ったのですが、うまくいきません。
検索してもうまくヒットできませんでした。
どなたかご存じの方、教えてください。
よろしくお願いします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
動かしてないけど
wb.Worksheets(Sheet1).Range("A1").Value = "test"
↑ ここ なんで変数で指定しているの?
wb.Sheet1.Range("A1").Value = "test"
↑ 多分VBAもメソッドチェーンなんですけど
sheet1 はkeyじゃないので自分でworkbooksクラスに追加しておかないと呼び出せないと思います。
" "Sheet1.Range("A1").Value = "test"
↑ wb指定してないので暗黙としてapplicationのkeyとして判定された気がする。
条件忘れたけど applicationのメソッドチェーンは遅延評価なので
実行時に調べられてsheet1モジュールがあればそれを対象に取ったはず
A : 事前にSheet1 = "Sheet1" を入れておけば動くと思います。
B : やり方わすれましたが、既存のworkbooksのクラスに追加して
そっちをインスタンスとして作ればとおると思います。
オブジェクト名が何かわかってないのだと思いますが、 要するにファイル名がオブジェクト名です。(ちょっと違うけど)
NASというかフォルダ構成によりますが、windowsのショートカット経由で指定すれば windowsのファイル追跡が使えるのでそれで追わせるのがいいと思います。
(NAS)元ファイル→(NAS)元ファイルのショートカット→(ローカル)NASのショートカットへのショートカット みたいな (ちくわ) 2026/10/30(金) 19:01:01
あ、ワークシート名は変えられるけどファイル名が変わるわけじゃないのか そうすると とるアクションが違いますね。 ちゃんと読んでからコメントすべきでした。
sheet1.xml は 内部名なのですが、保存するときにリネームされて順番通りに代わるので
モジュールに類似で書かれることのない function aaaaaaaaaaa() みたいにシート名を返すユニーク関数名のコード書いて sheetname = wb.aaaaaaaaaa を呼び出しするとかどうでしょう。 (ちくわ) 2026/10/30(金) 19:11:00
>どちらをされても良いように、オブジェクト名で指定したいと思ったのですが、うまくいきません。 他のブックのシートのオブジェクト名と重ならないもの(つまりuniqueなもの)を 付けることにすればよいのでは?
(xyz) 2026/10/30(金) 19:39:11
>コメント「B」の行
wb.Sheet1.Range("A1").Value = "test"
wb.Worksheets(CStr(wb.VBProject.VBComponents("sheet1").Properties("name").Value)).Range("a1").Value = "x"
ですが、ループしてCodeNameを確認する方が安全でしょう。 (jindon) 2026/10/30(金) 19:56:21
VBAでは、他ブックのワークシートを直接オブジェクト名で指定することはできない仕様です。 (オブジェクト名による指定は、マクロを書いたブック(ThisWorkbook)内のシートのみ)
2026/10/30(金) 19:56:21 jindonさんの「ループしてCodeNameを確認する方が ・・・ 」ならば、 こんな感じでしょうか。
Sub test()
Dim wb As Workbook
Dim ws As Worksheet
Dim strFile As String
Dim sh As Worksheet
strFile = "d:\a.xlsx"
Set wb = Workbooks.Open(strFile)
For Each sh In wb.Worksheets
If sh.CodeName = "Sheet1" Then Exit For
Next sh
If sh Is Nothing Then Exit Sub '保険処理
sh.Range("A1").Value = "test"
End Sub
(通行人) 2026/10/30(金) 23:12:50
私の発言は取り消します。明後日のコメントでした(失礼しました)。 (xyz) 2026/10/31(土) 07:12:30
他のBOOKのワークシートをCodeNameで指定するには、参照設定が必要です
NASに置いてあるファイルの プロジェクト名をわかり易い(判別可能な)名前にしておきます ただし、なにかしらのマクロが必要(ダミーでOK)、かつ、マクロが有効な(xlsm等)で保存しないといけないようです。
マクロブック側からそのNASのBOOKに参照設定しておきます。
マクロブック側のコードはこんな感じ。ブックの指定はブックのファイル名ではなくプロジェクト名です
Sub sample()
Dim ws As Worksheet Set ws = VBAProjectXXX.Sheet1 Debug.Print ws.Name
End Sub
参照設定すると、自動でブックが開いたり、 マクロブックを開いていると閉じられないなどちょっと副作用が多いので、 実務では使ったことありません (´・ω・`) 2026/10/31(土) 09:11:26
ワークシート名を変えられたり、ワークシートの順番を変えられたりへの対策として、の案ですが、
あらかじめNAS上のファイルのSheet1の中に、ブックレベルの名前定義を設置しておけば、 それを辿ってWorksheetオブジェクトを取得する事も出来そうですね。
Set ws = wb.Names("定義名").RefersToRange.Worksheet
まぁ、名前定義を壊されたら同じですけどね〜 ^^;
(白茶) 2026/10/31(土) 11:21:07
> ワークシート名を変えられたり、ワークシートの順番を変えられたりへの対策として、の案ですが、 ブックを保護したらどうですか?パスワードをつけるとよいと思います。 (xyz) 2026/10/31(土) 13:58:07
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.