[三流君] −−>
[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でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・