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

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

ただいまの
回答率

87.49%

【ExcelVBA】配列を使用した空白セルのチェック、空白セルの場所をメッセージボックスで出力/配列によるセルの色指定

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 4,116
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

ExcelVBAで申請書をテキスト出力するツールを使用しています。
そのツールに2つ機能を追加しようとしています。

①申請書には申請区分が1~3まであり、それぞれの区分に応じた必須入力項目に値が入っていなければ(セルが空白の時)エラーメッセージを出力する。その時に、未入力のセルの場所も表示させる。
エラーメッセージ例)
A5,E3,G12 セルに入力してください。

②申請区分を選択した際、必須入力項目のセル色を変更
申請区分1~3で登場する全ての必須項目のうち、申請区分を1を選んだ場合は、全体の必須項目から申請区分1の必須項目のみをRGB(255,255,153)に、それ以外の申請区分2、3の必須項目でかつ申請区分1で使用しないものは、RGB(255,255,255)というようにしたいです。

※申請区分はC3セルで、申請区分1~3までをプルダウンで選択する仕様です。
各申請区分の必須項目
・申請区分1(D3,D4,D5,D6,D9,D12,E22,F22,D25,D28)
・申請区分2(D5,D6,D11,D16,E34,F34,D36,D37)
・申請区分3(D5,D6,D15,D16,E18,E19,D25,E35,D36)

今後申請区分が増えるため、簡潔に配列を使用した処理で書きたいと思っております。
①についてはセルの配列処理が上手くできず、止まっています。
配列を使用せず、必須項目のいずれかが空白だった場合にエラーを出力することはできるのですが、そこから先が出来ずにいます。
②は処理はできるのですが、長くなってしまいます。

配列はあまり使用した事がないのですが、今回使用してプログラムを書いてみようと思いました。

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

1.セルの配列処理をどのようにしたらよいのか分かりません。
セルの値を取得することはできるのですが、セルの場所の表示方法が分かりません。
また、必須項目のうち空白セルの場所だけを組み合わせて表示するにはどのようにしたらよいのでしょうか。
2.必須項目のセルの色の変更も配列で行いたいのですが、現状だと長くなってしまうので、改善したいと考えています。

 該当のソースコード

Sub input_check()
'①セルの入力チェック

    If Range("C3") = "申請区分1" Then
        If Range("D3") = "" Or Range("D4") = "" Or Range("D5") = "" Or Range("D6") = "" Or Range("D9") = "" Or Range("D12") = "" _
            Or Range("E22") = "" Or Range("F22") = "" Or Range("D25") = "" Or Range("D28") = "" Then
            MsgBox "未入力セルがあります"
        End If

    ElseIf Range("C3") = "申請区分2" Then
        If Range("D5") = "" Or Range("D6") = "" Or Range("D11") = "" Or Range("D16") = "" Or Range("E34") = "" Or Range("F34") = "" _
            Or Range("D36") = "" Or Range("D37") = "" Then
            MsgBox "未入力セルがあります"
        End If

    ElseIf Range("C3") = "申請区分3" Then
        If Range("D5") = "" Or Range("D6") = "" Or Range("D15") = "" Or Range("D16") = "" Or Range("E18") = "" Or Range("E19") = "" _
            Or Range("D25") = "" Or Range("E35") = "" Or Range("D36") = "" Then
            MsgBox "未入力セルがあります"
        End If

    End If

End Sub

 該当のソースコード

Sub sinsei()

'②必須項目セルの色を変更

If Range("C3") = "申請区分1" Then
   '申請区分1の必須項目を黄色に
    Range("D3").Interior.Color = RGB(255, 255, 153)
    Range("D4").Interior.Color = RGB(255, 255, 153)
    Range("D5").Interior.Color = RGB(255, 255, 153)
    Range("D6").Interior.Color = RGB(255, 255, 153)
    Range("D9").Interior.Color = RGB(255, 255, 153)
    Range("D12").Interior.Color = RGB(255, 255, 153)
    Range("E22").Interior.Color = RGB(255, 255, 153)
    Range("F22").Interior.Color = RGB(255, 255, 153)
    Range("D25").Interior.Color = RGB(255, 255, 153)
    Range("D28").Interior.Color = RGB(255, 255, 153)

   '申請区分2の必須項目を白色に(申請区分1と共通の項目は除く)
    Range("D11").Interior.Color = RGB(255, 255, 255)
    Range("D16").Interior.Color = RGB(255, 255, 255)
    Range("E34").Interior.Color = RGB(255, 255, 255)
    Range("F34").Interior.Color = RGB(255, 255, 255)
    Range("D36").Interior.Color = RGB(255, 255, 255)
    Range("D37").Interior.Color = RGB(255, 255, 255)

   '申請区分3の必須項目を白色に(申請区分1,申請区分2と共通の項目は除く)
    Range("D15").Interior.Color = RGB(255, 255, 255)
    Range("E18").Interior.Color = RGB(255, 255, 255)
    Range("E19").Interior.Color = RGB(255, 255, 255)
    Range("D25").Interior.Color = RGB(255, 255, 255)
    Range("E35").Interior.Color = RGB(255, 255, 255)

