0

私のコードは、ユーザーがExcelシートに入力した開始日と終了日を見つけて、ユーザーが入力した日付の期間の製品変換の数を見つけることができるようにすることです. ユーザーが行に存在する開始日と終了日を入力した場合は問題ありません。問題は、ユーザーが行に存在しない開始日と終了日を入力すると、製品コンバージョン数 = 0 になることです。たとえば、私のデータは 2013 年 1 月 2 日から 2013 年 1 月 28 日までの日付で構成されており、10 個の製品が変換されています。しかし、ユーザーが開始日 = 1/1/2013、終了日 = 1/29/2013 (行に存在しない日付) を入力すると、変換の数は 0 です。私がやりたいことは、日付がそうでない場合です行に存在する場合、プログラムは自動的に最も近い日付にジャンプします。ここに私のコードがあります:

Dim rowFound As Variant
Dim startDate As String, endDate As String, startDateRow As Long
Dim endDateRow As Long, product As String, convNo As Long

Set ws2 = ActiveWorkbook.Sheets("Products Conversion")
Set wsMain = ActiveWorkbook.Sheets("Main Menu")

ws2.Activate
lastrow2 = ws2.Range(Range("A1"), Range("A65535").End(xlUp)).count ' find lastrow
wsMain.Activate

startDate = Me.txtStartDate.Value

endDate = Me.txtEndDate.Value

On Error Resume Next
If txtStartDate <> "" Or txtEndDate <> "" Then

For i = 3 To lastrow2

    If CDate(startDate) = ws2.Cells(i, 1).Value Then
        startDateRow = i   ' row where start date is
        Exit For
    End If

Next


For j = lastrow2 To 3 Step -1

    If CDate(endDate) = ws2.Cells(j, 1).Value Then
        endDateRow = j      ' row where end date is
        Exit For
    End If

Next

For k = startDateRow To endDateRow - 1

    product = ws2.Cells(k, 6).Value

    If product <> ws2.Cells(k + 1, 6).Value Then
        convNo = convNo + 1 'number of conversion
    End If

Next

Else
MsgBox "Please enter both date!", vbOKOnly + vbCritical
End If

Me.txtConvNo.Value = convNo
4

1 に答える 1

1

ついに私はそれを理解することができました。いくつかのループを追加するだけです

Dim rowFound As Variant
Dim startDate As String, endDate As String, startDateRow As Long
Dim endDateRow As Long, product As String, convNo As Long

Set ws2 = ActiveWorkbook.Sheets("Products Conversion")
Set wsMain = ActiveWorkbook.Sheets("Main Menu")

ws2.Activate
lastrow2 = ws2.Range(Range("A1"), Range("A65535").End(xlUp)).count ' find lastrow
wsMain.Activate

startDate = Me.txtStartDate.Value

endDate = Me.txtEndDate.Value

On Error Resume Next
If txtStartDate <> "" Or txtEndDate <> "" Then

resume1:
For i = 3 To lastrow2

    If CDate(startDate) = ws2.Cells(i, 1).Value Then
        startDateRow = i ' row where start date is
        Exit For
    End If

Next

If startDateRow = 0 Then 'date entered not found in the row
    startDate = CDate(startDate) + 1
    GoTo resume1
End If

resume2:
For j = lastrow2 To 3 Step -1

    If CDate(endDate) = ws2.Cells(j, 1).Value Then
        endDateRow = j ' row where end date is
        Exit For
    End If


Next 

If endDateRow = 0 Then 'date entered not found in the row
    endDate = CDate(endDate) - 1
    GoTo resume2
End If

Next

For k = startDateRow To endDateRow - 1

product = ws2.Cells(k, 6).Value

If product <> ws2.Cells(k + 1, 6).Value Then
    convNo = convNo + 1 'number of conversion
End If

Next

Else
MsgBox "Please enter both date!", vbOKOnly + vbCritical
End If

Me.txtConvNo.Value = convNo
vba excel-vba 
于 2013-05-09T09:31:06.160 に答える