• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

VB 6 Как лучше читать данные из Excel ?

Кирилл

Команда форума
Администратор
Сообщения
13,383
Симпатии
5,901
#1
Всем привет.
Вопрос в названии темы.

Пока испробовано вроде такого:
VB.NET:
Private Sub Command1_Click()
      Dim Value1 As String, Value2 As String, Value3 As String
          With CreateObject("Excel.Application")
          With .Workbooks.Open(FileName:="E:\11.xls", UpdateLinks:=0)
          With .Worksheets(1)
               Value1 = .Range("A1").Value
               Value2 = .Range("B1").Value
               Value3 = .Range("C1").Value
              
          End With
          .Close saveChanges:=True 'False
     End With
     .Quit
End With

Label3.Caption = Value1
Label5.Caption = Value2
Label7.Caption = Value3
End Sub
Проблема в том, что label может быть десятки и это не самый лучший вариант в плане объема кода + долгий отклик.
Пробовал Value упаковать в массив, но тогда получается что если цикл , например, 30, то и файл открывается 30 раз.
А это тоже не айс.

В общем совету буду рад)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#2
Привет, Кирилл!

Ты написал читать откуда, но не написал, куда.
Судя по описанию, ты собираешься перенести таблицу в таком же виде на форму.
Мой вопрос зачем ты это делаешь и что в итоге планируешь получить?

Кстати, с такими вот внешними объектами я бы не советовал работать через оператор With.
Открывай их честно, с присвоением объектной переменной, и обязательным освобождением через присвоение Nothing, иначе рискуешь, что объект так и останется "висеть" в памяти даже после закрытия твоего приложения:
VB.NET:
Dim objExcel  as Object
Dim oWorkBook as Object

set objExcel = CreateObject("Excel.Application")
set oWorkBook = objExcel.Workbooks.Open(FileName:="E:\11.xls", UpdateLinks:=0)
with oWorkBook

' и т.д.

end with
'закрываешь
'...
'освобождаешь ссылки:
set oWorkBook = Nothing
set objExcel = Nothing
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#3
Пробовал Value упаковать в массив, но тогда получается что если цикл , например, 30, то и файл открывается 30 раз.
Так не открывай Excel в цикле. Открывай только 1 раз, а перечисление ячеек и всё остальное уже в цикле.
Твои сложности, возможно, возникли из-за чрезмерного использования With.
Присвой один раз документ объектной переменной, и дальше работай с ней сколько угодно и где угодно, пока не закроешь экземпляр, и не освободишь ссылку.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#4
P.S. Перед закрытием книги делай
VB.NET:
objExcel.Visible = True
иначе рискуешь, что у тебя не станет видно книги, когда будешь её вручную открывать двойным кликом.
 

Кирилл

Команда форума
Администратор
Сообщения
13,383
Симпатии
5,901
#5
Мой вопрос зачем ты это делаешь и что в итоге планируешь получить?
Привет, спасибо за подсказки!
А задача моя отобразить некоторые данные из 1с и я подумал оттуда выгружать в файл, а из файла уже перенести на форму на большой экран.
Формат Excel выбрал потому что можно определенные цифры выгружать в определенную ячейку и это освободит меня от того, что бы дополнительные условия прописывать.
 

Кирилл

Команда форума
Администратор
Сообщения
13,383
Симпатии
5,901
#6
Вот что вышло:

VB.NET:
Private Sub Command1_Click()
      'Задаем объекты и переменные
      Dim Value(60) As String
      Dim objExcel  As Object, oWorkBook As Object
                  
            Set objExcel = CreateObject("Excel.Application")
            Set oWorkBook = objExcel.Workbooks.Open(FileName:="E:\загрузки\11.xls", UpdateLinks:=0)
                   With oWorkBook
                        With .Worksheets(1)
                              'Назначаем каждому объекту массива значение определенной ячейки
                              Value(1) = .Range("A1").Value
                              Value(2) = .Range("B1").Value
                              Value(3) = .Range("C1").Value
              
                  End With
            End With
      oWorkBook.Close (False)
      Set oWorkBook = Nothing
      objExcel.Visible = True
      Set objExcel = Nothing

 'Каждый Label получает значение из определенной ячейки
 Label3.Caption = Value(1)
 Label5.Caption = Value(2)
 Label7.Caption = Value(3)

End Sub
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#7
в файл, а из файла уже перенести на форму на большой экран.
Открываешь Excel. Вот тебе и форма с большим экраном :)
Или макрос создаёшь внутри шаблона Excel, если тебе нужно оперировать данными, тогда он будет доступен внтури любой новой книги Excel.

Ну да, что-то типа этого. Но можно и ещё немного сократить. Вместо:
VB.NET:
Value(1) = .Range("A1").Value
Value(2) = .Range("B1").Value
Value(3) = .Range("C1").Value
написать цикл:
VB.NET:
for i = 1 to 3
    Value(i) = .Cells(1, i).Value
next
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#8
Вообще есть специальный объект, чтобы отобразить кусок Excel документа напрямую сразу в форме, не помню как называется.
Также есть способ динамического создания контролов. В итоге ты указываешь область, а программа тебе сама создаёт на форме нужное число Label и прочего.
 

Кирилл

Команда форума
Администратор
Сообщения
13,383
Симпатии
5,901
#9
Кстати, мысль... попробую придать листу excel презентабельный вид и дописать туда недостающий функционал.

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#10
Приближенно к реальному времени, это тебе нужно брать данные напрямую из БД 1c, без всяких трансформаций.
С 1c не работал, так что не знаю, что она там использует.

Можно, как вариант, считывать текст напрямую из окна оболочки формы 1c.

Вообще, у 1c есть собственный язык макросов, довольно развитый, проще всего написать нужный плагин на нём.
 

Кирилл

Команда форума
Администратор
Сообщения
13,383
Симпатии
5,901
#11
Ну пока я выкурю 1с и такой вариант сойдет на время))
 
Сверху Снизу