Excel VBA - Ошибка автоматического заполнения тренда
У меня есть стек данных, как это:
Tidal Time Tidal Height
00:00:00 4.40
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00 2.00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00 4.50
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00 2.10
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00 4.40
Затем, используя этот код, я изменяю значения, начиная снизу:
Sub TrendValues()
Set LastCell = Sheets("Vessels").Cells(ActiveSheet.Rows.Count, 2).End(xlUp)
Do While LastCell.Row > 2
If LastCell.Offset(-1, 0) = "" Then
Set NonEmptyCellAboveLastCell = LastCell.End(xlUp)
Else
Set NonEmptyCellAboveLastCell = LastCell.Offset(-1, 0)
End If
If NonEmptyCellAboveLastCell.Row > 1 Then
Set RangeToFill = Sheets("Vessels").Range(NonEmptyCellAboveLastCell, LastCell)
RangeToFill.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Trend:=True
If NonEmptyCellAboveLastCell.Offset(-1, 0) = "" Then
Set LastCell = NonEmptyCellAboveLastCell.End(xlUp)
Else
Set LastCell = NonEmptyCellAboveLastCell.Offset(-1, 0)
End If
Else
Set LastCell = Sheets("Vessels").Range("B1")
End If
Loop
End Sub
Это заполняет таблицу так:
Tidal Time Tidal Height
00:00:00 4.40
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00 2.00
07:00:00 2.50
08:00:00 3.00
09:00:00 3.50
10:00:00 4.00
11:00:00 4.50
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00 2.10
19:00:00 2.56
20:00:00 3.02
21:00:00 3.48
22:00:00 3.94
23:00:00 4.40
Так что это обычно работает только частично, и я не совсем уверен, почему.
Как вы можете судить по таблице, она просто решает вызвать разрывы, а не тренд для меня вообще. Код работает, если в столбце B сверху или снизу нет значения. Но в некоторых случаях мне нужно автоматически заполнить начальное и конечное значения, и именно здесь код ломается.
И чтобы быть справедливым, я должен выполнить этот код дважды, чтобы правильно заполнить всю таблицу независимо от того, заполнены ли поля начала и конца в столбце B или нет. Мне не хватает всей функции кода, и поэтому я понятия не имею, как редактировать, чтобы решить проблему.
Кто-нибудь видит какие-то явные и очевидные проблемные области и может предложить дополнения или вычитания к коду, чтобы это исправить?
Даже объяснение функции кода по шагам было бы полезно.
Заранее спасибо!
2 ответа
Я переписал вашу рутину по-другому, кажется, работает нормально. Некоторая обработка ошибок наверняка может быть добавлена ... до вас.
Sub TrendValues()
Dim rng As Range, ar As Range, toFill As Range
Set rng = Intersect(Range("a1").CurrentRegion, Range("B:B")).SpecialCells(xlCellTypeBlanks)
For Each ar In rng.Areas
'add 1 cell above and one below
Set toFill = ar.Offset(-1, 0).Resize(ar.Rows.Count + 2, 1)
toFill.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Trend:=True
Next ar
End Sub
Sub ErrorFix()
Dim Bounds As Range
Set Bounds = Range("A1").CurrentRegion
Dim c As Range
Set c = Range("B2")
Do While c.Row < Bounds.Rows(Bounds.Rows.Count).Row
If IsEmpty(c.Offset(1, 0).Value) Then
Dim RangeToFill As Range
Set RangeToFill = Application.Intersect(Range(c, c.End(xlDown)), Bounds)
RangeToFill.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Trend:=True
Set c = RangeToFill.Cells(RangeToFill.Cells.Count)
Else
Set c = c.End(xlDown)
End If
Loop
End Sub
Это удовлетворило требования вопроса.