Динамическая запись данных RTD на другой лист
Этот код прекрасно работает, когда данные представлены в диапазоне столбца C4:C7, однако моя рабочая таблица настроена с данными в ряду от C4:K4. Я не могу получить строку вместо столбца, чтобы работать. Любая помощь? Спасибо ,
Sub RecordData()
Dim Interval As Double
Dim cel As Range, Capture As Range
Interval = 30 'Number of seconds between each recording of data
Set Capture = Worksheets("Sheet1").Range("C4:K4") 'Capture this row of data
With Worksheets("Sheet2") 'Record the data on this worksheet
Set cel = .Range("A2") 'First timestamp goes here
Set cel = .Cells(.Rows.Count, cel.Column).End(xlUp).Offset(1, 0)
cel.Value = Now
cel.Offset(0, 1).Resize(1, Capture.Cells.Count).Value = Application.Transpose(Capture.Value)
End With
NextTime = Now + Interval / 86400
Application.OnTime NextTime, "RecordData"
End Sub
1 ответ
Транспонирование Capture.Value
это проблема; вам не нужно этого делать, поскольку диапазоны назначения и источника имеют одинаковую форму.
Предложение: избегайте ссылок на листы по имени, которое они отображают на вкладке в Excel. Эти имена обычно меняются с течением времени и приведут к поломке вашего кода. Например, With Worksheets("Sheet2")...
завершится с ошибкой 9 "Subscript out of range", как только вы измените имя Sheet2 на другое.
Вы можете дать стабильное "внутреннее" имя рабочей таблице и напрямую использовать ее в коде VBA, если указанный код VBA находится в той же книге, что и рабочая таблица. Свойство рабочего листа, на которое я ссылаюсь, называется CodeName
, Вы можете установить его из редактора Visual Basic, щелкнув по рабочему листу в Project Explorer, а затем присвоив свойству (Name) в окне свойств, как показано ниже, где я присвоил CodeName "SourceWs" рабочему листу с именем "Исходный лист", как видно из Excel:
Затем ваш код может быть переписан как:
Option Explicit
Sub RecordData()
Dim Interval As Double
Dim cel As Range, Capture As Range
Dim NextTime As Date
Interval = 30 'Number of seconds between each recording of data
Set Capture = SourceWs.Range("C4:K4") 'Capture this row of data
With DestWs 'Record the data on this worksheet
Set cel = .Range("A2") 'First timestamp goes here
Set cel = .Cells(.Rows.Count, cel.Column).End(xlUp).Offset(1, 0)
cel.Value = Now
cel.Offset(0, 1).Resize(1, Capture.Cells.Count).Value = Capture.Value
End With
NextTime = Now + Interval / 86400
Application.OnTime NextTime, "RecordData"
End Sub
Что касается вашего вопроса об обучающих видео, попробуйте гуглить excel mvp blog
и вы найдете больше, чем вы можете справиться. Повеселись.