Мне нужна помощь с этим VBA. Заранее спасибо.

Я хочу выбрать диапазон (значений, весь столбец) для значений: FirstDate , EndDate и номер . Мой VBA:

Sub DateTest()
    Dim FirstDate As Date    ' Declare variables.
    Dim IntervalType As String
    Dim Number As Integer
    Dim EndDate As Date
    Dim TempDate As Date
    Dim i As Integer

    IntervalType = "m" ' "m" specifies MONTHS as interval.
    FirstDate = Cells(1, 1).Value
    EndDate = Cells(1, 2).Value
    Number = Cells(1, 3).Value  ' "Number" For the syntax DateAdd.

    ' If the number is not greater than zero an infinite loop will happen.
    If Number <= 0 Then
        MsgBox "Number needs to be greater than 0", vbCritical
        Exit Sub
    End If

    i = 1
    Do Until TempDate = EndDate
       If i <= 1 Then
           TempDate = DateAdd(IntervalType, Number, FirstDate)
       Else
           TempDate = DateAdd(IntervalType, Number, TempDate)
        End If
        i = i + 1
        Debug.Print i
    Loop
    Range("D1").Value = i - 1
End Sub

Как я уже писал ранее, я хочу запускать свой макрос не только для 1-й ячейки (в настоящее время макрос отлично работает для значения (1,1) (1,2) (1,3) ), так как Вы можете увидеть выше для FirstDate , EndDate и Number . Я хочу использовать для всех дат в: Столбец1 , Столбец2 , Столбец3

Я сделал некоторые изменения, например, для EndDate:

EndDate = Format(.Cells(lRow, 2).Value)

Не работает, возьмите вейл для 1 ячейки, а остальные значения в столбце игнорируются.

Я старался:

    FirstDate = Range("A1:A20").Select

    EndDate = Range("B1:B20").Select

    Number = Range("C1:C20").Select

Но я получаю: «Число должно быть больше 0»

1
Lorenzo Castagno 19 Авг 2019 в 15:20

2 ответа

Лучший ответ

Решено, см. ниже:

 Sub DateTest()
    Dim FirstDate As Date    ' Declare variables.
    Dim IntervalType As String
    Dim Number As Integer
    Dim EndDate As Date
    Dim TempDate As Date
    Dim i As Integer

    IntervalType = "m" ' "m" specifies MONTHS as interval.

    With ActiveWorkbook.Worksheets(1)
    lLastRow = .UsedRange.Rows.Count

    For lRow = 1 To lLastRow

    FirstDate = Format(.Cells(lRow, 1).Value, "YYYY-MM-DD")
    EndDate = Format(.Cells(lRow, 2).Value, "YYYY-MM-DD")
    Number = .Cells(lRow, 3).Value

    ' If the number is not greater than zero an infinite loop will happen.
    If Number <= 0 Then
        MsgBox "Number needs to be greater than 0", vbCritical
        Exit Sub
    End If

    i = 1
    Do Until TempDate = EndDate
       If i <= 1 Then
           TempDate = DateAdd(IntervalType, Number, FirstDate)
       Else
           TempDate = DateAdd(IntervalType, Number, TempDate)
        End If
        i = i + 1
        Debug.Print i
    Loop
    Cells(lRow, 4).Value = i - 1
    'Range("D1").Value = i - 1

      Next
      End With

    End Sub
0
Lorenzo Castagno 20 Авг 2019 в 09:50

Есть, вероятно, 2 проблемы в коде:

  • Чтение из Excel
  • Бизнес Логика

Что касается чтения из рабочих листов, убедитесь, что родительский рабочий лист всегда упоминается. Например, вместо записи FirstDate = Cells(1, 1).Value пишите FirstDate = Worksheets("DatesWorksheetName")Cells(1, 1).Value. Кроме того, это тема, которую необходимо прочитать для VBA - Как избежать использования Выберите в Excel VBA.

Для бизнес-логики замените значение, считанное с листа, на некоторые стандартные значения и попробуйте, пока оно не заработает:

Sub TestMe()

    Dim tempDate As Date
    Dim endDate As Date
    Dim firstDate As Date

    firstDate = #5/19/2019#
    endDate = #11/19/2019#
    tempDate = #8/19/2019#

    Dim i As Long: i = 1
    Dim intervalType As String: intervalType = "m"
    Dim number As Long: number = 5

    Do Until tempDate >= endDate
        If i <= 1 Then
           tempDate = DateAdd(intervalType, number, firstDate)
        Else
           tempDate = DateAdd(intervalType, number, tempDate)
        End If
        i = i + 1
        Debug.Print i
    Loop

End Sub
1
Vityata 19 Авг 2019 в 12:42