Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3108 / 13646 ツリー ←次へ | 前へ→

【64217】Elseの分岐 初心者です 10/1/26(火) 17:36 質問[未読]
【64218】Re:Elseの分岐 Hirofumi 10/1/26(火) 18:42 回答[未読]
【64219】Re:Elseの分岐 Hirofumi 10/1/26(火) 18:51 回答[未読]
【64220】Re:Elseの分岐 Hirofumi 10/1/26(火) 19:13 回答[未読]
【64229】Re:Elseの分岐 初心者です 10/1/27(水) 10:42 質問[未読]
【64231】Re:Elseの分岐 neptune 10/1/27(水) 11:02 回答[未読]
【64233】Re:Elseの分岐 初心者です 10/1/27(水) 11:34 質問[未読]
【64236】Re:Elseの分岐 seg 10/1/27(水) 12:25 発言[未読]
【64242】Re:Elseの分岐 初心者です 10/1/27(水) 14:36 質問[未読]
【64235】Re:Elseの分岐 Hirofumi 10/1/27(水) 12:16 回答[未読]
【64240】Re:Elseの分岐 初心者です 10/1/27(水) 13:53 お礼[未読]
【64243】Re:Elseの分岐 Hirofumi 10/1/27(水) 14:42 発言[未読]
【64244】Re:Elseの分岐 初心者です 10/1/27(水) 15:03 お礼[未読]
【64221】Re:Elseの分岐 よろずや 10/1/26(火) 19:30 回答[未読]
【64230】Re:Elseの分岐 初心者です 10/1/27(水) 10:52 質問[未読]
【64241】Re:Elseの分岐 初心者です 10/1/27(水) 14:00 お礼[未読]

【64217】Elseの分岐
質問  初心者です  - 10/1/26(火) 17:36 -

引用なし
パスワード
   エクセルで納品書を作成する本を見て、納品書を作成している、VBA初心者です。
使いやすいように、アレンジしたいのですが、Elseの分岐で、つまずいています。
以下の伝票の登録ボタンを作成しているのですが、「〜が未入力の場合」と「〜が空白の場合」の分岐条件を増やしたく、以下のようにしてみましたが、「コンパイルエラー Elseに対応するIfがありません」の文章が出て、'数量単位に空欄がある場合の次のElseが選択されます。
基本的な事なのかもしれませんが、本を見て、丸写しながらやっている為、どこが間違っているのか、分かりません。
何卒、ご教示のほど、よろしくお願いいたします。

'
'「登録・更新」ボタンがクリックされたときの処理
'
Private Sub cmd登録・更新_Click()

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
  
  '初期値を代入する
  chkStr = ""
  
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    chkStr = "受付担当を入力してください。"
    Range("L11").Select
  
  '顧客名が未入力の場合
  ElseIf IsEmpty(Range("B6")) Then
    chkStr = "顧客番号を入力してください。"
    Range("B6").Select
  
  '発送日が未入力の場合
  ElseIf IsEmpty(Range("B9")) Then
    chkStr = "発送日を入力してください。"
    Range("B9").Select
  
  '品名が未入力の場合
  ElseIf myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("B17").Select
  
  '数量に空欄がある場合
  Else
    For i = 1 To 18
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
        If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
          chkStr = "数量が未入力の商品があります。"
          Cells(16 + i, 9).Select
                  
          'Forループを抜ける
          Exit For
        End If
      End If
    Next
  End If
    
  '数量単位に空欄がある場合
  Else
    For i = 1 To 18
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
        If IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
          chkStr = "数量単位が未入力の商品があります。"
          Cells(16 + i, 10).Select
          
          'Forループを抜ける
          Exit For
        End If
      End If
    Next
  End If
  
  '単価に空欄がある場合
  Else
    For i = 1 To 18
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
        If IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
          chkStr = "単価が未入力の商品があります。"
          Cells(16 + i, 11).Select
          
          'Forループを抜ける
          Exit For
        End If
      End If
    Next
  End If
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If


