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

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,053
Решения
2
Реакции
5,746
Всем привет.
Вопрос в названии темы.

Пока испробовано вроде такого:
VB.NET / VBA:
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 раз.
А это тоже не айс.

В общем совету буду рад)
 
Привет, Кирилл!

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

Кстати, с такими вот внешними объектами я бы не советовал работать через оператор With.
Открывай их честно, с присвоением объектной переменной, и обязательным освобождением через присвоение Nothing, иначе рискуешь, что объект так и останется "висеть" в памяти даже после закрытия твоего приложения:
VB.NET / VBA:
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
 
Пробовал Value упаковать в массив, но тогда получается что если цикл , например, 30, то и файл открывается 30 раз.
Так не открывай Excel в цикле. Открывай только 1 раз, а перечисление ячеек и всё остальное уже в цикле.
Твои сложности, возможно, возникли из-за чрезмерного использования With.
Присвой один раз документ объектной переменной, и дальше работай с ней сколько угодно и где угодно, пока не закроешь экземпляр, и не освободишь ссылку.
 
P.S. Перед закрытием книги делай
VB.NET / VBA:
objExcel.Visible = True
иначе рискуешь, что у тебя не станет видно книги, когда будешь её вручную открывать двойным кликом.
 
Мой вопрос зачем ты это делаешь и что в итоге планируешь получить?
Привет, спасибо за подсказки!
А задача моя отобразить некоторые данные из 1с и я подумал оттуда выгружать в файл, а из файла уже перенести на форму на большой экран.
Формат Excel выбрал потому что можно определенные цифры выгружать в определенную ячейку и это освободит меня от того, что бы дополнительные условия прописывать.
 
Вот что вышло:

VB.NET / VBA:
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
 
в файл, а из файла уже перенести на форму на большой экран.
Открываешь Excel. Вот тебе и форма с большим экраном :)
Или макрос создаёшь внутри шаблона Excel, если тебе нужно оперировать данными, тогда он будет доступен внтури любой новой книги Excel.

Ну да, что-то типа этого. Но можно и ещё немного сократить. Вместо:
VB.NET / VBA:
Value(1) = .Range("A1").Value
Value(2) = .Range("B1").Value
Value(3) = .Range("C1").Value
написать цикл:
VB.NET / VBA:
for i = 1 to 3
    Value(i) = .Cells(1, i).Value
next
 
Вообще есть специальный объект, чтобы отобразить кусок Excel документа напрямую сразу в форме, не помню как называется.
Также есть способ динамического создания контролов. В итоге ты указываешь область, а программа тебе сама создаёт на форме нужное число Label и прочего.
 
Кстати, мысль... попробую придать листу excel презентабельный вид и дописать туда недостающий функционал.

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

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

Вообще, у 1c есть собственный язык макросов, довольно развитый, проще всего написать нужный плагин на нём.
 
Ну пока я выкурю 1с и такой вариант сойдет на время))
 
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[/CODE]
подскажите, А так будет ли правильнее или будет ли быстрее открываться? открыть файл xl ?
Public oExcel As Object '
Public oBook As Object
Public oSheet As Object
Код:
Public Sub openXL() '
Set oExcel = CreateObject("ExCel.Application") '
Set oBook = oExcel.Workbooks.Open(App.Path & "\DOCM.xlsx")
End Sub
 
Последнее редактирование:
А так будет ли правильнее или будет ли быстрее открываться?
Быстрее по сравнению с чем?
Код в цитате и ваш практически идентичен.

По сути самого вопроса нужно отталкиваться от того, какая стоит задача.
Можно применять раннее связывание тогда будет чуть-чуть быстрее. Но можно этого и не заметить.
Можно открывать как базу данных (без использования Excel), тогда будет максимальная скорость.
Но у каждого способа есть свои минусы.
 
Назад
Сверху Снизу