Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
If分岐で条件が合致しても別の分岐に進んでしまう
投稿日時: 21/01/27 15:51:08
投稿者: だいふくもち

こちらのコミュニティを初めて利用させていただくVBAを勉強中の初心者です。
経験者様のお知恵をお借りすることができたらと思い、相談させていただきました。
 
現在、ユーザーフォームのコンボボックスで「請求月」と「請求日」を選択し、
そのふたつの条件に当てはまるデータを、2種類のうち片方の請求書テンプレートに転記する
といったマクロの作成に取り組んでおります。
 
例えば、ユーザーフォームで「1月」の「20日」を選択したら、
B社の「1月」の金額"150円"とその会社の情報"△△△"だけ
「住所あり」の請求書に転記されるといったものです。
 
連番 1月 2月 3月 4月 5月 内容 請求日 テンプレートの種類
-------------------------------------------------------
A社 200 250 300 300 空白 〇〇〇 10日 住所なし
B社 150 空白 500 空白 400 △△△ 20日 住所あり
C社 300 空白 100 200 500 □□□ 月末 住所なし
-------------------------------------------------------
 
しかし、以下のマクロを実行すると、「住所なし」にも関わらず
必ず「"\請求書ひな形_住所あり.xlsx"」に転記されてしまいます。
 
もし、以下のマクロをご覧になってミス等に気付かれた方がいらっしゃいましたら
お手数をお掛けしますが、問題点をご教授いただけませんでしょうか?
 
問題があると思われる箇所は、
If 連番.Offset(0, 9).Value = "住所なし" Then
の部分です。
 

Private Sub Cnd_Click()

    Dim 入力月 As String: 入力月 = ComboBox1.Text
    Dim 請求日 As String: 請求日 = ComboBox2.Text

    UserForm1.Hide

'以下、請求月の検索
    Dim 列 As Long
    列 = Worksheets("サンプル").Range("B1:F1").Find(What:=入力月).Column

'連番の数だけ以下の処理を繰り返す
    Dim 最終行 As Long
    最終行 = Worksheets("サンプル").Cells(Rows.Count, 1).End(xlUp).Row
    Dim 行 As Long
    For 行 = 2 To 最終行
        
        Dim 連番 As Range: Set 連番 = Worksheets("サンプル").Cells(行, 1)
        If Worksheets("サンプル").Cells(行, 列).Value = "" Or _
           連番.Offset(0, 7).Value <> 請求日 Then
        Else
                If 連番.Offset(0, 9).Value = "住所なし" Then
                    Workbooks.Open (ThisWorkbook.Path & _ 
                                          "\請求書ひな形_住所なし.xlsx")
                    ActiveWorkbook.Worksheets(1).Activate
                Else
                    Workbooks.Open (ThisWorkbook.Path & _ 
                                          "\請求書ひな形_住所あり.xlsx")
                    ActiveWorkbook.Worksheets(1).Activate
                End If
                
            Dim ブック As Workbook: Set ブック = Workbooks("テスト用.xlsm")
            Dim シート As Worksheet: Set シート = ActiveSheet
            
            With シート
                .Range("C24").Value = 連番
                .Range("Y24").Value = ブック.Worksheets("サンプル"). _
                                                      Cells(行, 列).Value
                .Range("E24").Value = 連番.Offset(0, 6).Value
            End With
        
            Dim 社名 As String
            社名 = ブック.Worksheets("サンプル").Cells(行, 1).Value
            
            Dim ファイル名 As String
            ファイル名 = ThisWorkbook.Path & "\" & 社名 & ".xlsx"
            
            ActiveWorkbook.SaveAs ファイル名
            ActiveWorkbook.Close          
        End If        
    Next 行 '次の行に進む

End Sub[b][code][/code]

回答
投稿日時: 21/01/27 16:08:35
投稿者: radames1000
メールを送信

Debug.Print 連番.Offset(0, 9).Value
として値を確認してみてはいかがでしょうか。
イミディエイトウィンドウに値が表示されます。
 
連番.Offset(0, 8).Valueが正しいように見えます。

投稿日時: 21/01/27 16:30:18
投稿者: だいふくもち

radames1000様、まさかこちらでもお会いできるとは思いませんでした!
(某エンジニア質問交流サイトでお世話になったことがある者です)
迅速かつ正確なご指摘、毎回ありがとうございます!
 
まさしくご指摘の通りでオフセットをA1セルから数えておりました…
毎度ながら初歩的なミスを…お恥ずかしい限りです…
変な角度から色々と試しておりました…
 
(Debug.Printに関してもアドバイスいただきありがとうございました!
「Debug.Printをするとオブジェクトが必要です」と表記されるため
イミディエイトウィンドウを使用するのを諦めておりました…)