End Sub

【64218】Re:Elseの分岐
回答  Hirofumi  - 10/1/26(火) 18:42 -

引用なし
パスワード
   Goto文嫌らわれるのですが?
私なら、以下の様かな?

Private Sub cmd登録更新_Click()

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
 
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
 
  '初期値を代入する
  chkStr = ""
 
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    chkStr = "受付担当を入力してください。"
    Range("L11").Select
    GoTo Wayout
  End If
  
  '顧客名が未入力の場合
  If IsEmpty(Range("B6")) Then
    chkStr = "顧客番号を入力してください。"
    Range("B6").Select
    GoTo Wayout
  End If
 
  '発送日が未入力の場合
  If IsEmpty(Range("B9")) Then
    chkStr = "発送日を入力してください。"
    Range("B9").Select
    GoTo Wayout
  End If
 
  '品名が未入力の場合
  If myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("B17").Select
    GoTo Wayout
  End If
 
  '数量に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
        chkStr = "数量が未入力の商品があります。"
        Cells(16 + i, 9).Select
        'Forループを抜ける
'        Exit For
        GoTo Wayout
      End If
    End If
  Next i
  
  '数量単位に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
        chkStr = "数量単位が未入力の商品があります。"
        Cells(16 + i, 10).Select
        'Forループを抜ける
'        Exit For
        GoTo Wayout
      End If
    End If
  Next i
 
  '単価に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
        chkStr = "単価が未入力の商品があります。"
        Cells(16 + i, 11).Select
        'Forループを抜ける
'        Exit For
        GoTo Wayout
      End If
    End If
  Next i
 
Wayout:

  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
  End If

End Sub

【64219】Re:Elseの分岐
回答  Hirofumi  - 10/1/26(火) 18:51 -

引用なし
パスワード
   'Functionの形にして呼び出した方が使い勝手が善いかも?

Option Explicit

Private Sub cmd登録・更新_Click()

  '入力漏れがある場合はプロシージャを抜ける
  If DataCheke <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
  End If

End Sub

Private Function DataCheke() As String

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
 
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
 
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    DataCheke = "受付担当を入力してください。"
    Range("L11").Select
    Exit Function
  End If
  
  '顧客名が未入力の場合
  If IsEmpty(Range("B6")) Then
    DataCheke = "顧客番号を入力してください。"
    Range("B6").Select
    Exit Function
  End If
 
  '発送日が未入力の場合
  If IsEmpty(Range("B9")) Then
    DataCheke = "発送日を入力してください。"
    Range("B9").Select
    Exit Function
  End If
 
  '品名が未入力の場合
  If myMeiCnt = 0 Then
    DataCheke = "明細データを入力してください。"
    Range("B17").Select
    Exit Function
  End If
 
  '数量に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
        DataCheke = "数量が未入力の商品があります。"
        Cells(16 + i, 9).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i
  
  '数量単位に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
        DataCheke = "数量単位が未入力の商品があります。"
        Cells(16 + i, 10).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i
 
  '単価に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
        DataCheke = "単価が未入力の商品があります。"
        Cells(16 + i, 11).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i
 
End Function

【64220】Re:Elseの分岐
回答  Hirofumi  - 10/1/26(火) 19:13 -

引用なし
パスワード
   ごめん
呼び出しはこうして下さい

Private Sub cmd登録・更新_Click()

  Dim chkStr As String
  
  
  '入力漏れがある場合はプロシージャを抜ける
  chkStr = DataCheke
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
  End If

End Sub

【64221】Re:Elseの分岐
回答  よろずや  - 10/1/26(火) 19:30 -

引用なし
パスワード
   >  '数量に空欄がある場合
