Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: степень возможности VB для этой задачи
невозможно 1 25.00%
сложно 3 75.00%
пустяки 0 0%
я готов помочь 0 0%
Голосовавшие: 4. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2009, 20:04   #1
RussellMur
 
Регистрация: 19.02.2009
Сообщений: 8
По умолчанию Возможно ли написать в VB/VBA(Ex) софтину, которая бы управляла программой (или usb устройством)

Есть программа, написанная в 97 году на Microsoft Visual Basic 5.0 / 6.0 (PEiD). Писал не я - исходников нет, поэтому весь сыр-бор:
(см.скриншот)
Она при нажатии Start создаёт новую книгу excel (в НОВОМ процессе)
и передаёт данные он-лайн через USB с девайса (измерительный инструмент) в эту книгу (описание девайса есть. как формируется "битовая строка" для передачи там описано)

Я хочу(=надо) сделать программу (VB или VBA в Excel) для удобства анализа данных.
Пробывал VBA Excel'я - не получается "достучатся" до процесса EXCEL, "созданного" прогой. Мой макрос видит только книги, открытые/созданные в текущем процессе Excel
типа того:

Код:
   Dim wb As Workbook   
   ...  
   For Each wb In Application.Workbooks  
   ...
Возможно ли написать в VB софтину, которая бы управляла программой, т.е :
1.запуск ExRcv.exe
2.выбор CEM (combobox)
3.выбор LF (optionbutton) - НЕ ОБЯЗАТЕЛЬНО!
4.нажатие Start
5.мониторинг открывшейся книги(листа) Excel'я на предмет обновления данных.

RussellMur вне форума Ответить с цитированием
Старый 20.02.2009, 05:35   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Возможно ли написать в VB софтину, которая бы управляла программой, т.е :
1.запуск ExRcv.exe
2.выбор CEM (combobox)
3.выбор LF (optionbutton) - НЕ ОБЯЗАТЕЛЬНО!
4.нажатие Start
5.мониторинг открывшейся книги(листа) Excel'я на предмет обновления данных.
Программу написать вполне возможно, причём не только на VB.

1) запустить exe-файл проблем не составит (одна строка кода)

2 - 4) нажатие кнопок и выбор элементов управления - тоже несложная задача (правильнее, конечно, посылать сообщения элементам управления, но можно и по-другому, если программа ExRcv.exe будет запускаться только на одном компе с постоянным разрешением экрана: ставим курсор на нужные координаты экрана, зная, что в этой точке экрана расположена кнопка, и посылаем нажатие клавиши)

5) мониторинг при желании также реализуем. Можно попробовать несколько вариантов (в зависимости от кого, как в программе реализован вызов Excel)

Цитата:
Пробывал VBA Excel'я - не получается "достучатся" до процесса EXCEL, "созданного" прогой.
Код:
For Each wb In Application.Workbooks
И не получится.
Вы перебираете все открытые рабочие книги в текущей копии приложения Excel, а тот файл открыт в другом процессе.

Другое дело, если Вы откроете свой файл с макросами через интерфейс той, запущенной процессом, копии Excel - тогда всё будет работать.
EducatedFool вне форума Ответить с цитированием
Старый 21.02.2009, 10:09   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Здесь человек серьезно занялся этим вопросом с применением WinAPI. Свяжись с ним, думаю вместе вы чего-нибудь придумаете. И, насколько я понял, делает это он в VBA.
А может это ты и есть? Хотя вряд ли, тот уже много чего раскопал.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 22.02.2009, 05:29   #4
RussellMur
 
Регистрация: 19.02.2009
Сообщений: 8
По умолчанию

EducatedFool, viter.alex - спасибо за ответы.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
ставим курсор на нужные координаты экрана, зная, что в этой точке экрана расположена кнопка, и посылаем нажатие клавиши)
не подойдёт - надо запускать неоднократно, желательно в свёрнутом виде.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
И не получится.
Вы перебираете все открытые рабочие книги в текущей копии приложения Excel, а тот файл открыт в другом процессе.

