Доброго всем дня. Я создаю электронное устройство на микропроцессоре которое передает в EXCEL 18 битные данные по RS232 to USB адаптеру. По этой причине начал изучать VBA но знаний катастрофически не хватает и застрял на банальном вопросе...
Я добился пока того что устойчиво принимаю и вывожу в столбец данные по одному каналу. Суть вопроса в том что каналов у меня 4 и я застрял на том что не могу каналы записывать в разные столбцы.
Вот как у меня это выглядит:
[vba]
Код
Case EVT_DATA For i = 0 To 9 Next i
'выводим в столбец А четыре принятых байта. 'первые три байта - А1,А2,А3 - числовое значение какого либо канала 'четвертый байт А4 - идентификатор канала
cell_idx = cell_idx + 1 'увеличиваем число строки Cells(cell_idx, 1) = data If cell_idx = 4 Then cell_idx = 0 z = Cells(3, 1) * 256 * 256 + Cells(2, 1) * 256 + Cells(1, 1) ' склеиваем первые три байта для восстановления 18 битного принятого значения For y = 0 To 9 Next y cell_idy = cell_idy + 1 'увеличиваем число строки Cells(cell_idy, 3).Value = ((z * 0.015625) / 1000) * 35.162 ' заполняем столбец С принятыми данными из канала 1 End If
Структура передаваемых данных такая: Сначала идут три байта данных. Четвертый байт - идентификатор канала:
Я подумал что можно добавить переменную cell_y (например) и ей присваивать значение в зависимости от четвертого бита. Но у меня выдает ошибку при таком варианте:
cell_idx = cell_idx + 1 'увеличиваем число строки Cells(cell_idx, 1) = data If cell_idx = 4 Then cell_idx = 0 If Cells(4, 1).Value = 96 Then cell_y = 2 End If
If Cells(4, 1).Value = 97 Then cell_y = 3 End If
If Cells(4, 1).Value = 98 Then cell_y = 4 End If
If Cells(4, 1).Value = 99 Then cell_y = 5 End If
z = Cells(3, 1) * 256 * 256 + Cells(2, 1) * 256 + Cells(1, 1) ' склеиваем первые три байта для восстановления 18 битного принятого значения For y = 0 To 9 Next y cell_idy = cell_idy + 1 'увеличиваем число строки Cells(cell_idy, cell_y).Value = ((z * 0.015625) / 1000) * 35.162 ' заполняем столбец С принятыми данными из канала 1 End If
[/vba]
Естественно я понимаю что что то неправильно делаю. Прошу помочь решить проблему....
[moder]Добрый день, оформляйте коды тегами кнопка #[/moder]
Доброго всем дня. Я создаю электронное устройство на микропроцессоре которое передает в EXCEL 18 битные данные по RS232 to USB адаптеру. По этой причине начал изучать VBA но знаний катастрофически не хватает и застрял на банальном вопросе...
Я добился пока того что устойчиво принимаю и вывожу в столбец данные по одному каналу. Суть вопроса в том что каналов у меня 4 и я застрял на том что не могу каналы записывать в разные столбцы.
Вот как у меня это выглядит:
[vba]
Код
Case EVT_DATA For i = 0 To 9 Next i
'выводим в столбец А четыре принятых байта. 'первые три байта - А1,А2,А3 - числовое значение какого либо канала 'четвертый байт А4 - идентификатор канала
cell_idx = cell_idx + 1 'увеличиваем число строки Cells(cell_idx, 1) = data If cell_idx = 4 Then cell_idx = 0 z = Cells(3, 1) * 256 * 256 + Cells(2, 1) * 256 + Cells(1, 1) ' склеиваем первые три байта для восстановления 18 битного принятого значения For y = 0 To 9 Next y cell_idy = cell_idy + 1 'увеличиваем число строки Cells(cell_idy, 3).Value = ((z * 0.015625) / 1000) * 35.162 ' заполняем столбец С принятыми данными из канала 1 End If
Структура передаваемых данных такая: Сначала идут три байта данных. Четвертый байт - идентификатор канала:
Я подумал что можно добавить переменную cell_y (например) и ей присваивать значение в зависимости от четвертого бита. Но у меня выдает ошибку при таком варианте:
cell_idx = cell_idx + 1 'увеличиваем число строки Cells(cell_idx, 1) = data If cell_idx = 4 Then cell_idx = 0 If Cells(4, 1).Value = 96 Then cell_y = 2 End If
If Cells(4, 1).Value = 97 Then cell_y = 3 End If
If Cells(4, 1).Value = 98 Then cell_y = 4 End If
If Cells(4, 1).Value = 99 Then cell_y = 5 End If
z = Cells(3, 1) * 256 * 256 + Cells(2, 1) * 256 + Cells(1, 1) ' склеиваем первые три байта для восстановления 18 битного принятого значения For y = 0 To 9 Next y cell_idy = cell_idy + 1 'увеличиваем число строки Cells(cell_idy, cell_y).Value = ((z * 0.015625) / 1000) * 35.162 ' заполняем столбец С принятыми данными из канала 1 End If
[/vba]
Естественно я понимаю что что то неправильно делаю. Прошу помочь решить проблему....
[moder]Добрый день, оформляйте коды тегами кнопка #[/moder]kkol
kkol#list.ru
Сообщение отредактировал kkol - Пятница, 16.01.2015, 14:09
[/vba] Только не смейтесь пожалуйста - я не знаю для чего это....! Просто это ихз примера какогото осталось.
[vba]
Код
cell_y = Cells(4, 1) - 94
[/vba] А здесь присваивание переменной cell_y значения из ячейки А4? А что такое - 94?
И ещё я забыл спросить, вот такое написание правильное? [vba]
Код
Cells(cell_idy,cell_y).Value =............
[/vba] У меня почему то выдает ошибку когда я в скобках пишу две переменные как указатели адреса ячейки.
И ещё раз прошу не смеятся над моим файлом. Прилагаю. В этом файле есть кнопки которыми я передаю в устройство значения на ЦАП и АЦП. Файл полностью экспериментальный. Прошу прощения что нет упорядоченного представления. Для связи с RS232 я использую модуль StrokeReader.
Добавил чуть позже: У меня почему то неразрешено открывать личные сообщения...
Ой, ответили.... Ура!!! Спасибо огромное!
[vba]
Код
For i = 0 To 9 Next i
[/vba] Только не смейтесь пожалуйста - я не знаю для чего это....! Просто это ихз примера какогото осталось.
[vba]
Код
cell_y = Cells(4, 1) - 94
[/vba] А здесь присваивание переменной cell_y значения из ячейки А4? А что такое - 94?
И ещё я забыл спросить, вот такое написание правильное? [vba]
Код
Cells(cell_idy,cell_y).Value =............
[/vba] У меня почему то выдает ошибку когда я в скобках пишу две переменные как указатели адреса ячейки.
И ещё раз прошу не смеятся над моим файлом. Прилагаю. В этом файле есть кнопки которыми я передаю в устройство значения на ЦАП и АЦП. Файл полностью экспериментальный. Прошу прощения что нет упорядоченного представления. Для связи с RS232 я использую модуль StrokeReader.
Добавил чуть позже: У меня почему то неразрешено открывать личные сообщения...kkol
1.Этот цикл конечно создаёт некую паузу... Но думаю измерить эту долю милимикросекунды будет затруднительно. 2.Присваивание переменной cell_y значения из ячейки А4-94, т.е. если в A4 только значения 96/97/98/99, то в результате получите что хотели одним действием, а не кучей. 3. Написание правильное? - да. Но нужно видеть что в переменных.
Файл смотреть сейчас некогда - обед на носу
1.Этот цикл конечно создаёт некую паузу... Но думаю измерить эту долю милимикросекунды будет затруднительно. 2.Присваивание переменной cell_y значения из ячейки А4-94, т.е. если в A4 только значения 96/97/98/99, то в результате получите что хотели одним действием, а не кучей. 3. Написание правильное? - да. Но нужно видеть что в переменных.
Alex, спасибо! Если бы я знал что такое распечатать перед строкой.... Где и что я увижу? Не хочу сильно грузить вас своими проблемами.... Я прекрасно понимаю что это уровень песочницы.
Alex, спасибо! Если бы я знал что такое распечатать перед строкой.... Где и что я увижу? Не хочу сильно грузить вас своими проблемами.... Я прекрасно понимаю что это уровень песочницы.
Добрый вечер Алекс, Да именно такую ошибку. В принципе я нашел почему не работает - но вот причина не ясна. Я писал что использую модуль StrokeReader для управления RS232. Там есть выбор типа принимаемых данных - BINARY = 0, TEXT = 1 BINARYJS = 2 Я ставлю BINARY = 0 и тут то возникает ошибка. Если же я ставлю BINARYJS = 2 то все работает корректно.
Странно, но я же передаю последовательно 4 байта... [vba]
Код
Вот описание опций: Если DataMode = BINARY, пользовательское приложение будет получать массив байтов (COM/OLE: SAFEARRAY of BYTE).
Режим BINARYJS предназначен для совместимости с Javascript при передаче массивов двоичных данных (COM/OLE: SAFEARRAY of VARIANT of BYTE). Переданные данные могут быть преобразованы в массив с помощью класса VBArray.
Добрый вечер Алекс, Да именно такую ошибку. В принципе я нашел почему не работает - но вот причина не ясна. Я писал что использую модуль StrokeReader для управления RS232. Там есть выбор типа принимаемых данных - BINARY = 0, TEXT = 1 BINARYJS = 2 Я ставлю BINARY = 0 и тут то возникает ошибка. Если же я ставлю BINARYJS = 2 то все работает корректно.
Странно, но я же передаю последовательно 4 байта... [vba]
Код
Вот описание опций: Если DataMode = BINARY, пользовательское приложение будет получать массив байтов (COM/OLE: SAFEARRAY of BYTE).
Режим BINARYJS предназначен для совместимости с Javascript при передаче массивов двоичных данных (COM/OLE: SAFEARRAY of VARIANT of BYTE). Переданные данные могут быть преобразованы в массив с помощью класса VBArray.
Я в шоке!!! Мистр Hugo, спасибо огромное!!!!! То что вы сделали одной строкой, я даже представить не мог! Сейчас я получаю сразу 4 байта одним массивом, а ваше выражение распределяет это по четырем ячейкам!!!
Я в шоке!!! Мистр Hugo, спасибо огромное!!!!! То что вы сделали одной строкой, я даже представить не мог! Сейчас я получаю сразу 4 байта одним массивом, а ваше выражение распределяет это по четырем ячейкам!!!
Вам нужно было в окне Locals посмотреть что содержит переменная data - и затем подумать как выгрузить этот массив в строку. Можно и циклом по массиву и ячейкам - но с resize быстрее.
Вам нужно было в окне Locals посмотреть что содержит переменная data - и затем подумать как выгрузить этот массив в строку. Можно и циклом по массиву и ячейкам - но с resize быстрее.Hugo
Все получалось ровно до того момента пока не сделал автоматическую передачу данных в EXCEL. То есть когда из EXCEL я посылаю комбинацию переменных, устройство начинает в ответ передавать каждые 500 миллисекунд данные. Первые три 8 байта данные и четвертым идентификатор посылки.
Не знаю что случилось, но EXCEL сразу выдает ошибку "basic runtime error 1004". До этого, все принималось нормально, когда была одноразовая передача. Теперь какоето шаманство. Ведь вроде все осталось как прежде, но вот не хочет ни в какую. Я уже в мистику начинаю верить... Помогите пожалуйста понять в чем проблема. Прилагаю файл который использую в экспериментах...
При выборе ДЕБАГ - указывает на строку в которой ошибка: [vba]
Код
Cells(cell_str, cell_y).Value = z
[/vba]
Добрый вечер народ. Очередной ступор случился....
Все получалось ровно до того момента пока не сделал автоматическую передачу данных в EXCEL. То есть когда из EXCEL я посылаю комбинацию переменных, устройство начинает в ответ передавать каждые 500 миллисекунд данные. Первые три 8 байта данные и четвертым идентификатор посылки.
Не знаю что случилось, но EXCEL сразу выдает ошибку "basic runtime error 1004". До этого, все принималось нормально, когда была одноразовая передача. Теперь какоето шаманство. Ведь вроде все осталось как прежде, но вот не хочет ни в какую. Я уже в мистику начинаю верить... Помогите пожалуйста понять в чем проблема. Прилагаю файл который использую в экспериментах...
При выборе ДЕБАГ - указывает на строку в которой ошибка: [vba]
Спасибо огромное за ответ. Попробую после работы вечером поменять.
Вчера поздно вечером, я заметил такую вещь - если написать вот так: [vba]
Код
' cell_idy = cell_idy + 1 ' If cell_idy = 5 Then ' cell_idy = 0 cell_str = cell_str + 1 ' End If Cells(cell_str, cell_y).Value = z
[/vba] То есть если счетчик строк каждый раз изменяется, то все работает. Правда при этом данные пишутся наискосок. Но это и понятно.
Если же счетчик строк меняется по условию - то тут то и возникает ошибка 1004. В интернете я поискал что это такое - я так понял что это несоответствие типа данных. И я сейчас ломаю голову - как их привести в соответствие. Может их как то хитро объявлять надо?
Спасибо огромное за ответ. Попробую после работы вечером поменять.
Вчера поздно вечером, я заметил такую вещь - если написать вот так: [vba]
Код
' cell_idy = cell_idy + 1 ' If cell_idy = 5 Then ' cell_idy = 0 cell_str = cell_str + 1 ' End If Cells(cell_str, cell_y).Value = z
[/vba] То есть если счетчик строк каждый раз изменяется, то все работает. Правда при этом данные пишутся наискосок. Но это и понятно.
Если же счетчик строк меняется по условию - то тут то и возникает ошибка 1004. В интернете я поискал что это такое - я так понял что это несоответствие типа данных. И я сейчас ломаю голову - как их привести в соответствие. Может их как то хитро объявлять надо? kkol
Здравствуйте Hugo. В момент ошибки я не смог посмотреть - не получается. Может просто не знаю как смотреть? Но если я делаю тупо заменив переменную строки на цифру: [vba]
Код
Cells(2, cell_y).Value = z
[/vba] То обе переменные изменяются корректно. То есть номер строки увеличивается на единицу, а счетчик от 0 до 5 отрабатывает цикл то же корректно.
Здравствуйте Hugo. В момент ошибки я не смог посмотреть - не получается. Может просто не знаю как смотреть? Но если я делаю тупо заменив переменную строки на цифру: [vba]
Код
Cells(2, cell_y).Value = z
[/vba] То обе переменные изменяются корректно. То есть номер строки увеличивается на единицу, а счетчик от 0 до 5 отрабатывает цикл то же корректно.kkol