質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

758閲覧

【VBA】Fnctionを使ったシート名の判定・条件分岐

kkkei

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2022/07/14 14:06

編集2022/07/15 00:20

前提

以下のような機能を持つマクロをVBAで組んでいます。

  • 2回目以降のマクロ実行時、処理を中断してメッセージボックスに”すでにその名前のシート名がある”旨を表示する、なければアクティブシートをコピーして左端に配置されるようにする

実現したいこと

  • SubプロシージャからFunctionプロシージャを呼び出して、条件分岐できるようにする

発生している問題・エラーメッセージ

  • Functionプロシージャの引数やSubプロシージャでの呼び出しかたが正しいかわからない
  • 処理が中断されず、メッセージボックスも表示されない
  • マクロを2回目以降実行すると同一シート名()でコピーができてしまう

該当のソースコード

VBA

1Sub Macro1() 2 3 Dim flg As Boolean 4 Dim SheetName As String 5 6 flg = SheetsCheck(SheetName) 7 8 If flg = True Then 9 End 10 MsgBox "中断します" 11 Else 12 ActiveSheet.Copy Before:=Sheets(1) 13 Sheets(1).Name = Format(Date, "yyyymmdd") 14 End If 15End Sub 16 17Function SheetsCheck(ByVal SheetName As String) As Boolean 18 19 Dim ws As Worksheet 20 21 For Each ws In Sheets 22 If ws.Name = SheetName Then 23 SheetsCheck = True 24 Else 25 SheetsCheck = False 26 End If 27 Next 28End Function

試したこと

  • Subだけでできるか試してみましたが、読みずらくなるのと処理の結果は変わりませんでした
  • Subプロシージャ内での呼び出し方が違うのかと思いましたが、調べた方法を試しても変わりません
  • フローチャート的なものを書いて整理しましたが、それを実現してみてもうまくいきません

以上、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2022/07/14 14:36

「ブック内のシートを繰り返しで全件検索する」「同じ名前のシートがあれば処理を中断して」とのことですが、そもそも、一つのブック内に同じ名前のシートは存在できないのですが、何をしたいのでしょうか。
kkkei

2022/07/14 15:48

質問内容が不明確ですみません。 マクロを2回目以降実行した際に、既に使われているシート名という旨のメッセージをメッセージボックスで表示させて処理を中断させたいということです。 同一シート名()でシートを作成させないようにしたいのです。 質問を修正しておきます。 ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

エスパーしてみると、下記のようなことかな。

シート内に今日の日付(yyyymmdd)と一致するシート名があれば、メッセージを出して中断する。
なければ、アクティブシートを先頭にコピーして今日の日付(yyyymmdd)を名前にする。

vba

1Sub Macro1() 2 3 Dim flg As Boolean 4 Dim SheetName As String 5 SheetName = Format(Date, "yyyymmdd") 6 flg = SheetsCheck(SheetName) 7 8 If flg = True Then 9 MsgBox "中断します" 10 Else 11 ActiveSheet.Copy Before:=Sheets(1) 12 Sheets(1).Name = SheetName 13 End If 14End Sub 15 16Function SheetsCheck(ByVal SheetName As String) As Boolean 17 SheetsCheck = False 18 Dim ws As Worksheet 19 For Each ws In Sheets 20 If ws.Name = SheetName Then 21 SheetsCheck = True 22 Exit For 23 End If 24 Next 25End Function

投稿2022/07/14 14:48

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkkei

2022/07/14 15:41 編集

ご回答ありがとうございます。 質問の仕方が悪くてすみません。 その通りです。 マクロを実行するときにすでにそのシート名があった場合、メッセージを出して処理を終了させたいということです。 現状だとすでに同名のシートがあるというエラーが出て同一シート名()となってしまいます。
hatena19

2022/07/14 15:52

回答のコードを試してみましたか。 こちらのサンプルでは問題なく動作してますが。
kkkei

2022/07/15 00:13

ご回答いただいたコードでやりたかった通りに動作しました。 分かりにくい質問だったにもかかわらず、ありがとうございました。 ご回答のコードを解釈して勉強させていただきます。
退会済みユーザー

退会済みユーザー

2022/07/16 06:18

横入りと解決済みのところ失礼します。 ご質問のコードを解析しましたところ、下記の点で動作しない問題が発生しています。 1.3行目の「flg = SheetsCheck(SheetName)」の変数「SheetName」の値が””であること。  この場合、マクロを実行するたびに変数「SheetName=""」で初期化されており、Functionに  入るたびに空のシート名とそれ以外のブック内のシート名を比較するので、常に「True」に  なってしまいます。  これにつきましては、hatena19様のマクロ例のように初期値設定を行うことで回避可能です。 2.「If flg = True Then」のEndとMsgBox文の処理順が逆になっていること。  End処理により、プログラム自体がすでに終了していますので、MsgBox出力できない状態  になっています。 3.Function内のif文で、一旦Trueが出ているにも関わらず2枚目以降のシート名を比較していること  このことで、flgの値がFalseで上書きされているため、同じシートを作成しようとしてエラーに  なります。  これについてもhatena19様のコードでは、Trueの時点でExit Forにて比較ループを抜けるようになって  回避しています。  ちなみに、Functionの変数名と、Function内で使用する変数名は合わせない方が、かえって今回のような 混乱を引き起こしにくいです(これは私の過去の失敗例に基づくものですが…。)。 例えば、 checkName = Format(Date, "yyyymmdd") flg = SheetsCheck(checkName) のように変えても動きます(Function内の変数定義は変更しない) 以上、長文並びにおせっかいで大変失礼でしたが、今後の参考にしていただければ幸いです。
kkkei

2022/07/22 00:17

tmkey01様 遅くなってしまってすみません。 コードの解析をありがとうございます。 自力でのコードの解釈が難しく感じていたので、ご指摘ありがたいです。 今後も参考にさせていただきます。
guest

0

If flg = True Then直下のENDは消しましょう。(おそらくコードを抜粋する際に消し忘れたものと思いますが。)
SheetsCheck関数でのシート検索は一番右端のシートが指定したシート名かどうかになっているのでws.Name = SheetNameが成立するときはexit forでループから抜けるようにしましょう。
()書きの連番シートが量産されているのはコピーしたシートを日付にリネームしようとしている=同じ日に複数回実行すると同名のシートが存在するためエラーになりコピーした時点のシート名のままになっているからでしょう。日付ではなく日時、とりあえず秒までをシート名に含めれば多分大丈夫でしょう。
最後の問題については既に同名のシートがあるなどと言った内容のエラーが表示された気がしますが表示されませんか?

投稿2022/07/14 14:35

usekay

総合スコア395

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkkei

2022/07/14 15:39

ご回答ありがとうございます。 私の質問の仕方が悪いのですが、同じ日に複数回マクロを実行した際に2回目以降はメッセージボックスで"すでに同名のシートがあります"といった旨を表示して処理を中断させたいのです。 ご指摘いただいたループから抜ける、Endについては修正します。 ありがとうございます。
usekay

2022/07/14 22:28

私の指摘内容を反映後 flg = SheetsCheck(SheetName) の前に SheetName=Format(Date, "yyyymmdd") を入れておしまい。
kkkei

2022/07/15 00:14

ご回答、ありがとうございます。 おかげさまで解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問