Другое дело, если Вы откроете свой файл с макросами через интерфейс той, запущенной процессом, копии Excel - тогда всё будет работать.
я в курсе. Я могу открыть через интерфейс той, что была запущена процессом, но когда я этот процесс закрою и открою заново (необходимо, т.к. ЮСБ девайс периодически должен отсоединится от компа - и программа его "теряет") создастся еще один (новый) процесс Excelя

Пробовал использовать личную книгу макросов что грузится автоматом с Е. - нифига. Ексель чистеньким запускается.

Другой вопрос:


(из руководстве к девайсу)

ЮСБ драйвер установлен. прога НАИПРОСТЕЙШАЯ. при нажатии кнопки на приборе, он передаёт строку (см. картинку). Может проще написать программу "заново".
RussellMur вне форума Ответить с цитированием
Старый 22.02.2009, 10:56   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вы бы хоть написали, про какое устройство идёт речь.
Я так понял, что речь идёт про этот девайс:




Цитата:
прога НАИПРОСТЕЙШАЯ. при нажатии кнопки на приборе, он передаёт строку (см. картинку). Может проще написать программу "заново".
Как сказать... конечно, можно написать и заново - считывать и обрабатывать информацию с девайса проблем не составит.
Но отлаживать программу, не имея при себе этого девайса, - задача не из лёгких...
Покупать такой девайс ради написания программы - тоже не лучший выход.
Так что, если надумаете делать новую программу, основная часть работы ляжет на Вас, как на владельца устройства.

На мой взгляд, проще написать программу, которая будет отслеживать все запущенные приложения Excel, и при обнаружении нового процесса каким-либо образом "внедряться" в него.
В данном случае всё просто - достаточно активировать окно приложения Excel, и послать ему десяток нажатий клавиш (при помощи горячих клавиш через меню приложения вызвать открытие определённого файла с макросами - примерно так, как мы нажимаем Файл - Открыть...).
А дальше всё сделают макросы - так как они будут запущены как раз из нужной копии Excel.
EducatedFool вне форума Ответить с цитированием
Старый 22.02.2009, 14:48   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

+1 к предыдущему + можно и не клавишами, а получить ссылку типа application и работать через нее, т.е самым обычным для иксель методом, и даже не обязательно туда все макросы загружать - только обработки событий.
slan вне форума Ответить с цитированием
Старый 22.02.2009, 16:02   #7
RussellMur
 
Регистрация: 19.02.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вы бы хоть написали, про какое устройство идёт речь.
Я так понял, что речь идёт про этот девайс:
похож)
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Как сказать... конечно, можно написать и заново - считывать и обрабатывать информацию с девайса проблем не составит.
может есть какой-нибудь пример посмотреть уж очень хочется. Даже если сделаю по-другому - всё равно разобраться хочется. для себя...
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Но отлаживать программу, не имея при себе этого девайса, - задача не из лёгких...
Так что, если надумаете делать новую программу, основная часть работы ляжет на Вас, как на владельца устройства.
Я готов ко многому, только нужны советы...
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
На мой взгляд, проще написать программу, которая будет отслеживать все запущенные приложения Excel, и при обнаружении нового процесса каким-либо образом "внедряться" в него.
В данном случае всё просто - достаточно активировать окно приложения Excel, и послать ему десяток нажатий клавиш (при помощи горячих клавиш через меню приложения вызвать открытие определённого файла с макросами - примерно так, как мы нажимаем Файл - Открыть...).
А дальше всё сделают макросы - так как они будут запущены как раз из нужной копии Excel.
Я уже близок к результату. Всё хочу сделать так:
I. подключаем девайс к компу.
II. Запуск <файла_1>.VBS в ручную, он в свою очередь:
1. Убивает все процессы Excel, ExRcv если такие есть (реализовано)
2. открывает ExRcv в свёрнутом виде (реализовано)
3. управляет открытым окном, т.е. ComboBox+Button
4. проверяет налич. открытого процесса Excel (реализовано)
5. запускает в открытом процессе Excel <файл_с_макросом_в_событии_open>.xl s ? можно ли проще,чем
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
активировать окно приложения Excel, и послать ему десяток нажатий клавиш ...
6. завершает свою работу
III. Макрос:
7. закрывает все книги в текущем процессе. (реализовано)
... теперь при нажатии кнопки на девайсе ExRcv передаёт данные в первый лист открытой им (как, видимо, считает) книги...
8. вызывает форму... анализ данных realtime (в разработке)
9. Сохранение получ. данных в файл *.txt
(сам <файл_с_макросом_в_событии_open>.xl s не должен сохранятся)
10. Вызывает <файла_1>.VBS и и всё по новой...
либо <файла_2>.VBS, который закрывает всё и всё)

