связать VBA с удаленным Excel

Программирование на Visual Basic for Applications
san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

связать VBA с удаленным Excel

Сообщение san* » 14.09.2004 (Вт) 14:28

Мне нужно в открытой книге на удаленном компутере поменять значение ячейки средствами VBA на моем компутере. Как это сделать?

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 14.09.2004 (Вт) 14:37

Клиент-сервер писать, ИМХО иначе никак. Благо VBA такое сделать позволит. В общем, иди сюда http://bbs.vbstreets.ru/viewtopic.php?t=9646
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.09.2004 (Вт) 14:46

А еще есть такая штука, NetDDE. Правда ничего кроме названия по существу подсказать не могу.
Lasciate ogni speranza, voi ch'entrate.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 14.09.2004 (Вт) 15:37

А что нельзя сделать через GetObject или CreateObject
Последний раз редактировалось san* 14.09.2004 (Вт) 16:00, всего редактировалось 1 раз.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 14.09.2004 (Вт) 16:00

Основная сложность - получить доступ к файлу с удаленной машины. Если в режиме удаленного доступа ты видишь диски машины (и файлы соответственно тоже), то даже GetObject или CreateObject не нужны - открывай как файл и редактируй. Но у тебя этой возможности явно нет.

Или ты хочешь создать объект на удаленной машине и работать с ним? Проще клиент-серверное приложение поднять, чес слово...
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.09.2004 (Вт) 16:25

Почему проще? Есть NetDDE, есть DCOM (насчет последнего правда не уверен).
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 14.09.2004 (Вт) 16:36

Потому что человеку похоже что всего лишь надо поменять значение ОДНОЙ ячейки (а даже если нескольких?). Ради этого разбираться с NetDDE или DCOMом? Сомнительное удовольствие. Разве что ему потом потребуется дальше развивать продукт. В ином случае ИМХО клиент-сервер - самое оно.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 14.09.2004 (Вт) 16:37

А как может не быть DCOM?
На локальном компьютере проблем нет: беру ворд - с ВБА изменяю данные в ячейке Екселя в открытом документе. Почему я не могу то же самое сделать для другой машины? DCOM конфигуратор настроен так, что ему по барабану кто туда лезет (тем более юзеры одинаковы). А COM вроде построен так, что ему без разницы куды лесть - в чужой процесс, либо в удаленный процесс, - принципы те самые. Иль я не прав?

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 14.09.2004 (Вт) 16:50

Ты прав, если можешь открыть необходимый тебе файл. Я же рассматривал ситуацию, когда ты с удаленной машины файл или не видишь, или не можешь открыть. Например, у тебя на серваке лежит 19 метровый XLS файл, и у тебя удаленный доступ через диал-ап. Представляешь каким геморроем обернется попытка что-либо изменить через DCOM? В случае же клиент-серверного приложения у тебя через канал связи пойдет только новое значение (или старое и новое - на всякий случай, или старое, новое и код авторизации - на всякий самый самый ;) ).
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 17.09.2004 (Пт) 14:09

Мне нужно именно средствами СОМ. Например - у меня есть возможность писать програмную часть кода только на клиенте. Если я захочу связаться с запущеным(в смысле выполняемым) екземпляром на текущей машине, то
GetObject(,"Excel.Application")
нормально возвращает на него ссылку. После чего в открытом файле я делаю все что захочу. Так же самое я хочу сделать с удаленной машиной. Текущий синтаксис не подходит, потому что связь с запущеным екземпляром он делает только на локальной машине.
Настраиваю ДКОМКонф и говорю, чтоб запускал он Ексель на удаленной машине. После всевозможных проб - успешный результат - это создание нового екземпляра. Тобишь что GetObject, что CreateObject возвращает ссылку на новосозданый екземпляр.

Неужели нельзя соединится с существующим екземпляром приложения средствами СОМ? Может это умеет Дельфи, Си++ и т.д.?

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.10.2004 (Пт) 11:49

Кстати,
Код: Выделить всё
Option Explicit
Dim exapp As Excel.Application

Public Function RunRemoteExcel() As Boolean
RunRemoteExcel = False
On Error GoTo laberr
Set exapp = CreateObject("Excel.Application", "\\comp")
If IsObject(exapp) Then
    exapp.Visible = True
    RunRemoteExcel = True
    Exit Function
End If
Exit Function

laberr:
End Function


Public Sub Test()
If RunRemoteExcel Then
    With exapp.Workbooks.Add
        .ActiveSheet.Cells(1, 1).Value = 123
        .SaveAs "c:\qasw.xls"
        .Close
    End With
    exapp.Quit
    Set exapp = Nothing
End If
End Sub

код в модуле Excel

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Re: связать VBA с удаленным Excel

Сообщение san* » 01.10.2004 (Пт) 12:39

san* писал(а):Мне нужно в открытой книге на удаленном компутере поменять значение ячейки средствами VBA на моем компутере. Как это сделать?

Именно в открытой и в реальном времени и именно средствами DCOM, хотя проблема и с NetDDE. Дело в том, что я занимаюсь в области автоматизации, а там стоит проблема связи одного приложения с другим по открытым технологиям. Но как можно связать два других приложения, если я не могу связать Ексель с Екселем. :(

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.10.2004 (Пт) 14:19

А можно пообстоятельней проблему.
Что предпринимали для решения?
Какие результаты?

san*
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 17.06.2004 (Чт) 17:57
Откуда: Киев

Сообщение san* » 01.10.2004 (Пт) 15:04

Igor_123 писал(а):А можно пообстоятельней проблему.
Что предпринимали для решения?
Какие результаты?


Вобщем беру Ворд, в нем в ВБА пишу код
Код: Выделить всё
Sub aaa()
Dim ap As Excel.Application, sh As Excel.Worksheet
Set ap = GetObject(, "Excel.Application")
Set sh = ap.Workbooks(1).Worksheets(1)
sh.Cells(1, 1) = "eeee"
Set ap = Nothing
End Sub

Запускаю Ексель, и запускаю скрипт -> все работает. Поскольку приложение запущено на этой же машине, он его находит и возвращает мне на него ссылку. Так само я хочу сделать с удаленным Екселем. Беру ДКОМКОНФИГ и настраиваю, что приложение должно запускаться на другой машине, например COMP4. На той машине в ДКОМКОНФИГ пишу, что пользоваться Ексел.Аплик могут юзать, запускать и т.д. все, кто зарегистрирован на этой машине. Вобщем проблем с защитой нету.
Теперь запускаю тот же код - результат тот же - возвратил ссылку на Ексель на локальной машине. Меняю
Код: Выделить всё
Set ap = GetObject("", "Excel.Application")

Запускается еще один екземпляр приложения Ексель, ну и естественно куча ероров, потому что ни один воркбук не загружен и т.д. А надо, чтоб соединился с существуемым Ексель.Аплик.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.10.2004 (Пт) 15:30

А зачем ТАКАЯ интерактивность в Excel?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!???
Или Вы хотите Excel переиначить в Access или какой-нибудь SQL-сервер?
Тогда рецепт сразу-же дали:
ZlydenGL
"Клиент-сервер писать, ИМХО иначе никак. Благо VBA такое сделать позволит. В общем, иди сюда http://bbs.vbstreets.ru/viewtopic.php?t=9646"

Хотя мне кажется можно решить и по другому - создавая екземпляр твоего COM-объекта на машине с нужным Excel'ем и с его помощью интерактивно изменять данные.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 90

    TopList