>  Else
>    For i = 1 To 18
>      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
>        If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
>          chkStr = "数量が未入力の商品があります。"
>          Cells(16 + i, 9).Select
>                  
>          'Forループを抜ける
>          Exit For
         ElseIf IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
          chkStr = "数量単位が未入力の商品があります。"
          Cells(16 + i, 10).Select
          
          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
          chkStr = "単価が未入力の商品があります。"
          Cells(16 + i, 11).Select
          
          'Forループを抜ける
          Exit For
        End If
>      End If
>    Next
>  End If

【64229】Re:Elseの分岐
質問  初心者です  - 10/1/27(水) 10:42 -

引用なし
パスワード
   Hirofumi さん、ご親切にご回答をありがとうございます。
ですが、

実行時エラー'13':
型が一致しません。

のエラーが出てしまいました。

'----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value   ←そして、ここが黄色く選択されます

私の質問の仕方がまずかったかもしれません
エラーの出ない、当初の本に書かれてあった、サンプルコードは、以下のとおりです。

'
'「登録」ボタンがクリックされたときの処理
'
Private Sub cmd登録_Click()
  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("J23").Value
  
  '初期値を代入する
  chkStr = ""
  
  '受付担当が未入力の場合
  If IsEmpty(Range("D3")) Then
    chkStr = "受付担当を入力してください。"
    Range("D3").Select
  
  '顧客番号が未入力の場合
  ElseIf IsEmpty(Range("D7")) Then
    chkStr = "顧客番号を入力してください。"
    Range("D7").Select
  
  '商品番号が未入力の場合
  ElseIf myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("C11").Select
  
  '数量に空欄がある場合
  Else
    For i = 1 To 10
      If Not IsEmpty(Cells(10 + i, 3)) Then    'i行目の商品番号
        If IsEmpty(Cells(10 + i, 8)) Then    'i行目の数量
          chkStr = "数量が未入力の商品があります。"
          Cells(10 + i, 8).Select
          
          'Forループを抜ける
          Exit For
        End If
      End If
    Next
  End If
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If
End Sub

Hirofumi さんのご指示のように、私が入れてみたコードは、以下の通りです。

Private Sub cmd登録・更新_Click()
  Dim chkStr As String
 
 
  '入力漏れがある場合はプロシージャを抜ける
  chkStr = DataCheke
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
  End If

End Sub


Private Function DataCheke() As String

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数

  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value

  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    DataCheke = "受付担当を入力してください。"
    Range("L11").Select
    Exit Function
  End If
 
  '顧客名が未入力の場合
  If IsEmpty(Range("B6")) Then
    DataCheke = "顧客番号を入力してください。"
    Range("B6").Select
    Exit Function
  End If

  '発送日が未入力の場合
  If IsEmpty(Range("B9")) Then
    DataCheke = "発送日を入力してください。"
    Range("B9").Select
    Exit Function
  End If

  '品名が未入力の場合
  If myMeiCnt = 0 Then
    DataCheke = "明細データを入力してください。"
    Range("B17").Select
    Exit Function
  End If

  '数量に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
        DataCheke = "数量が未入力の商品があります。"
        Cells(16 + i, 9).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i
 
  '数量単位に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
        DataCheke = "数量単位が未入力の商品があります。"
        Cells(16 + i, 10).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i

  '単価に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
        DataCheke = "単価が未入力の商品があります。"
        Cells(16 + i, 11).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i

End Function

こちら、なにぶん、初心者のため、ご指示頂いた内容が、よく分かりませんでした。
申し訳ありませんが、何卒、よろしくお願いいたします。


  

【64230】Re:Elseの分岐
質問  初心者です  - 10/1/27(水) 10:52 -

引用なし
パスワード
   よろずや さん、ご親切にご回答をありがとうございます。
ですが、こちらも、同じ箇所の

実行時エラー'13':
型が一致しません。

のエラーが出てしまいました。

'----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value   ←そして、ここが黄色く選択されます

