ray88’s diary

お仕事で困ったとき用の自分用の覚書

AccessVBA テキストボックスやコンボボックスを順番に飛ばさず入力しているかチェックする

■必須項目ではないが、順番に飛ばさず入力する必要のあるものの空欄チェック方法
※このページの一番下に部品化したコードあり

Sub chkSkipBlank()
'-------------------------------------------------------------
'機能:必須項目ではないが、途中を飛ばさずに順番に入力が必要な
'      コンボボックスの空欄チェック
'-------------------------------------------------------------
    Dim arrayNum() As Integer       '動的配列を宣言
    Dim i As Integer                'コンボボックス名の番号部分
    Dim k As Integer                '配列の要素番号
    Dim LastItemNum As Integer      '配列の最後に格納されている番号
    Dim arrayMaxNum As Integer      '配列インデックスの最大値
    Dim allBlankFlag As Boolean     '全て空の場合のフラグ    
    'フラグの初期化(全て空欄の場合True,一つでも入力があればFalse)
   allBlankFlag = True
    k = 0
    '「テスト用」フォーム内のコンボボックス「cmb_Test1」から「cmb_Test4」まで空欄チェック
    With Forms("テスト用")
        For i = 1 To 4
            'コンボボックスの値が空欄以外なら配列にコンボボックス名の数値部分を格納
            If .Controls("cmb_Test" & i) <> "" Then
                allBlankFlag = False
                k = k + 1
                ReDim Preserve arrayNum(k)
                arrayNum(k) = i
            End If
        Next
    End With
    If allBlankFlag = True Then
        MsgBox "全て空欄"
    Else    
        '配列の最後の要素に格納された数値を取得
        LastItemNum = arrayNum(UBound(arrayNum))
        '配列のインデックスの最大値を取得
        arrayMaxNum = UBound(arrayNum)
        
        Debug.Print "配列の最後の要素:" & LastItemNum
        Debug.Print "配列インデックスの最大値:" & arrayMaxNum
        
        '配列の要素の最後に格納された数値と配列インデックスの最大値の数値が一致していない場合は
        '途中のコンボボックスを飛ばして入力していると判定
        If LastItemNum <> arrayMaxNum Then
            MsgBox "コンボボックスは途中を飛ばさずに順番に入力してください"
            Debug.Print "コンボボックスは途中を飛ばさずに順番に入力してください"
        Else
            MsgBox "入力OK"
            Debug.Print "入力OK"
        End If
    End If
End Sub

f:id:ray88:20201206093503p:plain
f:id:ray88:20201128113149p:plain
f:id:ray88:20201128113237p:plain
■部品化
呼び出し元プロシージャ

Sub テスト()
    Dim Result As Boolean
    Result = fncChkSkipBlank("テスト用", "cmb_Test", 4)
    MsgBox Result
End Sub

Functionプロシージャ

Function fncChkSkipBlank(strFormName As String, strControlName As String, intControlMaxNum As Integer) As String
'---------------------------------------------------------------------------
'機能:必須項目ではないが、途中を飛ばさずに順番に入力が必要な
'      コンボボックスやテキストボックス等の空欄チェック
'引数1:対象フォーム名
'引数2:数値部分を除いたコントロール名 (例)「txb_Name1」~「txb_Name4」
'    を調べたい場合は「txb_Name」までを引数で渡す
'引数3:確認したいコントロールの個数(例)「txb_Name1」~「txb_Name4」
'    を調べたい場合は「4」を引数で渡す
'戻り値:全て空欄の場合は「全て空欄」
'        飛ばして入力している場合は「NG」
'    順番に入力している場合は「OK」
'----------------------------------------------------------------------------
    Dim arrayNum() As Integer       '動的配列を宣言
    Dim i As Integer                'コントロール名の番号部分
    Dim k As Integer                '配列の要素番号
    Dim LastItemNum As Integer      '配列の最後に格納されている番号
    Dim arrayMaxNum As Integer      '配列のインデックスの最大値
    Dim allBlankFlag As Boolean     '全て空の場合のフラグ    
    'フラグの初期化(全て空欄の場合True,一つでも入力があればFalse)
    allBlankFlag = True    
    k = 0
    '指定されたフォーム内の対象コントロールの個数分の空欄チェック
    With Forms(strFormName)
        For i = 1 To intControlMaxNum
            'コントロールの値が空欄以外なら配列にコントロール名の数値部分を格納
            If .Controls(strControlName & i) <> "" Then
                allBlankFlag = False
                k = k + 1
                ReDim Preserve arrayNum(k)
                arrayNum(k) = i
            End If
        Next
    End With
    
    If allBlankFlag = True Then
        fncChkSkipBlank = "全て空欄"
    Else
        '配列の最後の要素に格納された数値を取得
        LastItemNum = arrayNum(UBound(arrayNum))
        '配列のインデックスの最大値を取得
        arrayMaxNum = UBound(arrayNum)
        
        Debug.Print "配列の最後の要素:" & LastItemNum
        Debug.Print "配列のインデックスの最大値:" & arrayMaxNum
        
        '配列の要素の最後に格納された数値と配列のインデックスの最大値の数値が一致していない場合は
        '途中のコントロールを飛ばして入力していると判定
        If LastItemNum <> arrayMaxNum Then
            fncChkSkipBlank = "NG"
        Else
            fncChkSkipBlank = "OK"
        End If
    End If
End Function