Запуск макросов Excel непосредственно из ArcView

0 голосов
спросил 29 Апр, 09 от Lord (3,920 баллов) в категории Программные продукты Esri
Я новичок на форуме. Прочитал, что была проблема с запуском макросов Excel. Если интересно еще, могу опубликовать пару строчек текста.
Работает великолепно.

      systemClient.Execute("[Run(""addRow"")]")

      systemClient.Execute("[Run(""FormatSved"")]")

в приведенных примерах addRow и FormatSved суть макросы

Если требуется передать параметр в макрос, то не мудрствуя лукаво
в произвольную ячейку пишем нужное значение параметров (несколько ячеек, несколько параметров). Потом макросом эти ячейки читаем и получаем значения параметра (ов)

14 Ответы

0 голосов
ответил 04 Май, 09 от Albert1 (10,780 баллов)
Мягко говоря, пример какой-то непривязанный ни к чему. Для полноты следовало бы описать создание клиента, передачу запроса, закрытие клиента. Кстати, проблем с запуском макросов эксела, не наблюдал ни разу. Помнится, была интереснее задача (кто в теме - ИСРИМСР), там я реализовывал двустороннюю связь Access с Арквью, если реально ктонибудь заинтересуется, расскажу.
0 голосов
ответил 04 Май, 09 от BPS (2,160 баллов)

Добрый день, Альберт.

Меня интересует организация такой двухсторонней связи Access и ArcVew. Можно ли сделать так: в Access выбираешь какой либо объект, запускаешь макрос, открывается ArcView с нужным видом и подсвеченным выбранным объектом. И также в другую сторону.
0 голосов
ответил 04 Май, 09 от Lord (3,920 баллов)
Я занимался только формированием Межевого плана в Excel. Вызов макросов для форматирования ячеек, печати и прочего. В обратную сторону экспериментов не проводил и опыта нет. Сожалею, что не могу помочь.
0 голосов
ответил 05 Май, 09 от Albert1 (10,780 баллов)
В ближайшее время постараюсь описание скинуть со скриптами арквью и модулями акцесса, сейчас все приведу в нормальный вид, комментарии напишу.

Начал писать комментарии,сводить программы - целая поэма получается :)
0 голосов
ответил 03 Июнь, 09 от BPS (2,160 баллов)
Ждем поэму с нетерпением и трепетом:)). Нужна не для души, для работы.
0 голосов
ответил 05 Июнь, 09 от zinokk (420 баллов)
Альберт! Я тоже очень жду! как раз пытаюсь  сделать подобное. Точнее даже в упрощенном как мне кажется варианте.  Хотелось бы сделать кнопочку, нажимая на которую открывалась бы готовая  таблица в Access.
0 голосов
ответил 09 Июнь, 09 от BPS (2,160 баллов)
Такую-то  кнопочку сделать не трудно. Открываете "скрипты" -> "новый" и в текст скрипта пишете вот такую строчку  System.Execute("C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE   и дальше путь к вашему файлу .mdb. Например если Ваш файл называется "таблица1" и находится в корневом каталоге, то в целом текст скрипта будет таким  System.Execute("C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE C:\таблица1.mdb"). Откомпилируйте. В проекте создайте новую кнопку и повесьте на нее этот скрипт. Удачи.
0 голосов
ответил 09 Июнь, 09 от zinokk (420 баллов)
да,спасибо ))) я уже сделала )) это оказалось не так сложно. с двухсторонней связью пока не разобралась (((
0 голосов
ответил 09 Июнь, 09 от Lord (3,920 баллов)
'вызов excel
f_Put="C:\ESRI\AV_GIS30\Межевой_план_макет\ООО_Межевой_план_макет.xls"
concom=("C:\Program Files\Microsoft Office\Office\excel"++f_Put.quote)
'в предыдущей строке .quote нужно использовать, если в имени файла присутствуют пробелы
System.Execute(concom)
' устанавливаем связь с таблицей
systemClient = DDEClient.Make("Excel", "System")
if (systemClient.HasError) then  
  MsgBox.error(systemClient.GetErrorMsg, "")  exit
end
'   вызов макроса для активации требуемого листа таблицы (у меня их больше 10)
      systemClient.Execute("[Run(""activeSheet"")]")
'   устанавливаем связь с нужным листом
      sstem1Client = ddeClient.Make( "Excel",
                      "Сведения_об_образуемых_участках" )
if (sstem1Client.HasError) then  
  MsgBox.error(sstem1Client.GetErrorMsg, "")  exit
end
'  заполняем необходимые ячейки таблицы
      sstem1Client.Poke("R5C5:R5C8",aName)
      sstem1Client.Poke("R11C5:R11C8",aName)
      sstem1Client.Poke("R17C5:R17C8",aName)
      sstem1Client.Poke("R24C5:R24C8",aName)
      sstem1Client.Poke("R35C5:R35C8",aName)
      sstem1Client.Poke("R28C6:R28C8",theKatUch)
      sstem1Client.Poke("R30C6:R30C8",sArea)
' вызов макроса в данном случае добавить строку
      systemClient.Execute("[Run(""addRow"")]")

' следующая конструкция используется, если динамично меняется активный лист таблицы
      selection = systemClient.Request("Selection")
      spreadsheet = selection.Left(selection.IndexOf("!"))
      sstemClient = ddeClient.Make( "Excel", spreadsheet )
      sstemClient.Poke( cells1, sNpoint)
      sstemClient.Poke( cells2, Yp1.asString.translate(".",","))
      sstemClient.Poke( cells3, Xp1.asString.translate(".",","))
      sstemClient.Poke( cells4, norm)
' вызов макроса для форматирования ячеек листа
      systemClient.Execute("[Run(""FormatSved"")]")

' нужно быть очень аккуратным при создании макросов.
' в принципе получается комплекс: таблица Excel, макросы, ArcView со своими скпиптами
' для решения поставленной задачи. У нас это формирование межевого плана.
' Естественно, что используются собственные Shape-файлы с атрибутивной информацией, своими полями
' и прочее
' спасибо критикам. А ранее была написана только одна строчка, потому что долго не удавалось 'справиться с синтаксисом вызова макроса. Остальное предполагалось известным

0 голосов
ответил 29 Сен, 09 от Lord (3,920 баллов)
Уважаемые коллеги.
Кто нибудь уже написал код для связи ArcView и OpenOffice
НЕ получается связь с листом
не получается вызвать макрос
Да и в ячейку не могу ничего загнать
и прочитать тоже не могу

Имеется ввиду DDEClient
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...