私の質問の仕方がまずかったかもしれません。
エラーの出ない、当初の本に書かれてあった、サンプルコードは、以下のとおりです。

'
'「登録」ボタンがクリックされたときの処理
'
Private Sub cmd登録_Click()
  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("J23").Value
  
  '初期値を代入する
  chkStr = ""
  
  '受付担当が未入力の場合
  If IsEmpty(Range("D3")) Then
    chkStr = "受付担当を入力してください。"
    Range("D3").Select
  
  '顧客番号が未入力の場合
  ElseIf IsEmpty(Range("D7")) Then
    chkStr = "顧客番号を入力してください。"
    Range("D7").Select
  
  '商品番号が未入力の場合
  ElseIf myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("C11").Select
  
  '数量に空欄がある場合
  Else
    For i = 1 To 10
      If Not IsEmpty(Cells(10 + i, 3)) Then    'i行目の商品番号
        If IsEmpty(Cells(10 + i, 8)) Then    'i行目の数量
          chkStr = "数量が未入力の商品があります。"
          Cells(10 + i, 8).Select
          
          'Forループを抜ける
          Exit For
        End If
      End If
    Next
  End If
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If
End Sub

よろずや さんのご指示のように、私が入れてみたコードは、以下の通りです。

Private Sub cmd登録・更新_Click()

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
  
  '初期値を代入する
  chkStr = ""
  
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    chkStr = "受付担当を入力してください。"
    Range("L11").Select
  
  '顧客名が未入力の場合
  ElseIf IsEmpty(Range("B6")) Then
    chkStr = "顧客番号を入力してください。"
    Range("B6").Select
  
  '発送日が未入力の場合
  ElseIf IsEmpty(Range("B9")) Then
    chkStr = "発送日を入力してください。"
    Range("B9").Select
  
  '品名が未入力の場合
  ElseIf myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("B17").Select
  
'数量に空欄がある場合
  Else
    For i = 1 To 18
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
        If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
          chkStr = "数量が未入力の商品があります。"
          Cells(16 + i, 9).Select

          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
          chkStr = "数量単位が未入力の商品があります。"
          Cells(16 + i, 10).Select
     
          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
          chkStr = "単価が未入力の商品があります。"
          Cells(16 + i, 11).Select
     
          'Forループを抜ける
          Exit For
        End If
      End If
     Next
  End If
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If

End Sub

私のやりたかった事は、たぶん、こんな感じで、Else以下からを分岐させたかったのですが、なにぶん、初心者のため、対応する閉じタグ?のような、Endコードでしょうか?それが、どこがどこに対応しているのかが、わかりません。
HTMLのタグのように、どれがどれに対応しているか、分かるようなビルダーみたいなソフトがあれば、いいんですが・・・

申し訳ありませんが、何卒、よろしくお願いいたします。

【64231】Re:Elseの分岐
回答  neptune  - 10/1/27(水) 11:02 -

引用なし
パスワード
   ▼初心者です さん:
こんにちは

マルっと提供されたソースで考えるのも方法ではありますが、
自分の書いたコードでデバッグした方が良いですよ。参考書で
解説もされているはずですし、これからも参考書を見るはずですから。

で、問題のエラーですが、
if とend if 
for 〜 と next
with と end with
等が対になっていない時に発生します。

要はif文を終わらせるend if がないとか、の単純なミスです。
この程度のソースなら上から順番にキチンと対になっているかを
確認した方が間違いなく早いです。数分で確認できるでしょう。


又、このようなミスはインデントをキチンとつける事で防げることが多いです。

【64233】Re:Elseの分岐
質問  初心者です  - 10/1/27(水) 11:34 -

引用なし
パスワード
   neptune さん、ご回答ありがとうございます。

>この程度のソースなら上から順番にキチンと対になっているかを
>確認した方が間違いなく早いです。