ElseIf Range("C3") = "申請区分2" Then
    '申請区分2の必須項目を黄色に
    Range("D5").Interior.Color = RGB(255, 255, 153)
    Range("D6").Interior.Color = RGB(255, 255, 153)
    Range("D11").Interior.Color = RGB(255, 255, 153)
    Range("D16").Interior.Color = RGB(255, 255, 153)
    Range("E34").Interior.Color = RGB(255, 255, 153)
    Range("F34").Interior.Color = RGB(255, 255, 153)
    Range("D36").Interior.Color = RGB(255, 255, 153)
    Range("D37").Interior.Color = RGB(255, 255, 153)

    '申請区分1の必須項目を白色に(申請区分2と共通の項目は除く)
    Range("D3").Interior.Color = RGB(255, 255, 255)
    Range("D4").Interior.Color = RGB(255, 255, 255)
    Range("D9").Interior.Color = RGB(255, 255, 255)
    Range("D12").Interior.Color = RGB(255, 255, 255)
    Range("E22").Interior.Color = RGB(255, 255, 255)
    Range("F22").Interior.Color = RGB(255, 255, 255)
    Range("D25").Interior.Color = RGB(255, 255, 255)
    Range("D28").Interior.Color = RGB(255, 255, 255)

    '申請区分3の必須項目を白色に(申請区分1,申請区分2と共通の項目は除く)
    Range("D15").Interior.Color = RGB(255, 255, 255)
    Range("E18").Interior.Color = RGB(255, 255, 255)
    Range("E19").Interior.Color = RGB(255, 255, 255)
    Range("D25").Interior.Color = RGB(255, 255, 255)
    Range("E35").Interior.Color = RGB(255, 255, 255)

ElseIf Range("C3") = "申請区分3" Then
    '申請区分3の必須項目を黄色に
    Range("D5").Interior.Color = RGB(255, 255, 153)
    Range("D6").Interior.Color = RGB(255, 255, 153)
    Range("D15").Interior.Color = RGB(255, 255, 153)
    Range("D16").Interior.Color = RGB(255, 255, 153)
    Range("E18").Interior.Color = RGB(255, 255, 153)
    Range("E19").Interior.Color = RGB(255, 255, 153)
    Range("D25").Interior.Color = RGB(255, 255, 153)
    Range("E35").Interior.Color = RGB(255, 255, 153)
    Range("D36").Interior.Color = RGB(255, 255, 153)

    '申請区分1の必須項目を白色に(申請区分3と共通の項目は除く)
    Range("D3").Interior.Color = RGB(255, 255, 255)
    Range("D4").Interior.Color = RGB(255, 255, 255)
    Range("D9").Interior.Color = RGB(255, 255, 255)
    Range("D12").Interior.Color = RGB(255, 255, 255)
    Range("E22").Interior.Color = RGB(255, 255, 255)
    Range("F22").Interior.Color = RGB(255, 255, 255)
    Range("D25").Interior.Color = RGB(255, 255, 255)
    Range("D28").Interior.Color = RGB(255, 255, 255)

    '申請区分2の必須項目を白色に(申請区分1,申請区分3と共通の項目は除く)
    Range("D11").Interior.Color = RGB(255, 255, 255)
    Range("E34").Interior.Color = RGB(255, 255, 255)
    Range("F34").Interior.Color = RGB(255, 255, 255)
    Range("D37").Interior.Color = RGB(255, 255, 255)

End If

End Sub

 試したこと

Sub array_test()
'セルの値の取得(OK)
Dim ary(3) As String
ary(0) = Cells(3, 1)

MsgBox ary(0)

End Sub

Sub array_test2()
'セルの場所の取得(実行時エラー91)
Dim ary(3) As Range
ary(0) = Cells(3, 1)

MsgBox ary(0)

End Sub

ご存知の方おりましたら、教えて頂けますと幸いです。
よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

文字列で定義しておいて、Splitで配列化するとメンテが楽だと思います。
また、色設定のときのRangeにもそのまま使えます。

