Я пытаюсь обнаружить и обработать «сбрасывание» в моих данных. Данные должны постоянно увеличиваться, но иногда датчик любит сбросить до гораздо более низкого значения. Я хочу их обнаружить и исправить, суммируя предыдущие значения с текущим значением, чтобы получить текущее значение.Перемещение по ячейкам и их перезаписи при необходимости в VBA
Пример:
1
2
5
10
11
100
150
2
3
5
Должно быть:
1
2
5
10
11
100
150
152
153
155
Вот реализация Python, который работал для меня:
def process(arr):
max_before_reset = 0
reset_detected = False
old = arr[:]
for i, e in enumerate(old): # enumerate contains original array
if i == 0:
continue
if e < old[i-1]:
print '\t', e, old[i-1]
max_before_reset = arr[i-1]
reset_detected = True
if(reset_detected):
arr[i] = old[i] + max_before_reset
print old
return arr
a = [97, 99, 100, 2, 3, 5, 6, 4, 3];
print process(a)
Это должно быть сделано в VBA, так что я взял выстрел у него:
Sub ProcessData_test(ByVal RawColumn As String, ByVal ProcessedColumn As String)
Dim NumRows As Integer
Dim MaxBeforeReset As Integer
Dim ResetDetected As Boolean
Const ps As String = "test2"
Const rds As String = "test1"
MaxBeforeReset = 0
ResetDetected = False
With Sheets(rds)
NumRows = .Range(RawColumn & .Rows.Count).End(xlUp).Row
End With
'MsgBox NumRows
For i = 1 To NumRows
If i = 1 Then
Else
If Worksheets(rds).Range(RawColumn & i).Value < Worksheets(rds).Range(RawColumn & i).Value Then
MaxBeforeReset = Worksheets(ps).Range(ProcessedColumn & (i - 1)).Value
ResetDetected = True
End If
If ResetDetected Then
Worksheets(ps).Range(ProcessedColumn & i).Value = Worksheets(rds).Range(RawColumn & i).Value + MaxBeforeReset
End If
End If
Next i
End Sub
Sub Test()
Dim a As String, b As String
a = "A"
b = "A"
Call ProcessData_test(a, b)
End Sub
Но по какой-то причине он не модифицирует ячейки на листе test2. Я не могу понять, почему. Есть идеи?
Вы пытались отлаживать код VBA шаг за шагом или хотя бы добавлять дополнительную обратную связь, используя 'Debug.Print', например:' Debug.Print 'для i = "& i &" rds value "& Worksheets (rds) .Range (RawColumn & i) .Value & "по сравнению с" & Worksheets (rds) .Range (RawColumn & i) .Value' и т. Д. Если вы разместите достаточное количество из них, вы сможете увидеть, когда код когда-либо вводится в 'If' (или объяснить почему нет) и т. д. – Ralph