私も、そんな気がしていました。
コードが対になっているかいないか、知りたいのですが、方法が分かりません。
書いて頂いた回答を見ても、対になっているように見えますし・・・

>又、このようなミスはインデントをキチンとつける事で防げることが多いです。
インデントをつけるというのは、どうやるのでしょうか?
Microsoft Visual Basicで、一から入力していくと、いう事でしょうか?

HTMLみたいに、一方の開始タグを選択すると、もう片方の閉じタグを選択してくれるようなソフトはないのでしょうか?
探してみましたが、よく分かりませんでした。
VB用のソフトは、VBAでも使えるのでしょうか?

よろしくお願いします。

【64235】Re:Elseの分岐
回答  Hirofumi  - 10/1/27(水) 12:16 -

引用なし
パスワード
   ゴメンやり方だけで、内容まで見て居ませんでした

>実行時エラー '13':
>型が一致しません。
>
>のエラーが出てしまいました。
>
>'----- 入力データのチェック -----
>  '入力された明細データの件数を代入する
>  myMeiCnt = Range("L36").Value   ←そして、ここが黄色く選択されます

此れは、

  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数

と成っていて、myMeiCnt整数型変数に

  myMeiCnt = Range("L36").Value

で、文字列等数値以外を代入しようとしている為だと思います

  Dim myMeiCnt As Variant '「受注伝票」シートの明細データの件数

セルからの代入なので、Variant型の変数で受けて確認する様にすべきです

また、元のコードを良く見て行くととちゅうで「If」が無く、「Else」から書かれているので
「If」が無いとのエラーが出て居ます
尚、このコードは、入力の整合確認だと思いますが?
もしそうなら、全てを「ElseIf」で繋が無くても善いのでは?
と言う事が言いたいのですが?

なぜなら、上から条件が合わなければ、
最初のコードは条件不一致のPromptを持って不一致の処理に飛ばすと言うコードです
次のコードは、条件確認のコード部分をFanctionにして、条件が合わなければ戻り値として
条件不一致の場合、条件不一致のPromptを全て一致の場合""を呼び出し元に返します
この場合、条件不一致成らば、戻り値にそのコメントをセットしてFunctionを抜ければ善いので
「ElseIf」で繋ぐ必要はありません、因って「If」に対する、「ElseIf」、「Else」、「End If」の
関係を気にする必要が無いという事です

【64236】Re:Elseの分岐
発言  seg  - 10/1/27(水) 12:25 -

引用なし
パスワード
   ▼初心者です さん:

>インデントをつけるというのは、どうやるのでしょうか?
>Microsoft Visual Basicで、一から入力していくと、いう事でしょうか?

>HTMLみたいに、一方の開始タグを選択すると、もう片方の閉じタグを選択してくれるようなソフトはないのでしょうか?

VBAの自動インデント機能は、そこまで優秀ではありません。

私の場合は、インデントが出来ていない人のソースをインデントし直すために
秀丸でAutoIndentなるマクロを作成してました。

でも上記の様なフリーソフトは探せばありそうですが。

【64240】Re:Elseの分岐
お礼  初心者です  - 10/1/27(水) 13:53 -

引用なし
パスワード
   Hirofumi さん、ありがとうございます!!
おかげで動きました!

>myMeiCnt整数型変数に
>
>  myMeiCnt = Range("L36").Value
>
>で、文字列等数値以外を代入しようとしている為だと思います

という事で、L36は、エクセルのIF関数で、何も入力されていない場合には、空白を表示するようにしていた為でした。

ご説明頂いたことは、まったく分かりませんでしたが、メッセージボックスは、ポップアップ表示されるし、すごいの一言です。
ありがとうございました。

以下、動くようになったコードです。


