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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

4回答

1180閲覧

複数のIF文を簡素化したい(VBA)

satsu

総合スコア1

VBA

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

1グッド

1クリップ

投稿2024/02/19 05:06

実現したいこと

下記のようなIFが複数続く場合、配列などを使って簡素化することは可能でしょうか。
右と左の組み合わせでどちらか一方が未入力であればメッセージボックスが出てくるようにしているつもりです。ご教示いただけると幸いです。

発生している問題・分からないこと

もっと簡単なプログラムを作りたいです。

該当のソースコード

VBA

1Sub sample33() 2 3 Dim row_c1 As Long 4 Dim row_c2 As Long 5 Dim wb As Workbook 6 Dim wb_out As Workbook 7 Dim ws As Worksheet 8 Dim ws_out As Worksheet 9 10 Set wb = Workbooks("Xブック.xlsx") 11 Set wb_out = Workbooks("Yブック.xlsm") 12 Set ws = wb.Worksheets("Xシート") 'データ元 13 Set ws_out = wb_out.Worksheets("Yシート") '出力先 14 15 row_c1 = 3 16 row_c2 = 10 17 18 Do While CStr(ws.Cells(row_c1, "A").Value) <> "END" 19 20 'XシートのD(右)とE(左)のいずれかが未入力 21 If CStr(ws.Cells(row_c1, "D").Value) = "" Or CStr(ws.Cells(row_c1, "E").Value) = "" Then 22 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 23 row_c2 = row_c2 + 1 24 End If 25 26 'XシートのF(右)とG(左)のいずれかが未入力 27 If CStr(ws.Cells(row_c1, "F").Value) = "" Or CStr(ws.Cells(row_c1, "G").Value) = "" Then 28 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 29 row_c2 = row_c2 + 1 30 End If 31 32       'XシートのH(右)とI(左)のいずれかが未入力 33   If CStr(ws.Cells(row_c1, "H").Value) = "" Or CStr(ws.Cells(row_c1, "I").Value) = "" Then 34  MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 35  row_c2 = row_c2 + 1 36    End If 37 38 row_c1 = row_c1 + 1 39 40 Loop 41 42End Sub 43

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

For Each RGT In Array(D,F,H)
For Each RGT In Array(E,G,I)
For文に入れると内側と外側のずれが生じるので上手く行きませんでした。

補足

特になし

tatsu99👍を押しています

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

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

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

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

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

tatsu99

2024/02/19 07:08

不明点です。 1.row_c2 をメッセージボックスを表示するたびに、加算していますが、そのあと、row_c2 を使用していません。加算は不要かと思いますが、いかがでしょうか。 2.1つの行で、D,Eの何れかが未入力、F,Gの何れかが未入力、H,Iの何れかが未入力の場合、3回エラーメッセージが表示されますが、これは、意図した動作でしょうか。1回だけ表示すれば良いかと思うのですが、いかがでしょうか。
guest

回答4

0

列を"D"のような文字列じゃなくて4のような数値で指定すれば良いのではないでしょうか。

VBA

1For col = 4 To 8 Step 2 2 If CStr(ws.Cells(row_c1, col).Value) = "" Or CStr(ws.Cells(row_c1, col+1).Value) = "" Then 3 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 4 row_c2 = row_c2 + 1 5 End If 6Next

投稿2024/02/19 11:05

otn

総合スコア85778

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

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

0

if文のフォーマットが同一、if文の中の処理が同一前提ですが
サブプロシージャ化して外に出してみるのはどうでしょう。

Sub Codetest033() Dim row_c1 As Long Dim row_c2 As Long Dim wb As Workbook Dim wb_out As Workbook Dim ws As Worksheet Dim ws_out As Worksheet Set wb = Workbooks("Xブック.xlsx") Set wb_out = Workbooks("Yブック.xlsm") Set ws = wb.Worksheets("Xシート") 'データ元 Set ws_out = wb_out.Worksheets("Yシート") '出力先 row_c1 = 3 row_c2 = 10 Do While CStr(ws.Cells(row_c1, "A").Value) <> "END" Call Codetest033sub("D", "E", ws, row_c1, row_c2) Call Codetest033sub("F", "G", ws, row_c1, row_c2) Call Codetest033sub("H", "I", ws, row_c1, row_c2) row_c1 = row_c1 + 1 Loop End Sub Sub Codetest033sub(arg列1 As String, arg列2 As String, argws As Worksheet, argrow_c1 As Long, argrow_c2 As Long) 'Xシートの列1(右)と列2(左)のいずれかが未入力 If CStr(argws.Cells(argrow_c1, arg列1).Value) = "" Or CStr(argws.Cells(argrow_c1, arg列2).Value) = "" Then MsgBox "Xシート," & argrow_c1 & "行目は画像名称が未入力です" argrow_c2 = argrow_c2 + 1 End If End Sub

