Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
シートの指定方法
投稿日時: 17/10/01 07:47:22
投稿者: S.Kos

みなさま、こんにちは。
 
With Worksheets("shName") でワークシートを指定するときの"shName"についてご教示ください。
 
VBAプロジェクトエクスプローラで Sheet5(職員) とあるとき、Worksheets("職員")ならモンダイありません。
これを Worksheets("Sheet5") とすると怒られます!
 
「Sheet5(職員)」の"5"を用いてこのシートを指定する方法はありませんか?

回答
投稿日時: 17/10/01 08:39:42
投稿者: カリーニン

参考です。
 
MsgBox Worksheets(5).Name

回答
投稿日時: 17/10/01 09:36:28
投稿者: simple

>「Sheet5(職員)」の"5"を用いてこのシートを指定する方法はありませんか?
その目的はどんなことでしょうか。
もう少し説明してください。
 
繰り返しをするためにindexで指定したいということなら、
既に指摘があった、配置されている順番を元にした指定方法があるでしょう。
シート名に依らない方法ということなら、オブジェクト名 Sheet5 を使う方法があるでしょう。

回答
投稿日時: 17/10/01 10:44:17
投稿者: WinArrow
投稿者のウェブサイトに移動

「Sheet5」は、オブジェクト名です、
「職員」は、シート名です。
 
 
オブジェクト名は、シートが作成された順番にExcelが設定します。
一方、シート名はユーザーが指定します。シートの並びとも関係ありません
 
VBAの中でオブジェクト名の一部を使ってシートを指定することはできません。
 
シートの「INDEX」は、シートの並びで振られた番号ですから
「5」という数字はシートの並びを意味するものでもありません。
 
因みにオブジェクト名を変更することは、可能です。(手作業をお勧め)
 

回答
投稿日時: 17/10/01 10:48:44
投稿者: WinArrow
投稿者のウェブサイトに移動

やろうとしていることとマッチしているかわかりませんが、
 
↓のようなこともできます。
 
Dim Sht5 As Worksheet
 
    Set Sht5 = Worksheets("職員")
    With Sht5
     
    End With

回答
投稿日時: 17/10/01 12:56:45
投稿者: mattuwan44

Sub test()
    With Sheet5
        .Select
        MsgBox .Name
    End With
End Sub
 
オブジェクト名で指定するのですから直接コードに書きます。
しかし、一般的にシート名で指定しますね。
なんでそうするのかは忘れましたが。。。^^;
 
オブジェクト名で指定するなら、もうちょっと意味のある名前に変えたほうが、
後で読んでわかりやすいかも?
 

投稿日時: 17/10/01 13:04:36
投稿者: S.Kos

みなさま、早速のご教示ありがとうございます。
やろうとしてるコトはですね‥複数シートのクリア機能を一か所に纏めたい・・・
 
Public Sub SheetClear( sh as integer )
  if sh = 5 then
    WithWorkSheets( "職員" )
     ....
    end with
  elseif ・・・
   
  end if
end sub
 
で、ここに"職員"なる文字列を書かずに済む方法は無いか?、と考えたしだいです。

回答
投稿日時: 17/10/01 14:43:01
投稿者: WinArrow
投稿者のウェブサイトに移動

クリア処理を共通化したいということまではわかりましたが、
  
どのシートでも同じ処理ならば、シート名を意識しなくてもよいと思います。
  
シートによって分岐する必要があるのでしたら、
シート名だろうと、オブジェクト名だろうと、セルの値だろうと、
何かしら指定する必要があります。
  

Public Sub シートクリア(byVal Sht As Worksheet)
     Select Case Sht.Name
         Case "職員"
      With sht
            End With
         Case "生徒"
     End Select
 End Sub
  

回答
投稿日時: 17/10/01 15:52:45
投稿者: simple

既に指摘されていますように、シート指定は

(1)WorksheetsコレクションオブジェクトのItemプロパティの引数にシート名を指定する方法
   つまり、Worksheets("職員") のような方法   
(2)WorksheetsコレクションオブジェクトのItemプロパティの引数にIndex指定する方法
  つまり、Worksheets(1)のような方法
(3)直接、オブジェクト名を指定する方法
   つまり、Sheet1 といった方法
しか無いと思います。
 
オブジェクト名の一部("5")を指定して、文字列"Sheet"と連結した文字列("Sheet5")から
WorksheetオブジェクトSheet5を作成する方法はないと思います。
 
普通にシート名を使うことを薦めます。
そのほうが分かりやすいはずです。

回答
投稿日時: 17/10/01 20:20:16
投稿者: ピンク

こんばんは
オブジェクト名の一部("5")を指定して、Worksheets("職員")を処理するのなら
Public Sub SheetClear(sh As Integer)
    Dim WS As Worksheet, shNum As Long
    For Each WS In Worksheets
        shNum = Mid(WS.CodeName, 6, 2)
        If sh = shNum Then
            WS.Range("A1:D10").ClearContents
        End If
    Next
End Sub

回答
投稿日時: 17/10/01 21:55:01
投稿者: simple

追加で。
 
そもそも、複数シートのクリア機能だけが独立してあるわけではなく、
シートに対するなんらかの作業の前段階で一端初期化する、とかそういうことでしょう?
 
であれば、対象とするシートは
Set ws = Worksheets("なんたら")
とかワークシート変数を定義するわけですから、
そのwsを使っていくらでもクリアでも何でもすればよいと思います。
 
その際に、
Set ws = Worksheets("職員")
と書くことに比べて、
オブジェクト名に 5が入っているようなシート、などと指定するほうが優位性がある、
とはとても思えません。
他人(少し時間が経った自分を含む)が見て理解しにくいだろうし、
私は普通の書き方をすることで十分と思います。
 
それ以上短く書く意図が理解できません。
トリッキーなことに労力を使うことは余り生産的ではないと思います。

回答
投稿日時: 17/10/01 23:08:27
投稿者: simple

どうしても数値で指定したいというなら、
   Dim shts As Variant
   shts = Array("", Sheet1, Sheet2, Sheet3)
などとして、
   shts(3).Range(A1:C4").ClearContents
とすればよいでしょう。

投稿日時: 17/10/03 12:46:03
投稿者: S.Kos

みなさま、ご教示ありがとうございました。
 
この件に関しては、simpleさん
>普通にシート名を使うことを薦めます。
>
が全てを物語っているようです。
 
お手を煩わせました。ここで閉じます。