Имя: Пароль:
1C
1С v8
Перебрать таблицу значений в 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