投稿2024/02/20 01:22

hawawa

総合スコア89

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

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

0

外出ししてみるとか。

vba

1Function BlankCheck(c As Range) As Boolean 2 BlankCheck = CStr(c.Value) = "" Or CStr(c.Offset(, 1).Value) = "" 3 If BlankCheck = True Then 4 MsgBox c.Worksheet.Name & "," & c.Row & "行目は画像名称が未入力です" 5 End If 6End Function 7

投稿2024/02/20 01:27

jinoji

総合スコア4592

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

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

0

配列などを使って簡素化することは可能でしょうか。

ロジックは、既存の回答と重複していますが、
参考までに、配列を使った例です。

vba

1Sub sample33() 2 3 Dim row_c1 As Long 4 Dim row_c2 As Long 5 Dim wb As Workbook 6 Dim wb_out As Workbook 7 Dim ws As Worksheet 8 Dim ws_out As Worksheet 9 10 Set wb = Workbooks("Xブック.xlsx") 11 Set wb_out = Workbooks("Yブック.xlsm") 12 Set ws = wb.Worksheets("Xシート") 'データ元 13 Set ws_out = wb_out.Worksheets("Yシート") '出力先 14 15 Dim lastRow As Long 16 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 17 Dim values As Variant 18 values = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, 9)).Value 19 20 row_c1 = 3 21 row_c2 = 10 22 Dim i As Long 23 24 Do While CStr(values(row_c1, 1)) <> "END" 25 For i = 4 To 8 Step 2 26 If IsEmpty(values(row_c1, i)) Or IsEmpty(values(row_c1, i + 1)) Then 27 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 28 row_c2 = row_c2 + 1 29 End If 30 Next i 31 32 row_c1 = row_c1 + 1 33 34 Loop 35 36End Sub

配列の使い方が違いますが、こんなことも...という例です。

vba

1Sub sample33() 2 3 Dim row_c1 As Long 4 Dim row_c2 As Long 5 Dim wb As Workbook 6 Dim wb_out As Workbook 7 Dim ws As Worksheet 8 Dim ws_out As Worksheet 9 10 Set wb = Workbooks("Xブック.xlsx") 11 Set wb_out = Workbooks("Yブック.xlsm") 12 Set ws = wb.Worksheets("Xシート") 'データ元 13 Set ws_out = wb_out.Worksheets("Yシート") '出力先 14 15 row_c1 = 3 16 row_c2 = 10 17 18 Dim col As Variant 19 col = [{"D", "E"; "F", "G"; "H", "I"}] 20 Dim i As Long 21 22 Do While CStr(ws.Cells(row_c1, "A").Value) <> "END" 23 For i = 1 To UBound(col, 1) 24 If IsEmpty(ws.Cells(row_c1, col(i, 1))) Or IsEmpty(ws.Cells(row_c1, col(i, 2))) Then 25 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 26 row_c2 = row_c2 + 1 27 End If 28 Next i 29 30 row_c1 = row_c1 + 1 31 32 Loop 33 34End Sub

上をFor Eachを使う方法に変更すると、

vba

1Sub sample33() 2 3 Dim row_c1 As Long 4 Dim row_c2 As Long 5 Dim wb As Workbook 6 Dim wb_out As Workbook 7 Dim ws As Worksheet 8 Dim ws_out As Worksheet 9 10 Set wb = Workbooks("Xブック.xlsx") 11 Set wb_out = Workbooks("Yブック.xlsm") 12 Set ws = wb.Worksheets("Xシート") 'データ元 13 Set ws_out = wb_out.Worksheets("Yシート") '出力先 14 15 row_c1 = 3 16 row_c2 = 10 17 18 Dim col As Variant 19 col = [{"D", "F", "H"}] 20 Dim v As Variant 21 Dim rng As Range 22 23 Do While CStr(ws.Cells(row_c1, "A").Value) <> "END" 24 For Each v In col 25 Set rng = ws.Range(v & row_c1) 26 If IsEmpty(rng) Or IsEmpty(rng.Offset(0, 1)) Then 27 MsgBox "Xシート," & row_c1 & "行目は画像名称が未入力です" 28 row_c2 = row_c2 + 1 29 End If 30 Next v 31 32 row_c1 = row_c1 + 1 33 34 Loop 35 36End Sub

投稿2024/02/19 12:28

編集2024/02/20 00:27
YellowGreen

総合スコア791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問