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

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

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

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

Q&A

解決済

3回答

957閲覧

VBA for文と if文 の使い方について

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2021/10/30 01:22

編集2021/10/30 01:23

下記内容ですが、
[MsgBox "該当する手配番号はありません"]
この部分を、For文が回り切った時点で条件分岐して表示することは可能でしょうか?
現状ですと、複数あるシートを選択するたびMsgBoxの内容が表示されてしまいます。
Nextの下に・・・
Else
MsgBox "該当する手配番号はありません"
End If
この内容を記述してみたりもしましたが、そうするとNextに対するFor文がありませんとエラー表示がでました。
この記述内容では私が求めている、for文が回り切った時点でMsgBoxを表記することは可能か不可能か教えていただけないでしょうか。また、可能である場合、どのように記述する方法があるかご教授お願いいたします。

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

VBA

1Set wb = Workbooks.Open(Filename:="C:\Users\****\OneDrive\デスクトップ\試し\" & folder_number & "\" & book_number & ".xls") 'ブックオープン 2counter = wb.Worksheets.Count 3 4 For i = 1 To counter 5 sheetname = wb.Sheets(i).Name 6 If sheetname = ThisWorkbook.Sheets(1).Range("A2").Value Then 7 wb.Sheets(sheetname).Select 8 Else 9 MsgBox "該当する手配番号はありません" 10 End If 11 Next 12 13 14Else 'パーツ案件の検索 15book_number = Left(book_number, 2) 16Set wb = Workbooks.Open(Filename:="C:\Users\****\OneDrive\デスクトップ\試し\" & book_number & "\" & "部品.xls") 'ブックオープン 17counter = wb.Worksheets.Count 18 For i = 1 To counter 19 sheetname = wb.Sheets(i).Name 20 If sheetname = ThisWorkbook.Sheets(1).Range("A2").Value Then 21 wb.Sheets(sheetname).Select 22 End If 23 Next 24End If 25 26End Sub 27

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

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

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

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

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

guest

回答3

0

ベストアンサー

ループでは見つかった数を数えておいて、ループが終了した後、その数で判定してはいかがですか。

VBA

1 Dim numFound as Long 2 numFound = 0 3 For i = 1 To counter 4 sheetname = wb.Sheets(i).Name 5 If sheetname = ThisWorkbook.Sheets(1).Range("A2").Value Then 6 numFound = numFound + 1 7 wb.Sheets(sheetname).Select 8 End If 9 Next 10 11 if numFound = 0 Then 12 MsgBox "該当する手配番号はありません" 13 End If

この場合Longに加算するんじゃなくBooleanを更新するんでもいいですけどね。

投稿2021/10/30 01:33

itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/10/30 05:50

itagagaki様 ご返信ありがとうございます。 頂いたコードで私が欲しい結果を得ることが出来ました。 ありがとうございます Boolean型も調べて実際に使用してみようと思いましたが、うまくできませんでした。 お時間ありましたら、どのように記述すればいいか教えてただけませんでしょうか。 お手数おかけしますがご確認お願いいたします。
退会済みユーザー

退会済みユーザー

2021/10/30 06:11 編集

itagaki様 下記記述内容でBoolen型を実行しましたが、一致するシートであってもElseの内容を実行してしまいます。 どの部分が間違っているでしょうか。 お時間ありましたらご教授お願いいたします。 Dim bool As Boolean Dim s As Long For i = 1 To counter sheetname = wb.Sheets(i).Name If sheetname = ThisWorkbook.Sheets(1).Range("A2").Value Then s = bool + s wb.Sheets(sheetname).Select End If Next If s = 0 Then MsgBox "該当する手配番号はありません" ActiveWorkbook.Close SaveChanges:=False End If
itagagaki

2021/10/31 00:42

プログラミングやVBAの基本の理解を飛ばして進んでいるように思いますので、まずはイロハのイから一歩ずつ学んだ方がよいと思います。
guest

0

たとえばこんな感じでどうでしょうか。

VBA

1 Dim tehai As String 2 tehai = ThisWorkbook.Sheets(1).Range("A2").Value 3 4 Dim ws As Worksheet 5 For Each ws In wb.Worksheets 6 If ws.Name = tehai Then Exit For 7 Next 8 9 If ws Is Nothing Then 10 MsgBox "該当する手配番号はありません" 11 Exit Sub 12 End If 13 14 ws.Select

投稿2021/10/30 04:53

jinoji

総合スコア4585

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

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

0

可能・不可能で言えば『可能』。
でも質問者さんはそこまで到達していませんね。

まず、プログラミングっていうのは『こう書けばいい』というものではありません。
ロジックを描くのです。
For文とかはそれを表現するための単語のようなものです。

で、Ifと Else, ElseIf は別々で存在しているのではなく、一つの構造です。

たとえば、

If a = 1 Then ‘ 処理1 ElseIf a = 2 Then ‘ 処理2 Else ‘ 処理3 End If

というのがあった場合、まず a = 1 を満たすかどうかが調べられる。で、もし満たすなら処理1をしてEnd Ifの後のステップへ。

でもa = 1 を満たさない場合もありますね。その場合は ElseIf の a = 2 かどうかが調べられます。これも満たさなければ次のElseIfとかに行きます。
でも上記の場合はElseしかありませんから、ここを調べる。Elseは「上記を満たさない場合」です。

日本語でもいいし英語でもいいので自分が認識できる言語で考えるとわかりやすいです。

もしa = 1 なら処理1を行う。
そうじゃなくて a = 2 なら処理2を行う。
上記の条件にいずれも満たさなかった場合は処理3をする。

的な感じです。

なので、ほぼワンセットです。

ただ、場合によってはIfだけで良かったり、ElseIfだけいらない場合もありますよね。なので入門書とかではそういう書き方になっているのです。

つまり、プログラミングとは「現実世界のシミュレーション」です。

なので、まずはVBAでは〜とかを考えずに、現実世界で感がてみてください。

たとえばExcelのシートのような包含用紙かなんかにデータが載っているとして、その中に、指定のデータがあるかどうかを調べると考えてみてください。

田中 山田 中田 山本 佐藤

この中に『山本』があるかどうか調べるとかを考えてみる。

そうすると、普通に考えれば、先頭の『田中』から最後尾の『佐藤』までを一通り見る。で、田中 = 山本 …違いますね。なので次へ。山田 = 山本… 違いますね。
…とやる。

山本 = 山本 。一致していますね。ここにチェックつけるなりして終了ですね。
簡単に言えば記録を残すということ。

こういう風にやるはずです。

つまり、『存在するかどうか』についての記録を残す感じです。そうすれば、それを見れば一目瞭然ですね。

これをやればいいだけです。

今回の場合、まず対象セルをすべて探索する。で、記録に相当するものは「変数」でやります。変数 flagとかを用意しておいて
条件に一致するのがあればこれをTrueに。

そして、whileなりforなりのループ系が終了した直後に、『フラグが立っていれば[存在する]と仮定』するのです。


[追記1]

一応、ざっくりとしたサンプルを書いておきます。

考え方は『現実世界をベースにすること』です。

' 何らかの処理 Dim flag As Boolean = False For i = 1 To counter sheetname = wb.Sheets(i).Name          If sheetname = ThisWorkbook.Sheets(1).Range("A2").Value Then flag = True ' 条件に一致するのがあればフラグを立てる Exit For ' ループから強制的に抜ける End If Next If flag = True Then ' 『存在する』系 Else ' 『該当する手配番号はありません』系 End If ' 何らかの処理

現実世界でも、一番上の例のように、一つずつ見ていき、存在したら『そこで終了』とするはずです。
なので ループから抜ける処理(上のコードでは Exit For) も施しています。

ヒント: Exit

投稿2021/10/30 03:53

編集2021/10/30 06:22
BeatStar

総合スコア4958

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

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

退会済みユーザー

退会済みユーザー

2021/10/30 06:04

BeatStar様 ご返信ありがとうございます。 おっしゃる通りまだまだ勉強し始めでわからないことばかりですので、今回頂いた内容も十分理解できるよう励んでいきたいと考えております。 ありがとうございます。 もしよろしければ、理解を深めたいと思いますので参考にさせていただけるようなコードいただけると幸いです。 お手数おかけしますがご確認おねがいいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問