アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルVBAで一番左側にあるシート名を取得する場合、通常は

Sub test01()
  MsgBox Sheets(1).Name
End Sub

で簡単にできますが、このSheets(1)が非表示になっている場合でもその名前が取得されるため、見た目での一番左側にあるシート名ではなくなってしまいます。
もちろん、非表示になっているシートを除外して

Sub test02()
  Dim n As Integer
  For n = 1 To Sheets.Count
    If Sheets(n).Visible Then
      MsgBox Sheets(n).Name
      Exit For
    End If
  Next
End Sub

とすれば取得できるのはわかりますが、こんなまだるっこい方法以外に簡単に一番左の可視シート名を取得する方法はないでしょうか?
(^∇^)?
ご教示くださいませ。

A 回答 (3件)

こんにちは。



今思い付いたばかりで検証もしてませんので、
 使えるかどうか、
 使うかどうか、
の判断はお任せするとして、、、。

MsgBox Application.CommandBars("Workbook tabs").Controls(1).Caption

こんなのもありかも。
 何に使うか、
ちょっと想像できませんが(^^;)

#1end-u さんのコメントは、この際の必要十分だと思います。
コメントとして付け加えることはありません。
>end-u さん、
先日はマクロ内の数式についてフォロー頂いて
ありがとうございました。(ちょっと嬉し恥ずかし)
プロットを書くのも気(手)が抜けない、と感じました。
(っか、抜き処が下手だったと反省)
また何かお気づきのことなど(もし)ございましたら
ツッコミ入れてやってくださいませ。よろこんで拝聴しますので。
(あ、これ、特にレス不要です)(規約了解済)
    • good
    • 0
この回答へのお礼

cj_moverさま、いつもありがとうございます。

> Application.CommandBars("Workbook tabs").Controls(1).Caption

なるほどぉ!
シート名を表示させるコマンドがこのように応用できるのですね。
驚きました。
ありがとうございます。

お礼日時:2010/02/06 13:47

ぅは。

CommandBars("Workbook tabs")っていう手がありましたか。
すみません。
>簡単なメソッドやプロパティは無いです。
ウソついてました。ごめんなさい。
使えるものであれば、簡略なものが良いというのは私も日頃から思ってるので異論ありません。

cj_moverさん、ありがとうございます。また勉強させて頂きました。
qa4007086を始めとして、いつも感服してレス拝読させて頂いてます。
前スレッドもそうですが、独特な着眼点が新鮮で、勉強になる事ばかりです。
これからも宜しくお願いします。
    • good
    • 0
この回答へのお礼

end-uさま、cj_moverさま、今回もありがとうございました。
これからもご指導くださいますようお願い申し上げます。

お礼日時:2010/02/07 22:13

局所的なコードのみの話であれば、Sub test02()は別に『まだるっこい方法』ではなく、


真っ当な方法に思えます。
LoopしてのVisible判定は必要でしょう。
簡単なメソッドやプロパティは無いです。
記述が婉曲...という事であれば、
それなりのFunctionを作っておけば良いという話で終わるのかもしれませんね。

Sub test()
  MsgBox EndShtName(ThisWorkbook)
End Sub

Function EndShtName(ByVal wb As Workbook, _
          Optional rightflg As Boolean = False) As String
  Dim i As Long
  
  With wb.Sheets
    If rightflg Then
      For i = .Count To 1 Step -1
        If .Item(i).Visible = xlSheetVisible Then
          Exit For
        End If
      Next
    Else
      For i = 1 To .Count
        If .Item(i).Visible = xlSheetVisible Then
          Exit For
        End If
      Next
    End If
    EndShtName = .Item(i).Name
  End With
End Function


サンプルとしては
Sub sample()
  Application.ExecuteExcel4Macro ("select.all()")
  MsgBox ActiveWindow.SelectedSheets(1).Name
  ActiveSheet.Select
End Sub
こんな感じのもないことはないですが、
ActiveWorkbook限定ですし、一旦Selectして解除、は手間です。
ExecuteExcel4Macro ("select.all()")は
全Sheetを選択したい時、非表示シートがあると Sheets.Select できない場面で
使い道があるかもしれない手法、としてのみ留めておいたほうが良いでしょうね。


実際に、最左のシート名を取得しなければいけないような処理なのか、
という事も見直す必要があるのでは。
シートインデックスに左右されるような条件は排除しておいたほうが良いと思いますが。
必要であればブックの保護でシート構成が変更できないようにしておくなど。


あと、表示判定に If Sheets(n).Visible Then は使えません。
If Sheets(n).Visible = True Then のほうがまだしも、です。
Visibleプロパティには定数xlVeryHiddenがありますから。
    • good
    • 0
この回答へのお礼

end-uさま、今回もいろいろご指導ありがとうございます。
とても勉強になります。

> Visibleプロパティには定数xlVeryHiddenがありますから。

そのとおりでしたね。うっかりしておりました。
ありがとうございました。

お礼日時:2010/02/06 13:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!