Динамическая запись данных RTD на другой лист - PullRequest
0 голосов
/ 14 декабря 2018

Этот код отлично работает, когда данные представлены из диапазона столбца C4: C7, однако мой рабочий лист настроен с данными в ряду от C4: K4.Я не могу получить строку вместо столбца, чтобы работать.Любая помощь?Спасибо view pic with issue.

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 Ответ

0 голосов
/ 15 декабря 2018

Транспонирование Capture.Value - это проблема;Вам не нужно этого делать, поскольку диапазоны назначения и источника имеют одинаковую форму.

Предложение: не обращайтесь к рабочим листам по имени, которое они отображают на вкладке в Excel.Эти имена обычно меняются с течением времени и приведут к поломке кодаНапример, With Worksheets("Sheet2")... завершится с ошибкой 9 «Подстрочный индекс вне диапазона», как только вы измените имя Sheet2 на другое.

Вы можете присвоить стабильное «внутреннее» имя рабочей таблице и напрямуюиспользуйте его в коде VBA, если указанный код VBA находится в той же книге, что и лист.Свойство листа, на которое я ссылаюсь, называется CodeName.Вы можете установить его из редактора Visual Basic, щелкнув по рабочему листу в Project Explorer, а затем присвоив свойству (Name) в окне свойств, как показано ниже, где я присвоил CodeName "SourceWs" рабочему листу с именем«Исходная рабочая таблица», как видно из Excel:

enter image description here

Затем ваш код можно переписать так:

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

Что касаетсяна ваш вопрос об обучающих видео, попробуйте поискать в Google excel mvp blog, и вы найдете больше, чем вы можете справиться.Веселитесь.

...