Const 申請区分1用 As String = "D3,D4,D5,D6,D9,D12,E22,F22,D25,D28"
Const 申請区分2用 As String = "D5,D6,D11,D16,E34,F34,D36,D37"
Const 申請区分3用 As String = "D5,D6,D15,D16,E18,E19,D25,E35,D36"
'
' jawaさんのご指摘により修正。
' クリア用には色をつけるセル。つまりを申請区分1用~申請区分3用のセルをすべて
' 含める必要があります。この際、漏れが発生しやすいため以下のとおり修正
'
' Const クリア用 As String =
'  "D3,D4,D5,D6,D9,D12,E22,F22,D25,D28,D11,D16,E34,F34,D36,D37,D15,E18,E19,E35,D36"
Dim クリア用 As String: クリア用 = 申請区分1用 & "," & 申請区分2用 & "," & 申請区分3用

Dim txt As String
If (Range("C3") = "申請区分1") Then
  txt = 申請区分1用
ElseIf (Range("C3") = "申請区分2") Then
  txt = 申請区分2用
ElseIf (Range("C3") = "申請区分3") Then
  txt = 申請区分3End If

Dim adrs As Variant: adrs = Split(txt, ",")                 ' 配列化
Dim ix As Long

' ここから置き換え--------------------------------------------------
txt = ""
For ix = 0 To UBound(adrs)
  If (Me.Range(adrs(ix)) = "") Then txt = txt & "," & adrs(ix)       ' アドレスを収集
Next ix
If (txt <> "") Then
  '
  ' アドレスはtxtに収集されています
  '
  txt = Mid$(txt, 2)                                              ' txt先頭の","を除去
  MsgBox ("未入力セルがあります") & vbCrLf & "(""" & txt & "'')"    ' メッセージ
  Range(クリア用).Interior.Color = RGB(255, 255, 255)              ' 全クリア
  Range(txt).Interior.Color = RGB(255, 255, 153)                  ' 空白セルだけ色をつける
End If
' ここまで --------------------------------------------------------  

' 旧コード --------------------------------------------------------
'For ix = 0 To UBound(adrs)
'  If (Range(adrs(ix)) = "") Then Exit For
'Next ix
'If (ix <= UBound(adrs)) Then
'  MsgBox ("未入力セルがあります")
'  Range(クリア用).Interior.Color = RGB(255, 255, 255)
'  Range(txt).Interior.Color = RGB(255, 255, 153)
'End If

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/19 12:02

    MsgBox ("未入力セルがあります")&vbCrlf&("D5,D12")というような感じで、MsgBox ("未入力セルがあります")と一緒に、空白セルの場所を表示する事は出来ますでしょうか。

    キャンセル

  • 2018/09/19 12:40

    >空白セルの場所を表示する事は出来ますでしょうか。

    - 最初の空白セルだけでなく、すべての空白セルを表示するにはループを途中でexitせず、
    最後までまわしてください。
    - エラーを検出したセルアドレスはadrs(ix) で得られますので、これを収集していきます。
    - あと、すいません、色を変えるのは空白セルだけですね。

    回答のコードを修正しましたのでご確認ください。

    キャンセル

  • 2018/09/20 14:03

    ご丁寧にありがとうございます。
    非常に助かります。何とか無事に出来ました。

    キャンセル

0

この方針はどうでしょうか?

  • チェックする対象セルの名前(B1とか)をCollection型の入れ物に入れる
  • Collectionに入っているものすべてについて、空かどうかを判断する関数を作る

配列でもできますが、Collectionという入れ物のほうが処理はすっきりすると思います。

これなら、あらかじめCollectionにセル名を入れるところは手間ではありますが、判断処理はFor Eachループでくるくる回して終わらせられますし、将来、対象セルが増減しても変更は少なくて済みます。
同じようなループを使えば色を変えるのもできますよね?良かったら参考にしてください。

なおサンプルコードはざっくりとしか書いていないので適宜補正してください。

Public Sub InputCheck()

    ' コレクション型の入れ物に、チェック対象のセル名をあらかじめAddしておく
    ' 配列と違って入れられる数に制限が無いのでこのほうが楽です
    Dim targetCells As Collection
    Set targetCells = New Collection
    targetCells.Add ("A1")
    targetCells.Add ("A2")
    targetCells.Add ("A3")
    targetCells.Add ("A4")
    targetCells.Add ("A5")

    ' チェックは「IsEmpty」関数におまかせ
    MsgBox IsEmpty(targetCells)

End Sub

