2016-03-18 3 views
0

Я пытаюсь обнаружить и обработать «сбрасывание» в моих данных. Данные должны постоянно увеличиваться, но иногда датчик любит сбросить до гораздо более низкого значения. Я хочу их обнаружить и исправить, суммируя предыдущие значения с текущим значением, чтобы получить текущее значение.Перемещение по ячейкам и их перезаписи при необходимости в 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. Я не могу понять, почему. Есть идеи?

+1

Вы пытались отлаживать код VBA шаг за шагом или хотя бы добавлять дополнительную обратную связь, используя 'Debug.Print', например:' Debug.Print 'для i = "& i &" rds value "& Worksheets (rds) .Range (RawColumn & i) .Value & "по сравнению с" & Worksheets (rds) .Range (RawColumn & i) .Value' и т. Д. Если вы разместите достаточное количество из них, вы сможете увидеть, когда код когда-либо вводится в 'If' (или объяснить почему нет) и т. д. – Ralph

ответ

1

Простой опечатка:

ваша линия (обратите внимание, что обе стороны < одинаковы)

If Worksheets(rds).Range(RawColumn & i).Value < _ 
    Worksheets(rds).Range(RawColumn & i).Value Then 

должен быть

If Worksheets(rds).Range(RawColumn & i).Value < _ 
    Worksheets(rds).Range(RawColumn & i - 1).Value Then 
+0

Это определенно было частью этого. Я получил некоторую помощь в excel subreddit, который оказался правильным решением. Я отправлю его в качестве ответа на этот вопрос. – ijustlovemath

0

После опечатка @ Крис Нильсен, и с некоторыми работа в this thread, окончательный (рабочий) скрипт находится здесь:

Sub ProcessData_test(ByVal RawColumn As String, ByVal ProcessedColumn As String) 

    Dim NumRows As Integer 
    Dim ResetValue As Integer 

    Const ps As String = "test2" 
    Const rds As String = "test1" 

    With Sheets(rds) 
     NumRows = .Range(RawColumn & .Rows.Count).End(xlUp).Row 
    End With 
    'MsgBox NumRows 
    ResetValue = 0 
    'First Row 
    Worksheets(ps).Range(ProcessedColumn & 1).Value = Worksheets(rds).Range(RawColumn & 1).Value 

    'All other rows. 
    For i = 2 To NumRows 
     If Worksheets(rds).Range(RawColumn & i).Value >= Worksheets(rds).Range(RawColumn & i - 1).Value Then 
      Worksheets(ps).Range(ProcessedColumn & i).Value = Worksheets(rds).Range(RawColumn & i).Value + ResetValue 
     Else 
      ResetValue = Worksheets(ps).Range(ProcessedColumn & i - 1).Value 
      Worksheets(ps).Range(ProcessedColumn & i).Value = Worksheets(rds).Range(RawColumn & i).Value + ResetValue 
     End If 
    Next i 

End Sub 
Смежные вопросы