2015-06-03 3 views
4

На данный момент у меня есть фрагмент кода, который может принимать даты начала и окончания, и перечислять все даты в этом диапазоне дат. Это позволяет мне взять следующую таблицу и разделить ее на отдельные даты.VBA macro - Указание нового рабочего листа для данных, созданных

|Name   | StartDate | EndDate 
|Bob The builder | 20/05/2015 | 24/05/2015 
|Tiny Tim  | 08/06/2015 | 09/06/2015 
|Dolly Parton | 06/08/2015 | 08/08/2015 

Однако на данный момент он сбрасывает данные, созданные непосредственно под существующую таблицу, как это:

|Name   | StartDate | EndDate 
|Bob The builder | 20/05/2015 | 24/05/2015 
|Tiny Tim  | 08/06/2015 | 09/06/2015 
|Dolly Parton | 06/08/2015 | 08/08/2015 
|Bob The builder | 20/05/2015 | 
|Bob The builder | 21/05/2015 | 
|Bob The builder | 22/05/2015 | 
|Bob The builder | 23/05/2015 | 
|Bob The builder | 24/05/2015 | 
|Tiny Tim  | 08/06/2015 | 
|Tiny Tim  | 09/06/2015 | 
|Dolly Parton | 06/08/2015 | 
|Dolly Parton | 07/08/2015 | 
|Dolly Parton | 08/08/2015 | 

Я попытался несколько способов, чтобы пытаться получить его, чтобы найти его на новом листе и каждый раз, когда я гадаю с кодом, он терпит неудачу. Также обратите внимание, что копирование сгенерированных данных не будет работать, так как каждый раз, когда я запускаю этот макрос, исходная таблица будет иметь другое количество строк. Это код, который я использую:

Sub SeparateDateRange() 

Dim Ws As Worksheet 
Dim nCol As Integer 


Set Ws = ActiveSheet 

nCol = 1 

Application.ScreenUpdating = False 


For i = 1 To ActiveSheet.Cells(Rows.Count, nCol + 2).End(xlUp).Row - 1 Step 1 

    For j = 0 To Ws.Cells(i + 1, nCol + 2).Value - Ws.Cells(i + 1, nCol + 1).Value Step 1 

    With Ws.Cells(Ws.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) 
    For k = 0 To nCol - 1 Step 1 
     .Offset(0, k).Value = Ws.Cells(i + 1, k + 1).Value 
    Next k 

    .Offset(0, nCol).Value = DateSerial(Year(Ws.Cells(i + 1, nCol + 1).Value), Month(Ws.Cells(i + 1, nCol + 1).Value), Day(Ws.Cells(i + 1, nCol + 1).Value) + j) 
    End With 

    Next j 
Next i 

Application.ScreenUpdating = True 

End Sub 

ответ

2

Вопрос ваш испытывают исходит из того, что вы ставите сгенерированные значения по смещению Ws которые вы определили в качестве активного листа Set Ws = ActiveSheet

Это отражено здесь:

With Ws.Cells(Ws.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) 
For k = 0 To nCol - 1 Step 1 
    .Offset(0, k).Value = Ws.Cells(i + 1, k + 1).Value 
Next k 

    .Offset(0, nCol).Value = DateSerial(Year(Ws.Cells(i + 1, nCol + 1).Value), Month(Ws.Cells(i + 1, nCol + 1).Value), Day(Ws.Cells(i + 1, nCol + 1).Value) + j) 
End With 

Вместо использования активного листа, определяют новый лист для вставки значения в и ссылаться на него в вашем With, например:

Dim newWS as worksheet 
Set newWS = Sheets("SheetName") 

With newWS.Cells(newWS.Cells(newWS.Rows.Count, 1).End(xlUp).Row + 1, 1) 

Это должно поставить вас на правильный путь.

+1

Я согласен, что этот ответ должен указывать OP в правильном направлении. Однако 'Rows.Count' относится к ActiveSheet, а не к' newWS'. Это не вызовет проблем как таковых, поскольку все листы имеют одинаковое количество строк, но они неаккуратные. 'Rows.Count' должно предшествовать' newWS.'. –

+0

Хорошая добыча Рейчел Хеттингер. Я отредактировал, чтобы задуматься. – daytonrazorback

+0

Спасибо за ответ @daytonrazorback, отлично работает – Holly

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