Осталость 4 пункта "придумать"...

Цитата:
Сообщение от slan Посмотреть сообщение
+1 к предыдущему + можно и не клавишами, а получить ссылку типа application и работать через нее, т.е самым обычным для иксель методом, и даже не обязательно туда все макросы загружать - только обработки событий.
можно пример?

Последний раз редактировалось RussellMur; 22.02.2009 в 16:09. Причина: addition
RussellMur вне форума Ответить с цитированием
Старый 27.02.2009, 20:57   #8
RussellMur
 
Регистрация: 19.02.2009
Сообщений: 8
По умолчанию

1. Подскажите пожалуйста: меняю ComboBox выбирается у меня теперь - всё на первый взгляд в порядке - только не срабатывает какое то событие видимо - не появляется фрейм "Only for CEM3". Если мышкой - всё в порядке. Использую так:

h2 = FindWindowEx(h1, 0, "ThunderRT6ComboBox", vbNullString)
h2 = FindWindowEx(h1, h2, "ThunderRT6ComboBox", vbNullString)
(т.к. нужно второе Combobox)
далее SendMessage(h2, CB_SETCURSEL, 0, 0)
(предворительно:Const CB_SETCURSEL = &H14E)

Как "полноценно" сменить значение Combobox?


ps: h1 = FindWindow(vbNullString, "ExRcv")


2. и ещё: при
h3 = FindWindowEx(h1, 0, "ThunderRT6CommandButton", "End")
s = SendMessage(h3, BM_CLICK, 0, 0)
кнопка нажимается, программа завершает работу. Всё Ок.

а при
h3 = FindWindowEx(h1, 0, "ThunderRT6CommandButton", "Start")
s = SendMessage(h3, BM_CLICK, 0, 0)

ничего((( может правда из-за 1(см.выше)

кто знает в чем проблема?

Последний раз редактировалось RussellMur; 27.02.2009 в 21:03. Причина: добавление
RussellMur вне форума Ответить с цитированием
Старый 27.02.2009, 21:27   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
кто знает в чем проблема?
Полагаю, Ваш вопрос будет сложноват для посетителей данного раздела...
Всё-таки, тут больше внимания уделяют вопросам работы с Excel.

По VB есть множество специализированных форумов - там у Вас будет больше шансов получить совет.

В любом случае, будет гораздо проще найти решение, если Вы прикрепите к сообщению 2 файла - файл ExRcv.exe, и Вашу программу (код которой Вы привели выше)
EducatedFool вне форума Ответить с цитированием
Старый 27.02.2009, 23:19   #10
RussellMur
 
Регистрация: 19.02.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В любом случае, будет гораздо проще найти решение, если Вы прикрепите к сообщению 2 файла - файл ExRcv.exe, и Вашу программу (код которой Вы привели выше)
вот.

(с установкой - вот)


Заработало!
2.(см выше) заменил:
Call SendMessage(h3, BM_CLICK, 0, 0)
Call PostMessage(h3, BM_CLICK, 0, 0)


Осталось только открыть уже в открытом Excel'е книгу c:/temp/file.xls
никто не знает как лучше?

Последний раз редактировалось RussellMur; 28.02.2009 в 16:15. Причина: последний вопрос
RussellMur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать БД, которая работает везде? =) FeNr1z168 БД в Delphi 6 17.02.2009 08:48
Работа с USB или COM портами АлександрСергеевич Общие вопросы Delphi 2 26.12.2008 04:48
Нужно написать софтину xakep Фриланс 6 22.09.2008 19:10
написать программу которая строила графики функций GeSerKo Помощь студентам 1 05.09.2008 21:03
считывание из СОМ(или USB) порта voron29 Общие вопросы Delphi 1 29.06.2008 13:09