' セル名が入ったコレクションを受け取り、そこに書かれたセルのどれかが空ならTrue
Public Function IsEmpty(cellNames As Collection) As Boolean

    ' 判断結果を入れる変数
    Dim result As Boolean
    result = False

    ' コレクション型は「For Each」でループさせられます。
    Dim cellName As Variant
    For Each cellName In cellNames
        ' コレクションにはいったセル名を使ってRangeで中身を取り出し、空なら結果用変数をTrueに
        If Trim(Range(CStr(cellName)).Value) = "" Then
            result = True
        End If
    Next

    IsEmpty = result

End Function

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/18 09:40

    補足。For Eachループで空とわかった時のセル名をどこかに取っておけば、どのセルが空であるかもわかると思います。あとは適宜改造してもらえばなんとかなるのではないかと。
    Collectionを使わない場合、配列の場合も基本的な考え方は同じです。String配列に「A3」とか対象のセル名を入れておいて、配列の先頭から終わりまでForループでチェックすればいけますね。

    キャンセル

  • 2018/09/19 09:11

    ご回答ありがとうございます。
    Collectionを使用した書き方は知りませんでした。
    とても勉強になります。

    キャンセル

0

セルのアドレスを文字列の状態で配列にして都度セルを取得するやり方で書いてみました。

Sub input_check()

'・申請区分1(D3,D4,D5,D6,D9,D12,E22,F22,D25,D28)
    Dim array1() As String
    array1 = Array("D3", "D4", "D5", "D6", "D9", "D12", "E22", "F22", "D25", "D28")
'・申請区分2(D5,D6,D11,D16,E34,F34,D36,D37)
    Dim array2() As String
    array2 = Array("D5", "D6", "D11", "D16", "E34", "F34", "D36", "D37")
'・申請区分3(D5,D6,D15,D16,E18,E19,D25,E35,D36)
    Dim array3() As String
    array3 = Array("D5", "D6", "D15", "D16", "E18", "E19", "D25", "E35", "D36")



    Dim r1 As range
    Dim strAddress
    For Each strAddress In array1
        Set r1 = range(strAddress)
        If (r1.Value = "") Then
            MsgBox "未入力セルがあります"
        End If
    Next

    For Each strAddress In array2
        Set r1 = range(strAddress)
        If (r1.Value = "") Then
            MsgBox "未入力セルがあります"
        End If
    Next

    For Each strAddress In array3
        Set r1 = range(strAddress)
        If (r1.Value = "") Then
            MsgBox "未入力セルがあります"
        End If
    Next

End Sub
Sub sinsei()

'・申請区分1(D3,D4,D5,D6,D9,D12,E22,F22,D25,D28)
    Dim array1() As String
    array1 = Array("D3", "D4", "D5", "D6", "D9", "D12", "E22", "F22", "D25", "D28")
'・申請区分2(D5,D6,D11,D16,E34,F34,D36,D37)
    Dim array2() As String
    array2 = Array("D5", "D6", "D11", "D16", "E34", "F34", "D36", "D37")
'・申請区分3(D5,D6,D15,D16,E18,E19,D25,E35,D36)
    Dim array3() As String
    array3 = Array("D5", "D6", "D15", "D16", "E18", "E19", "D25", "E35", "D36")

    Dim r1 As range
    Dim strAddress
    For Each strAddress In array1
        Set r1 = range(strAddress)
        r1.Interior.Color = RGB(255, 255, 153)
    Next

    For Each strAddress In array2
        Set r1 = range(strAddress)
        r1Interior.Color = RGB(255, 255, 255)
    Next

    For Each strAddress In array3
        Set r1 = range(strAddress)
        r1Interior.Color = RGB(255, 255, 255)
    Next
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/19 09:14

    ご回答ありがとうございます。
    分かりやすいコードで大変参考になりました。

    キャンセル

0

折角エクセルを使ってるんですから、
シートに表形式で判定一覧を作ってはどうでしょうか?
(自分はよくやる方法です)

CDEにエラーチェックフラグを立てておき、
チェック対象なら、該当アドレスのセルに対して、
該当のエラーチェックを実施する、
という処理を回すだけですみます。

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/19 09:02

    ご回答ありがとうございます。
    エクセルを使って、エラーフラグを立てる方法があるとは知りませんでした。大変参考になりました。

    キャンセル

  • 2018/09/19 09:18

    この方法のメリットは、メンテのしやすさにあります。
    アドレス欄には、=Address(Row([対象セル]),Column([対象セル]))
    と数式で設定しておきます。
    エラーフラグも、数式を使えば条件によって変化させられます。

    申請区分の増加・削除、エラーの追加・削除はもとより、
    対象セルの移動等、レイアウトが変化した時にも、
    調整が必要な箇所が少ない、という作りにできます。

    まぁ、ご参考まで。

    キャンセル

  • 2018/09/19 09:39

    メンテナンスのしやすさは重要ですよね。
    自分ではとても思いつかなかったので、非常に勉強になります。
    ありがとうございます。

    キャンセル

