|
Перебрать таблицу значений в VBA | ☑ | ||
---|---|---|---|---|
0
max735
17.09.13
✎
14:17
|
Здравствуйте,
В экселе исполняю макро суть которого сводится к следующему: 1. Вызывается 1С (V82.ComConnector) 2. В 1С вызывается функция которая делает необходимые запросы и возвращает заполненную таблицу значений. 3. Создаю объект в макросе и присваиваю ему ссылку на полученную ТЗ. Dim MyTZ As Object Set MyTZ = V82base.МойОбщийМодуль.МояФункция Каким образом можно перебрать строки полученной таблицы значений? Или просто обратиться к нужной ячейке таблицы значений? (Если это вообще возможно). Спасибо. |
|||
1
shuhard
17.09.13
✎
14:21
|
(0) то, что в VBA нет таблицы значений, разве не очевидно ?
|
|||
2
Zamestas
17.09.13
✎
14:27
|
(0) А не проще из 1С ёксель корячить?
|
|||
3
max735
17.09.13
✎
14:27
|
(1) Дело в том, что я не создаю таблицу значений в самом VBA,
таблицу значений создает COM - сервер, в качестве которого выступает 1С. И я в принципе могу управлять это ТЗ, например вызвать функцию Количество() и получить результат. Но мне нужно добраться до конкретных ячеек ТЗ и получить значение оттуда. Собственно в этом вопрос. |
|||
4
Infsams654
17.09.13
✎
14:28
|
(1)+ круто!. Пусть в макросе получает построчно данные из 1С и заполняет свой Dim
|
|||
5
max735
17.09.13
✎
14:29
|
(2) Наверное проще, но логичнее, чтобы клиент вы виде экселя подсоединялся к 1С.
|
|||
6
Infsams654
17.09.13
✎
14:32
|
(5)+100 - это правильно, ёксель подключается к базе 1С и макросом заполняет красивошную табличку
|
|||
7
max735
17.09.13
✎
14:32
|
(4) Не хотелось бы, поскольку функция носит универсальный характер и возвращает именно ТЗ.
В 1С для перебора используется либо "Для Каждого", либо оператор []. Скорее всего есть способ, просто я его не знаю. |
|||
8
Infsams654
17.09.13
✎
14:34
|
(7) так Shuhard же написал, откуда VBA знает, что такое 1С-ское ТЗ
|
|||
9
Rie
17.09.13
✎
14:34
|
(7) Нет способа. В 1С есть итераторы (хоть и в кастрированном варианте). В VBA - увы!
|
|||
10
max735
17.09.13
✎
14:38
|
(9) А нельзя ли создать через COM в 1С какой-нибудь итератор и натравить его на таблицу значений? А потом просто забрать нужное значение...
|
|||
11
dk
17.09.13
✎
14:41
|
(9) ????
"ТаблицаЗначений (ValueTable) Получить (Get) Синтаксис: Получить(<Индекс>) Параметры: <Индекс> (обязательный) Тип: Число. Индекс строки. Возвращаемое значение: Тип: СтрокаТаблицыЗначений. Описание: Получает значение по индексу. Работает аналогично оператору []. Доступность: Сервер, толстый клиент, внешнее соединение. Примечание: Применяется в случаях, когда использование оператора [] невозможно. " |
|||
12
ZanderZ
17.09.13
✎
14:43
|
у MyTZ есть количество и получить
|
|||
13
Rie
17.09.13
✎
14:45
|
(10),(11) Можно было бы. Но в _VBA_ нет итераторов. Их можно сымитировать другими средствами. Но - надо _сымитировать.
(11) Вот именно. Когде невоможно. |
|||
14
max735
17.09.13
✎
14:47
|
Как-то я пропустил про "Получить", сейчас попробую. Спасибо.
|
|||
15
Infsams654
17.09.13
✎
14:48
|
(12) чего получить? в 3-й раз повторяю из (1)
"то, что в VBA нет таблицы значений, разве не очевидно ?" |
|||
16
Rie
17.09.13
✎
14:51
|
(15) Нет. VBA знакомо с интерфейсами.
|
|||
17
dk
17.09.13
✎
14:51
|
(13) Цикл же есть Для Сч = 0 По (MyTZ.Количество() - 1)
(15) зато есть ком объект |
|||
18
ZanderZ
17.09.13
✎
14:52
|
(15) плохо что повторяешь - попробовал бы не повторял
|
|||
19
shuhard
17.09.13
✎
14:52
|
(17) ты это ТС-у объясни
|
|||
20
max735
17.09.13
✎
14:53
|
С применением вызова функции "Получить(i)", все получилось.
ТЗ нормально перебирается. Всем большое спасибо за помощь. |
|||
21
бомболюк
17.09.13
✎
15:08
|
Неужели в VBA такое не будет работать:
for each objRow in objTable ' тут тело цикла next что то не верится. и в VB, и в VBScript работает. |
|||
22
бомболюк
17.09.13
✎
15:18
|
(16) неправда твоя ;-) работает все. вот только что из екселя отработало на ура:
Private Sub CommandButton1_Click() Dim objConnection As Object Dim objBase As Object Dim objStructure As Object Dim objVal As Object Set objConnection = CreateObject("v81.COMConnector") Set objBase = objConnection.Connect("File=""D:\MyBase""") Set objStructure = objBase.NewObject("Структура") objStructure.Insert "Ключ1", 1 objStructure.Insert "Ключ2", 2 For Each objVal In objStructure MsgBox objVal.Key + "=" + CStr(objVal.Value) Next End Sub |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |