2016-04-24 16 views
0

Перемещение данных расходов из столбцов K: M в соответствующие столбцы N: Y (январь, февраль, март и т. Д.) На основе даты (месяца) в столбце AA, но любые будущие даты в столбце AA заполняют данные в будущем (вперед), а не исторически по желанию?Перемещение данных в соседние столбцы на основе значения даты (месяца)

Sub MoveData() 
Dim vals As Range, val As Range, colOffset As Integer 
Set vals = Range("K2:K" & Range("K2").End(xlDown).Row) 

For Each val In vals 

If val > 0 Then 
    colOffset = VBA.month(val.offset(0, 16)) 
    val.offset(0, colOffset) = val 
    val.offset(0, colOffset + 1) = val.offset(0, 1) 
    val.offset(0, colOffset + 2) = val.offset(0, 2) 
End if 

Next val 
End Sub 

Пример! enter image description here

+0

Пожалуйста показать пример ваших данных. –

+0

Я посмотрю, как только я увижу пример данных. – CaffeinatedCoder

+0

вам нужно переместить данные из 3 столбцов («K», «L», «M») в диапазоне от 12 (от столбцов «N» до «Y») в зависимости от месяца в столбце «AA». и у вас есть данные в столбце «Z». 1) - это месяц, чтобы локализовать первую ячейку для перемещения данных? 2) если да, то как обрабатывать случай, когда месяц составляет> 10, и поэтому ваши движущиеся данные будут перекрывать данные столбцов «Z» и «AA»? 3) - данные в столбце «Z», значимые для движущейся активности? – user3598756

ответ

1

отредактирован после дальнейших спецификаций OP в

не уверен, что я понял логику вам нужно, но попробовать этот

Option Explicit

Sub MoveData() 
Dim colOffset As Integer, dataCols As Long 
Dim datesRng As Range, dateRng As Range, valsRng As Range 

With ThisWorkbook.Worksheets("expenses") '<== change it to your actual sheet name 
    Set datesRng = .Range("AA2:AA" & .Cells(.rows.Count, "AA").End(xlUp).Row).SpecialCells(xlCellTypeConstants, xlNumbers) 'process rows as long as there's a "Transition Date" 

    For Each dateRng In datesRng 
     With .Range("K" & dateRng.Row) 
      dataCols = WorksheetFunction.CountA(.Resize(, 3)) 
      Set valsRng = .Offset(, 3 - dataCols).Resize(, dataCols) 
     End With 

     colOffset = WorksheetFunction.Min(Month(dateRng), Month(Date)) - dataCols 'limit month offset to current one and set it back to the numbers of values 
     If colOffset >= 0 Then 
      .Range("N" & dateRng.Row).Offset(, colOffset).Resize(, dataCols).Value = valsRng.Value 
      .Range("N" & dateRng.Row).Offset(, colOffset).Value = .Range("N" & dateRng.Row).Offset(, colOffset) - .Range("J" & dateRng.Row).Value 
     Else 
      'some K-L columns data would be overwritten!! 
     End If 

    Next dateRng 
End With 

End Sub 
+0

Отлично работает! Еще один вопрос спрашивает .... Может ли старейший из 3 значений перемещаться в столбцах N: Y в макросе перемещения с уменьшением на числовое значение, которое у меня есть в столбце J? Другими словами, может ли первое доступное значение, отраженное в столбцах N: Y, каким-то образом зависеть от значения в столбце J. – Shrewd1

+0

см. Отредактированный ответ. – user3598756

+0

Он удаляет значения, расположенные в столбце J, но не в течение самого раннего месяца, когда отображаются данные перемещения (Ie: самый первый (самый левый) столбец в диапазоне N: Y, который больше нуля) – Shrewd1