0

 「試したこと」のエラーについて

'セルの値の取得(OK)
Dim ary(3) As String
ary(0) = Cells(3, 1)

このコードですが、実際はCellsの後ろの.Value(のようなもの)が省略されています。
省略せずに書くと以下のようになります。

'セルの値の取得(OK)
Dim ary(3) As String
ary(0) = Cells(3, 1).Value

(アクティブなシートの)セル全体の、3行目1列目のセル(Range)について
値(Variant型)を取得し、それを文字列に変換して、ary(0)へ代入します。

Cells(3, 1)とRangeを指定したのに、なぜValueが出てくるかというと
VBAでは、「オブジェクト(Rangeなど)の代入にはSetを付ける」というルールがあるため、
Setが付いていない→何かしらの値の代入と判断→Valueが自動補完される、ということになります。

これを踏まえてarray_test2の記述を見てみます。

'セルの場所の取得(実行時エラー91)
Dim ary(3) As Range
ary(0) = Cells(3, 1)

ary(0) = Cells(3, 1)の文ですが、Setが付いていないため値の代入と判断されます。
しかしary(0)は中身がない(Nothing)、つまりオブジェクト変数の中身が設定されていないため
オブジェクト変数または With ブロック変数が設定されていません。
のエラーが発生します。


各申請区分の範囲は、名前付き範囲にしておくと設定範囲がわかりやすくなると思います。

また今回の場合であれば、配列にこだわらず、Rangeの機能を使うのも手ではないかと思います。

h.horikoshiさんのコードをベースにRangeの機能を活用すると以下のような感じでしょうか。

Option Explicit

Private Const 申請区分1As String = "D3,D4,D5,D6,D9,D12,E22,F22,D25,D28"
Private Const 申請区分2As String = "D5,D6,D11,D16,E34,F34,D36,D37"
Private Const 申請区分3As String = "D5,D6,D15,D16,E18,E19,D25,E35,D36"

'申請区分の必須セルを取得する関数
Private Function getRequestClassRequireCells() As Excel.Range
    'TODO:シート指定
    Dim ws As Excel.Worksheet
    Set ws = ActiveSheet 'ThisWorkbook.Worksheets.Item(シートの名前)

    Select Case ws.Range("C3").Text
        Case "申請区分1"
            Set getRequestClassRequireCells = ws.Range(申請区分1用)
        Case "申請区分2"
            Set getRequestClassRequireCells = ws.Range(申請区分2用)
        Case "申請区分3"
            Set getRequestClassRequireCells = ws.Range(申請区分3用)
        Case Else
            Err.Raise 5, Description:="申請区分に不適切な値が指定されています。"
    End Select
End Function

Sub input_check()

    '未入力のセル
    Dim emptyCells As Excel.Range

    '申請区分の必須セルそれぞれの中身を確認
    Dim r As Excel.Range
    For Each r In getRequestClassRequireCells()
        If r.Text = VBA.vbNullString Then
            '空なら結合
            Set emptyCells = Union2(emptyCells, r)
        End If
    Next r

    '空のものがない=入力OK
    If emptyCells Is Nothing Then
        Exit Sub
    End If

    Dim msg As String
    msg = "未入力セルがあります。" & vbLf & _
          emptyCells.AddressLocal(False, False) 'Range.Addressでセル番地取得

    Call VBA.MsgBox(msg)
End Sub

Sub sinsei()
    '全部白にしてから黄色にする
    Call Clear
    getRequestClassRequireCells().Interior.Color = RGB(255, 255, 153)
End Sub

Private Sub Clear()
    '対象セル全結合して背景白
    'TODO:シート指定
    Excel.Union(Range(申請区分1用), Range(申請区分2用), Range(申請区分3用)).Interior.Color = vbWhite
End Sub

'Nothingを許容するUnion
Private Function Union2(a As Excel.Range, b As Excel.Range) As Excel.Range 'Or Nothing
    If a Is Nothing Then
        Set Union2 = b
        Exit Function
    End If

    If b Is Nothing Then
        Set Union2 = a
    Else
        Set Union2 = a.Application.Union(a, b)
    End If
End Function

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/19 08:59

    非常に分かりやすいご説明ありがとうございます。
    根本的なところを理解出来き、大変勉強になりました。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBAに関する質問
  • 【ExcelVBA】配列を使用した空白セルのチェック、空白セルの場所をメッセージボックスで出力/配列によるセルの色指定