- ベストアンサー
Excel VBAで日付けの条件付き仕訳を行う方法
- Excel VBAを使用して、日付けの条件に基づいて仕訳を行う方法を教えてください。
- 特定の列の日付けを確認し、指定の日付以前の行には「EOL」と入力し、指定の日付範囲内の行には「現行品」と入力する方法を教えてください。
- また、条件に合致しない入力や空欄の場合には「N/A」と入力する方法も教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下でいかがですか Sub Example() Dim MyLastRow As Long, MyLastColumn As Long Dim i As Long MyLastColumn = Cells(4, Columns.Count).End(xlToLeft).Column MyLastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 5 To MyLastRow If Not IsDate(Cells(i, "E").Text) Then Cells(i, MyLastColumn + 1).Value = "N/A" ElseIf Cells(i, "E").Value2 <= Cells(1, "G").Value2 Then Cells(i, MyLastColumn + 1).Value = "EOL" ElseIf Cells(i, "E").Value2 > Cells(1, "G").Value2 And Cells(i, "E").Value2 <= Cells(2, "G").Value2 Then Cells(i, MyLastColumn + 1).Value = "現行品" Else Cells(i, MyLastColumn + 1).Value = "N/A" End If Next End Sub
その他の回答 (3)
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答No.1です。 もし判定をIf / Elseif/ Elseでやる場合には、最初に If 「日付ではない場合」Or「現行品の最終日よりも後の場合」 Then という構文使って”N/A”となる場合の判定と処理を先に行ってしまい、続けて Elseif 「EOL最終日以前」 Then という構文使って”EOL”となる場合の判定と処理を行い、最後に Else を使って上記のどれにも該当しない場合、即ち"現行品"となる 「日付である場合」で尚且つ「EOL最終日以降~現行品の最終日以前の場合」 の処理を行う様にすれば良い訳です。 Sub QNo9222033_Excel_VBA_日付けでIF_Else仕訳_別法() Const SearchColumn = "E" '発売日が入力されているの列の列番号 Const ItemRow = 4 '表中で項目名が入力されている行の行番号 Dim InputColumn As Long, LastRow As Long, i As Long, buf As Variant, temp As Variant _ , DateCell(1) As Range, OutputString(2) As String, LastDate(1) As Variant Set DateCell(0) = Range("G1") 'EOLの最終日が入力されているセル Set DateCell(1) = Range("G2") '現行品の最終日が入力されているセル OutputString(0) = "N/A" 'EOLでも現行品でもない場合に書き込む値 OutputString(1) = "EOL" 'EOLの場合に書き込む値 OutputString(2) = "現行品" '現行品の場合に書き込む値 For i = 0 To 1 LastDate(i) = DateCell(i).Value If Not IsDate(LastDate(i)) Then MsgBox DateCell(i).Address(False, False) & "セルに日付が入力されていません。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Next i InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(SearchColumn).column Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow temp = Range(SearchColumn & i).Value If Not IsDate(temp) Or temp > LastDate(1) Then buf = OutputString(0) ElseIf temp <= LastDate(0) Then buf = OutputString(1) Else buf = OutputString(2) End If Cells(i, InputColumn).Value = buf Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub
お礼
ありがとうございます。 また類似した質問をすると思いますが、よろしくお願いいたさいます。 いつもありがとうございます。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは IF/Elseに拘らなければ、 Sub test() Dim c As Long c = WorksheetFunction.CountA(Rows(4)) With Range("A5", Range("A" & Rows.Count).End(xlUp)).Offset(, c) .Formula = "=IF(OR($E5>$G$2,$E5=""""),""N/A"",IF($E5<=$G$1,""EOL"",""現行品""))" .Value = .Value End With End Sub とかでも。
お礼
ありがとうございます。 これは短くていいですね。 勉強課題として保管しておきます。
- kagakusuki
- ベストアンサー率51% (2610/5101)
一例としては次の様なVBAマクロとなります。 Sub QNo9222033_Excel_VBA_日付けでIF_Else仕訳() Const SearchColumn = "E" '発売日が入力されているの列の列番号 Const ItemRow = 4 '表中で項目名が入力されている行の行番号 Dim InputColumn As Long, LastRow As Long, i As Long, buf As Variant, temp As Variant _ , DateCell(1) As Range, OutputString(2) As String, LastDate(1) As Variant Set DateCell(0) = Range("G1") 'EOLの最終日が入力されているセル Set DateCell(1) = Range("G2") '現行品の最終日が入力されているセル OutputString(0) = "N/A" 'EOLでも現行品でもない場合に書き込む値 OutputString(1) = "EOL" 'EOLの場合に書き込む値 OutputString(2) = "現行品" '現行品の場合に書き込む値 For i = 0 To 1 LastDate(i) = DateCell(i).Value If Not IsDate(LastDate(i)) Then MsgBox DateCell(i).Address(False, False) & "セルに日付が入力されていません。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Next i InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(SearchColumn).column Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow temp = Range(SearchColumn & i).Value If Not IsDate(temp) Then temp = "" Select Case temp Case Is <= LastDate(0) buf = OutputString(1) Case LastDate(0) + 1 To LastDate(1) buf = OutputString(2) Case Else buf = OutputString(0) End Select Cells(i, InputColumn).Value = buf Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub
お礼
ありがとうございます。 Set DateCell(0) ,OutputString(0)のところが、わたしの理解が申込し進まないと応用が難しそうです。 MsgBoxは取り入れさせていただきました。
お礼
ありがとうございました。 実際の処理はこのコードをベースに手を加えて使用させていただきました。 くせがないコードで、理解しやすかったです。