Private Function DataCheke() As String

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数

  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value

  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    DataCheke = "受付担当を入力してください。"
    Range("L11").Select
    Exit Function
  End If

  '顧客名が未入力の場合
  If IsEmpty(Range("B6")) Then
    DataCheke = "顧客番号を入力してください。"
    Range("B6").Select
    Exit Function
  End If

  '発送日が未入力の場合
  If IsEmpty(Range("B9")) Then
    DataCheke = "発送日を入力してください。"
    Range("B9").Select
    Exit Function
  End If

  '品名が未入力の場合
  If myMeiCnt = 0 Then
    DataCheke = "明細データを入力してください。"
    Range("B17").Select
    Exit Function
  End If

  '数量に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
        DataCheke = "数量が未入力の商品があります。"
        Cells(16 + i, 9).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i

  '数量単位に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
        DataCheke = "数量単位が未入力の商品があります。"
        Cells(16 + i, 10).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i

  '単価に空欄がある場合
  For i = 1 To 18
    If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
      If IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
        DataCheke = "単価が未入力の商品があります。"
        Cells(16 + i, 11).Select
        'Forループを抜ける
'        Exit For
        Exit Function
      End If
    End If
  Next i

End Function

Private Sub cmd登録・更新_Click()

 Dim chkStr As String


  '入力漏れがある場合はプロシージャを抜ける
  chkStr = DataCheke
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
  End If

End Sub

【64241】Re:Elseの分岐
お礼  初心者です  - 10/1/27(水) 14:00 -

引用なし
パスワード
   よろずや さん、ありがとうございました!
Hirofumi さんに以下のご指摘を頂き、動くようになりました!

>myMeiCnt整数型変数に
>
>  myMeiCnt = Range("L36").Value
>
>で、文字列等数値以外を代入しようとしている為だと思います

という事で、L36は、エクセルのIF関数で、何も入力されていない場合には、空白を表示するようにしていた為でした。

まったく理解できていませんが、メッセージボックスは、ポップアップ表示されるし、すごいの一言です。
裏側はどんな風に書いても、おなじように動くなんて、不思議です。
本当にありがとうございました。

以下、動くようになったコードです。


'
'「登録・更新」ボタンがクリックされたときの処理
'
Private Sub cmd登録・更新_Click()

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
  
  '初期値を代入する
  chkStr = ""
  
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then
    chkStr = "受付担当を入力してください。"
    Range("L11").Select
  
  '顧客名が未入力の場合
  ElseIf IsEmpty(Range("B6")) Then
    chkStr = "顧客番号を入力してください。"
    Range("B6").Select
  
  '発送日が未入力の場合
  ElseIf IsEmpty(Range("B9")) Then
    chkStr = "発送日を入力してください。"
    Range("B9").Select
  
  '品名が未入力の場合
  ElseIf myMeiCnt = 0 Then
    chkStr = "明細データを入力してください。"
    Range("B17").Select
  
'数量に空欄がある場合
  Else
    For i = 1 To 18
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名
        If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量
          chkStr = "数量が未入力の商品があります。"
          Cells(16 + i, 9).Select

          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 10)) Then    'i行目の数量単位
          chkStr = "数量単位が未入力の商品があります。"
          Cells(16 + i, 10).Select
     
          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 11)) Then    'i行目の単価
          chkStr = "単価が未入力の商品があります。"
          Cells(16 + i, 11).Select
     
          'Forループを抜ける
          Exit For
        End If
      End If
     Next
  End If
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If
  
  '----- 入力データのチェック -----
  
End Sub

【64242】Re:Elseの分岐
質問  初心者です  - 10/1/27(水) 14:36 -

引用なし
パスワード
   neptune さん、seg さん、アドバイスをありがとうございます!
おかげさまで、プロシージャは動くようになったのですが、このままでは、毎回、質問しなければ、アレンジできないので、インデントについて、もう少し質問させてください。
「1.は1.’と対応」という風に、対応していると思うものに、番号を振ってみたのですが、合っていますか?
よろしくお願いします。


