[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.092 Excel Sheets(X).Name シート名へのアプローチいろいろ

Excel Sheets(X).Name シート名へのアプローチいろいろ

メルマガ発行内容

<Excel Sheets(X).Name シート名へのアプローチいろいろ>

どうも、三流プログラマーのKen3です。 今回は、 Excelのシート名で遊んでみたいと思います。 何かの参考となれば、幸いです。

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 --------------- >投稿日 : 2003/06/23(Mon) 18:52 >投稿者 : sn >タイトル : EXCelへ出力 > > >ACCESS VBAはまったくのシロオトデス。 >クエリーでのレコードをレコード毎にEXCELにレコード名を取って >レコードの数だけ連続で出力するなんてことできる?、教えていた >だけるとうれしいのですが・・・・・!! --------------- そんな質問の前準備で、 今回は、事前調査でExcelのシート名について探ってみたいと思います。

/* * 2.いつものマクロ記録でプロパティを探る */

さてと、バカの一つ覚えのマクロ記録で、プロパティを探ってみたいと思います。 プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う http://www.ken3.org/vba/excel-help.html も、ヒマなとき、見に来てください。 マクロ記録でシートの追加、名前の変更を探ってみました。 記録結果は、
Sub Macro1()
    Sheets.Add
    Sheets("Sheet4").Select
    Sheets("Sheet4").Name = "名前の変更"
End Sub
でした。 .Nameプロパティを使用すれば出来そうですね。
Sub test1()
    MsgBox ActiveSheet.Name
End Sub
なんてやると、現在選択されているシートの名前を表示可能です。
Sub test2()
    MsgBox ThisWorkbook.Sheets(2).Name
End Sub
だと、左から2番目のシート名が表示されたと思います。 さらにバカっぽくヤルと、
Sub test3()
    MsgBox ThisWorkbook.Sheets(2).Name
    MsgBox ThisWorkbook.Sheets(3).Name
    MsgBox ThisWorkbook.Sheets(4).Name
    MsgBox ThisWorkbook.Sheets(5).Name
End Sub
'---- ThisWorkbook.Sheets(n番目) で左から2〜5のシートを参照し、 .Nameプロパティの値を使用してシート名を取得しています。 5番目のシートが無いのでインデックスが有効範囲に無いと MsgBox ThisWorkbook.Sheets(5).Name の場所でこけるけど。番号で参照可能ですね。 まぁ、.Countってプロパティがあって、 要素・コレクションの個数がわかるんで、
Sub test4()
    MsgBox "現在のシート数は、" & ThisWorkbook.Sheets.Count & "です"
End Sub
とやると、シートの個数が表示されると思います。 ループでまわして、
Sub test5()
    Dim n As Integer  'カウンター変数
    Dim strMSG As String 'メッセージ作成用のワーク
    
    '一番目のシートから個数分処理を行う
    For n = 1 To ThisWorkbook.Sheets.Count
        strMSG = n & "番目のシート名は" & ThisWorkbook.Sheets(n).Name
        MsgBox strMSG
    Next n
    
End Sub
なんて感じで処理もできます。 サンプルはシート名をMsgboxで表示だけですが、 取得データを変数に入れて使ったり可能だと思います。 >なんでFor Each...Nextを使わないのですか? と、 何人の読者が心の中でつぶやいたかは、わかりませんが、 なんで使用しないのと言われてもなぁ、、 答えは、私の趣味・好みです。 おいおい、そりゃぁないでしょう。 だって、やせてる女性よりチョットふっくらしている女性が好みなんで、、、 じゃなくって、 そろそろ、真面目にいきます、 今回のシート名を取り出すのに、 For Each...Nextを使用すると、 ^^^^^^^^^^^^^^^
Sub test35()

    Dim MyObject As Object 'オブジェクト型にしたけどシート型でも
    Dim strMSG   As String 'メッセージ作成用のワーク

    '一番目のシートから個数分処理を行う
    For Each MyObject In ThisWorkbook.Sheets 'ブックからシートを取り出す
        strMSG = "今見ているシート名は" & MyObject.Name
        MsgBox strMSG
    Next

End Sub
となります。 こんな感じで処理すると、カウンターで回しているより、スマートです。 *まぁ、好みもありますが。。。 For Each MyObject In ThisWorkbook.Sheets など、書式は、書いていくうちになれるので、 複数のオブジェクトをまわす時は、 ぜひ使ってみてください。 少しふっくらがイイのになぁ、、 (まだ言ってるよ、だれかコイツを黙らせて、、、) オブジェクトのループはFor Each In でループさせる http://www.ken3.org/backno/backno_vba15.html#73 も、ヒマな時、のぞきに来てね。

/* * 3.シートの存在をチェックしてみる */

今回、シートの存在チェックはいらないんだけど、 ついでなので、やってみる。 関数の仕様は、いつものようにラフに、 ~~~~~~~~~~~~~~ シート名を受け取り、 判断結果をTrue,Falseで返す関数にします。(したいです) 関数名 :chkSHEET 入力値 :シート名文字列 戻り値 :シートの有無・結果 処理概要:シート名をパラメーターで受け取り、      アクティブなブック内に存在するかを確認し、      結果のTrue,Falseを戻り値で返す 自作のFunction関数で値の受け取りと戻り値の型を書きます。 ^^^^^^^^^^^^
Function chkSHEET(strSNAME As String) As Boolean
    ・
  ・
End Function
>Function chkSHEET(strSNAME As String) As Boolean ^^^^^^^^^^^^^^^↑関数名です、重複しないわかりやすい名前にしましょう。 >Function chkSHEET(strSNAME As String) As Boolean ^^^^^^^^^^^^^^^^^^ ここでは、変数名strSNAME、変数の型は文字列で受け取ることにします。 最後の、 >Function chkSHEET(strSNAME As String) As Boolean ^^^^^^^^^^^^ As Booleanですが、聞きなれない、見なれない人も居るかもしれませんが、 ブール型 (Boolean) 真 (True) または偽 (False)を格納可能な変数の型です。 なんだか、堅苦しい話だなぁ、もっとサクッといかないかなぁ? まぁまぁ、数作っているうちにわかるから。 *値の受け取り方や、型、関数の書式などは、  いろいろなプログラムを見てるうちにわかると思います。 シート名を表示するテストはできたから、 今度は、シート名の表示じゃなくって、 受け取ったシート名が存在するかのチェックをif文を使用して行います。
Function chkSHEET(strSNAME As String) As Boolean

     Dim MyObject As Object

     'ブック内のシート名の比較を行う
     For Each MyObject In ThisWorkbook.Sheets
         '.Nameプロパティのシート名と受け取ったstrSNAMEを比べる
         If MyObject.Name = strSNAME Then
            chkSHEET = True '名前が一致したのでTrueをセット
            Exit Function   'もうすること無いので関数を抜ける
         End If
     Next

     '一つも一致しなかったので、Falseをセット
     chkSHEET = False

End Function
Sub testmain()
    Dim strNAME As String     'INPUT BOX 値受け取り用
        'InputBoxでシート名を入力する
    strNAME = InputBox("シート名を入力してください")
    
        '作ったユーザ関数をテストしよう
    If chkSHEET(strNAME) = True Then
        MsgBox strNAME & "シートはブック内に存在します"
    Else
        MsgBox strNAME & "シートはブック内に存在しません"
    End If

End Sub
とやってみました。 三流君さぁ、なんか、しっくりこないんだよねぇ えっ、どこが?テストで動いてるジャン、 '---- 01: 'ブック内のシート名の比較を行う 02: For Each MyObject In ThisWorkbook.Sheets 03: '.Nameプロパティのシート名と受け取ったstrSNAMEを比べる 04: If MyObject.Name = strSNAME Then 05: chkSHEET = True '名前が一致したのでTrueをセット 06: Exit Function 'もうすること無いので関数を抜ける 07: End If 08: Next 09: 10: '一つも一致しなかったので、Falseをセット 11: chkSHEET = False '---- では、言うけど、ここの処理なんだげとさぁ、 05: chkSHEET = True '名前が一致したのでTrueをセット 06: Exit Function 'もうすること無いので関数を抜ける と 10: '一つも一致しなかったので、Falseをセット 11: chkSHEET = False で、結果をセットして関数抜けてるんだけど、 もうすること無いのでいきなりExit Functionでその下実行しないで抜けてるけど、 流れがなんかなぁ、、、 流れを少しスッキリさせる ~~~~~~~~~~~~~~~~~~~~~~~~ では、少し頭を使って、、、
Function chkSHEET(strSNAME As String) As Boolean

     Dim MyObject As Object
     Dim MyRET    As Boolean    'リターン値を保存
 
     'ブック内のシート名の比較を行う
     For Each MyObject In ThisWorkbook.Sheets
         '.Nameプロパティのシート名と受け取ったstrSNAMEを比べる
         If MyObject.Name = strSNAME Then
            MyRET = True '名前が一致したのでTrueをセット
            Exit For 'もう探す必要無いのでループを抜ける
         Else
             MyRET = False  '見つからないのFalseをセット
         End If
     Next
     
     'リターン値をセットして、関数を抜ける
     chkSHEET = MyRET
     
End Function
これは、どうでしょうか? Dim MyRET As Boolean を定義して、下記の判断で戻り値をセット、 If MyObject.Name = strSNAME Then MyRET = True '名前が一致したのでTrueをセット Exit For 'もう探す必要無いのでループを抜ける Else MyRET = False '見つからないのFalseをセット End If 見つかった時はExit For でループを抜けます。 三流君、なんかなぁ、、サクッといかないみたいね。 まぁ、書き方はいろいろ、女性の好みと一緒とかいつもいってるけど、 少しでもキレイでわかりやすいのにしたほうがいいよねぇ。 ギク、、パターンを読者に読まれているかも。。。 先にFalseで初期化しておくのも一つの手かなぁ? ~~~~~~~~~~~~~~~~~~~~~~
Function chkSHEET(strSNAME As String) As Boolean

     Dim MyObject As Object
     Dim MyRET    As Boolean    'リターン値を保存

     MyRET = False  '先に見つからないFalseを初期化代入

     'ブック内のシート名の比較を行う
     For Each MyObject In ThisWorkbook.Sheets
         '.Nameプロパティのシート名と受け取ったstrSNAMEを比べる
         If MyObject.Name = strSNAME Then
            MyRET = True '名前が一致したのでTrueをセット
            Exit For 'もう探す必要無いのでループを抜ける
         End If
     Next

     'リターン値をセットして、関数を抜ける
     chkSHEET = MyRET

End Function
エラー値で初期化じゃないけど、初期値で見つからないをセットしておく。 見つかれば、リターン値MyRET = Trueとして、 最後にリターン値を返す。 ※こんなフラグとループの作り方もありかなぁ。 枠外解説余談 - ActiveWorkbook と ThisWorkbookの違い ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ActiveWorkbook プロパティは、 現在のアクティブ ブックを返します。 ThisWorkbook プロパティは、 実行されている Visual Basic コードが記述されているブックを返します。 なんだ、同じジャンと私も思いましたが、 今回のサンプルや1つのブックしか使用しない場合は一緒ですが、 2つのブックを切り替えながら行うと違います。

/* * 4.On Error Goto でチェック */

目的を達成するには、いろいろな方法があって、 まぁ、彼女へのアプローチ方法も人それぞれ、得意な形と不得意系とあるんだけど。 私があまり使わない方法なんだけど、 On Error Goto ^^^^^^^^^^^^^ を使用して、エラーを発生させて処理する方法を書きます。 アプローチの内容は、シンプルで、 Sheets(シート名).Cells(1, 1) を参照し、参照エラーが発生したらシート無し、 無事参照できたらシート有りと判断。 へぇ〜、そんな手もあったんですね。 合コンで、目の前の女性の集団を左から名前を見ていかないで、 いきなり、 チエちゃん今日は楽しく飲もうね?と声をかけるんですね。 で、グループ内に居ればいいけど、居なかったらブーブーとエラーだよね。 ※チョット表現にキレがないけど、ゆるしてね。  順番に調べないで、いきなり参照に行くって話しです。 下記のサンプルを見てください。
Function chkSHEET(strSNAME As String) As Boolean

    Dim work As Variant

'エラーが発生したら、ラベルERR_NOSheetsへ飛ぶ
On Error GoTo ERR_NOSheets

    'シートの値を取り出す。ここでエラーならシート無しと判断するため
    work = Sheets(strSNAME).Cells(1, 1) 'ダミーで左上を参照
     
    'エラーが発生しなかったら、リターン値をセットして、関数を抜ける
    chkSHEET = True
    Exit Function

'エラーの時、ここに飛んでくる
ERR_NOSheets:
    chkSHEET = False   'シートの値が取れない=シートが無い

End Function
ポイントは ~~~~~~~~~~ 'エラーが発生したら、ラベルERR_NOSheetsへ飛ぶ On Error GoTo ERR_NOSheets とエラーが発生したら、ERR_NOSheets:へ飛ぶ設定をします。 で、在るか無いかわからないのに、 work = Sheets(strSNAME).Cells(1, 1) 'ダミーで左上を参照 と参照(声がけ)をします。 無事に目的の子(Sheet)にアクセスできたらそのまま処理が流れて、 'エラーが発生しなかったら、リターン値をセットして、関数を抜ける chkSHEET = True Exit Function となり、 エラー発生時は、(目的の子が居なかった時) 'エラーの時、ここに飛んでくる ERR_NOSheets: chkSHEET = False 'シートの値が取れない=シートが無い って、感じのエラーを使用して(利用した)処理方法も存在します。 事前に合コンのメンバーチェックなんて面倒だ、 参加して居なかったら(エラーだったら)、 何もしないで帰ろうって感じの処理、 慣れてくると、事前にイロイロと根回しチェックするよりも、 簡単だったりする。 ※心理的には、エラーが発生しないように、  用意周到に合コンセッティング時みたいに、  いろいろとチェックするんだけど。。。 予断ですが、エラー処理で Resume 'エラーが発生した行から処理を再開します(フラレても再度告白) Resume Next 'エラーが発生した次の行から処理を再開します(エラーの次の子に行く) なんてのもあります。 機会を作って解説したいと思うけど。

/* * 5.終わりの挨拶 */

ヤバ、くだらないこと書いてたら、ボリュームが増え過ぎた。 Sheetオブジェクト.Name = "名前の変更" とかで、シート名の変更可能なので(もしかして、2行でよかったの説明?) 次回に、 クエリーからデータ別にシート名をAccessから操作して出力、 そんなんで、遊んでみたいと思います。 同じ処理でも、いろいろと工夫できて、 プログラムは面白い・・そんな風に感じてくれれば・・・ ※彼女を落とした時みたいに、プログラムも創意工夫ですよキット。  (↑それは、成功者が言う言葉だよ、連敗中の私が言う台詞じゃないね(爆)) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]