Мне нужна помощь с этим 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»
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
Есть, вероятно, 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
Похожие вопросы
Связанные вопросы
Новые вопросы
excel
Только для вопросов по программированию объектов или файлов Excel или по разработке формул. Вы можете комбинировать тег Excel с тегами и вопросами VBA, VSTO, C#, VB.NET, PowerShell, OLE и другими тегами и вопросами, связанными с программированием, если это применимо. НЕ используйте с другим программным обеспечением для работы с электронными таблицами, например [google-sheets].