'
'「登録・更新」ボタンがクリックされたときの処理
'
Private Sub cmd登録・更新_Click()

  Dim chkStr As String  '入力チェックのメッセージ文
  Dim myRcdNum As Long  '現在のレコード番号
  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Integer    'カウンタ変数
  
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value
  
  '初期値を代入する
  chkStr = ""
  
  '担当者名が未入力の場合
  If IsEmpty(Range("L11")) Then            1.
    chkStr = "受付担当を入力してください。"
    Range("L11").Select               1.’
  
  '顧客名が未入力の場合
  ElseIf IsEmpty(Range("B6")) Then           2.
    chkStr = "顧客番号を入力してください。"     2.’
    Range("B6").Select
  
  '発送日が未入力の場合
  ElseIf IsEmpty(Range("B9")) Then           3.
    chkStr = "発送日を入力してください。"      3.’
    Range("B9").Select
  
  '品名が未入力の場合
  ElseIf myMeiCnt = 0 Then                4.
    chkStr = "明細データを入力してください。"      4.’
    Range("B17").Select
  
'数量に空欄がある場合
  Else                         ←要らない?
    For i = 1 To 18                      5.
      If Not IsEmpty(Cells(16 + i, 2)) Then    'i行目の品名 6.
        If IsEmpty(Cells(16 + i, 9)) Then    'i行目の数量 7.
          chkStr = "数量が未入力の商品があります。"
          Cells(16 + i, 9).Select

          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 10)) Then   'i行目の数量8.
単位
          chkStr = "数量単位が未入力の商品があります。" 8.’
          Cells(16 + i, 10).Select
     
          'Forループを抜ける
          Exit For
         ElseIf IsEmpty(Cells(16 + i, 11)) Then   'i行目の単価9.
          chkStr = "単価が未入力の商品があります。"    9.’
          Cells(16 + i, 11).Select
     
          'Forループを抜ける
          Exit For
        End If                      7.’
      End If                        6.’
     Next                          5.’
  End If                            1.’
  
  '入力漏れがある場合はプロシージャを抜ける
  If chkStr <> "" Then                 10.
    MsgBox chkStr, vbCritical, "登録エラー"
    Exit Sub
  End If                        10.’
  
  '----- 入力データのチェック -----
  
End Sub

【64243】Re:Elseの分岐
発言  Hirofumi  - 10/1/27(水) 14:42 -

引用なし
パスワード
   >ご説明頂いたことは、まったく分かりませんでしたが、メッセージボックスは、ポップアップ表示されるし、すごいの一言です。
>ありがとうございました。

説明が下手でごめんなさい?
全く解らないなら、ステップ実行して、良く元のコードと見比べて下さい

尚、余談ですが、以下のコメントアウトした変数宣言は使っていないので不要です
削除して下さい


Private Function DataCheke() As String

'  Dim chkStr As String  '入力チェックのメッセージ文
'  Dim myRcdNum As Long  '現在のレコード番号
'  Dim myMeiCnt As Integer '「受注伝票」シートの明細データの件数
  Dim myMeiCnt As Variant '「受注伝票」シートの明細データの件数
'  Dim tbEndRow As Long  '「TB_受注」シートの最後の行の行番号
'  Dim r As Integer    '「TB_受注」シートの書き込み先の行をカウント
  Dim i As Long    'カウンタ変数
 
  '----- 入力データのチェック -----
  '入力された明細データの件数を代入する
  myMeiCnt = Range("L36").Value

【64244】Re:Elseの分岐
お礼  初心者です  - 10/1/27(水) 15:03 -

引用なし
パスワード
   Hirofumi さん、ご訂正ありがとうございます。
私がポンツクなので、わからないのです、すみません!
よくよく調べたら、なるほど、Subプロシージャと、Functionプロシージャというのがあるんですね〜、なんとな〜〜〜〜く分かってきました。
奥が深いですね〜、がんばります!

3108 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free