Обновить начальную дату на один день до даты окончания, когда будут зарегистрированы соответствующие данные за каждый день в диапазоне дат
Я пытаюсь обновить дату и одновременно записать каждую отдельную дату и ее соответствующий счет z на отдельном листе. Мой файл excel уже настроен так, что с изменением даты соответствующие значения z для обновления дня. Может ли кто-нибудь помочь мне написать код VBA, который компилирует дату с соответствующими данными за каждый день в диапазоне дат? В идеале, я хочу, чтобы код корректировался для даты начала и окончания даты, когда он изменяется непосредственно на листе excel. К сожалению, я не могу обновить дату на один день, не предварительно настроив ее на определенный день, поскольку для «следующей» части кода возникает ошибка, требующая ошибки.
Sub compliedataloop() Dim wb As Workbook Set wb = ActiveWorkbook Dim wsprecip As Worksheet Set wsprecip = wb.Worksheets("Precip") Dim wshistoricaldata As Worksheet Set wshistoricaldata = wb.Worksheets("Historical Data") Dim nextday As String Set nextday = wb.wsprecip.Range("CJ4") wb.wshistoricaldata.Range("C4").Activate wb.wsprecip.Range("CJ4").Activate ActiveCell.Copy wb.wshitoricaldata.Activate ActiveCell.PasteSpecial ActiveCell.Offset(1, 0).Activate wb.wsprecip.Range("CN37").Activate ActiveCell.Copy wb.wshistoricaldata.Activate ActiveCell.PasteSpecial ActiveCell.Offset(-1, 1).Activate wb.wsprecip.Range("CJ4").Activate nextday.DateAdd = ("d") Do While Enddate = False 'select, copy and paste first Date from cell CJ5 in "precip" Worksheet to "historicaldata" worksheet wb.wsprecip.Range(CJ4).Activate ActiveCell.Copy wb.wshistoricaldata.Activate ActiveCell.PasteSpecial ActiveCell.Offset(1, 0).Activate wb.wsprecip.Range("CJ4").Activate nextday.DateAdd = ("d") 'copy new z-score for new date and paste data into "historicaldata" worksheet wbs.wsprecip.Range("CN37").Activate ActiveCell.Copy wb.wshistoricaldata.Activate ActiveCell.Offset(0, 1).Activate ActiveCell.PasteSpecial 'reset positioning for next day's date in one cell above and to the right ActiveCell.Offset(-1, 1).Activate If Enddate = 2 / 28 / 2018 Then Enddate = True End If End Sub
- Дата в Excel не признана в качестве даты
- Создайте вектор времени из импорта excel
- Дата от текстового формата до формата даты в VBA
- Как рассчитать финансовый день года в Excel?
- Управление данными из текстового поля и значений инвертированного дня / месяца
- Разрешение VBA конвертировать различные форматы дат
- Непоследовательное форматирование даты при импорте CSV через макрос
- Excel Time Forumula
- Как всегда форсировать определенный формат даты в вставленной ячейке?
- Разница между «ММ», стоящей в течение месяцев и «мм», стоящая в течение минут при использовании функции формата
- excel match год и месяц в массиве
- Как я могу потерять ошибку #VALUE в выражении Excel, если используется выражение с частичной датой?
- Программа на Java для преобразования даты в серийный номер, как это сделано в Excel
Я не знаю, с чего начать …
Убедитесь, что у вас есть Option Explicit
в качестве первой строки в модуле. Это потребует от вас определения всех ваших переменных, что останавливает вас от случайного wbs
( wbs
) или с помощью переменных ( Enddate
), которым не присвоено значение.
PS, пожалуйста, заглавные буквы в начале каждого слова в именах переменных, чтобы вы могли читать их проще, т.е. NextDay
Вы определили следующий nextday
как строку. Строка не является объектом, поэтому возникает «ошибка, связанная с объектом».
Если все, что вы делаете, добавляет день, вам не нужна функция DateAdd
, просто добавьте 1
.
Вам не нужно использовать какие-либо .Activate
, .copy
или .PasteSpecial
чтобы просто скопировать значение из одной ячейки в другую.
Я не могу точно понять, что вы делаете; особенно с вашей датой окончания. Вы пытаетесь сделать этот запуск один раз в день и продолжать писать в следующий столбец? Если это так, вам нужно обработать последний столбец следующим образом:
Public Function LastColumn(Optional Row As Integer = 1, Optional Sheet As Excel.Worksheet) As Long If Sheet Is Nothing Then Set Sheet = Application.ActiveSheet LastColumn = Sheet.Cells(Row, Sheet.Columns.Count).End(xlLeft).Row End Function
Установите ячейку в пустую ячейку (смещение) после последней ячейки в строке 4:
Set cell = LastColumn(4, wb.wsHistoricalData).offset(0,1)
Во всяком случае, вот что ваш код примерно выглядит, когда исправлено …
Option Explicit Sub ComplieDataLoop() Dim wb As Workbook Dim wsPrecip As Worksheet Dim wsHistoricalData As Worksheet Dim NextDay As Date 'Dim EndDate As Date??? Dim cell As Range Set wb = ActiveWorkbook Set wsPrecip = wb.Worksheets("Precip") Set wsHistoricalData = wb.Worksheets("Historical Data") NextDay = wb.wsPrecip.Range("CJ4") 'EndDate = ??? Set cell = wb.wsHistoricalData.Range("C4") Do While EndDate < DateSerial( 2018, 2, 28) cell = wb.wsPrecip.Range("CJ4") Set cell = Offset(-1, 0) cell = wb.wsPrecip.Range("CN37") 'reset positioning for next day's date in one cell above and to the right Set cell = Offset(-1, 1) 'EndDate = ??? Loop End Sub