Чтение данных из Excel

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BIT
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.07.2003 (Пт) 16:45

Чтение данных из Excel

Сообщение BIT » 20.02.2006 (Пн) 12:46

Необходимо прочитать данные из Excel. Книга содержит порядка 20 листов, в каждом листе примерно по 400 записей (15 столбцов). Задачу реализовал следующим образом :
Код: Выделить всё


Application.Workbooks.Open FileName:=FullPathDataBase, ReadOnly:=True
Set DataFile = Application.Workbooks(ActiveWorkbook.Name)
Itime1 = 0
Do Until Itime1 = DataFile.Worksheets.Count Or Not FlagExit
   Itime1 = Itime1 + 1
   DoEvents
   With DataFile.Worksheets(Itime1)
     For Ltime2 = RowBegin To .UsedRange.Rows.Count
       Stime1 = .Cells(Ltime2, 1).Value
       Stime2 = .Cells(Ltime2, 2).Value
       ' и. т. д
       Stime15 = .Cells(Ltime2, 20).Value
       ' анализ данных записи
    Next
   End With
   ' анализ данных листа
Loop


Проблема в том что данная конструкция (чтение данных) работает очень медленно, возможно ли реализовать данную задачу другим более быстродействующим методом.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.02.2006 (Пн) 12:49

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Re: Чтение данных из Excel

Сообщение alibek » 20.02.2006 (Пн) 13:10

BIT писал(а):Set DataFile = Application.Workbooks(ActiveWorkbook.Name)

Смысл этого действия от меня ускользает.
Lasciate ogni speranza, voi ch'entrate.

BIT
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.07.2003 (Пт) 16:45

Сообщение BIT » 21.02.2006 (Вт) 18:10

Спасибо GSerg . Сначало примерно так и делал, но не получилось бросил. После вашего совета заново поробывал получил следующее :
Код: Выделить всё


Option Explicit
Option Base 0
Sub main()
  Dim ArrayTemp() As Variant
  Dim Itime1 As Integer
  Dim RowMax As Long
  Dim ColMax As Integer
  Dim FSON As New FileSystemObject
  Dim FullPathDataBase As String
  Dim DataIn As Object
   FullPathDataBase = "C:\2\Book1.xls"
   Application.Workbooks.Open FileName:=FullPathDataBase, ReadOnly:=True
   Set DataIn = Application.Workbooks(FSON.GetFileName(FullPathDataBase))
   For Itime1 = 1 To DataIn.Worksheets.Count
     With DataIn.Worksheets(Itime1)
       RowMax = .UsedRange.Rows.Count
       ColMax = .UsedRange.Columns.Count
       ReDim ArrayTemp(RowMax - 1, ColMax - 1)
       ArrayTemp = .Range(.Cells(1, 1), .Cells(RowMax - 1, ColMax - 1)).Value
       'ArrayTemp куда-то там деваем
     End With
   Next
   Application.Quit
End Sub



Почему не работало сначала :
1. Не люблю (не пользуюсь) типом Variant, но если массив не определить таким образом - не работает
2. Использую Option Base 0. При выполнении строчки ArrayTemp = .Range(.Cells(1, 1), .Cells(RowMax - 1, ColMax - 1)).Value Массив переопределяется ArrayTemp(1-RowMax - 1,1-ColMax - 1) - ???

alibek В это смысл может и есть но о-о-очень тонкий, кароче сам себя запутал

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

Сообщение alibek » 21.02.2006 (Вт) 18:20

BIT писал(а): alibek В это смысл может и есть но о-о-очень тонкий, кароче сам себя запутал

А все-таки?
Чем не подходит
Код: Выделить всё
Set DataFile = Application.ActiveWorkbook

?
Lasciate ogni speranza, voi ch'entrate.

BIT
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.07.2003 (Пт) 16:45

Сообщение BIT » 21.02.2006 (Вт) 18:47

alibek

Если между выполнением команд Application.Workbooks.Open FileName:=FullPathDataBase, ReadOnly:=True и Set DataIn = Application.ActiveWorkbook будет открыта другая книга, не вернёт ли ActiveWorkbook имя новооткрытой книги ? А так
Код: Выделить всё
Set DataFile= Application.Workbooks(FSON.GetFileName(FullPathDataBase))
явно укажу DataFile

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

Сообщение alibek » 21.02.2006 (Вт) 18:53

А почему бы не присвоить DataFile, а затем не выполнять другие действия?
Lasciate ogni speranza, voi ch'entrate.

BIT
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.07.2003 (Пт) 16:45

Сообщение BIT » 21.02.2006 (Вт) 19:03

alibek имелось в виду открытие новой книги не данной программой, а другим процессом

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

Сообщение alibek » 21.02.2006 (Вт) 19:08

Workbooks.Open возвращает открытую книгу; чем в таком случае не устраивает она?
Lasciate ogni speranza, voi ch'entrate.

BIT
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.07.2003 (Пт) 16:45

Сообщение BIT » 22.02.2006 (Ср) 12:14

Определил массив ArrayTemp(0-20,0-10) записываю данные
Код: Выделить всё
ArrayTemp = .Range(.Cells(1, 1), .Cells(15, 15)).Value

Присходит переопределение размеров массива - ArrayTemp(1-15,1-15) (я считал что должна возникнуть ошибка), почему?


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList