Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 15:24   #1
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию Импорт 2-х файлов Excel с последующим запуском SQL

Задача следующая:
Имеется 2-а файла Excel, каждый объемом по 1000 строк.
Код:
Файл 1                      Файл 2
ModelName	ModelName	quantity

Nokia1		Nokia1		20
Nokia2		Nokia2		35
Nokia3		Nokia6		4
Nokia4		Nokia4		8
samsung5	samsung8	3
Необходимо к 1-му файлу прирастить второй, сопоставив первый столбец "ModelName". Средствами Excel+VBA желаемого результата добиться не получилось (процедура сравнения занимает очень много времени).
Гораздо быстрей это можно сделать в Access+SQL.
Код:
SELECT*
FROM File1 LEFT JOIN File2 ON File1.ModelName=File2.ModelName;
Так как весь процесс нужно автоматизировать, необходимо в VB прописать:
1. Импорт двух файлов Excel
2. Запуск SQL запроса
3. Сохранение полученного результата в отдельный файл Excel

Сейчас, основная проблема в п. 1. Не понимаю как прописать экспорт выбранного файла Excel в Access.
Bur вне форума Ответить с цитированием
Старый 04.04.2011, 16:15   #2
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

1000 срок сравнения в excel займет менее полусекунды
я думаю тут access совсем не нужен
Используйте для сравнения "Словари" или на крайний случай массивы

а если хотите в access, то просто создайте связанные таблицы с access, и не надо ничего импортировать
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 04.04.2011, 16:46   #3
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
1000 срок сравнения в excel займет менее полусекунды
я думаю тут access совсем не нужен
Используйте для сравнения "Словари" или на крайний случай массивы

а если хотите в access, то просто создайте связанные таблицы с access, и не надо ничего импортировать
Дело в том, что на входе имеются именно два файла Excel. Если все делать в рамках одного файла Excel? то вся операция действительно не долгая. На моем ПК выполняется за ~2 мин.
Код:
For i = 2 To 6500
    If Sheets(1).Cells(i, 1) = "" Then Exit For
    For j = 2 To 6500
        If Sheets(1).Cells(j, 1) = "" Then Exit For
        If Sheets(1).Cells(i, 1) = Sheets(1).Cells(j, 1) Then
            Sheets(1).Cells(i, 2) = Sheets(1).Cells(j, 2)
            Exit For
        End If
    Next j
Next i
Т. к. это только часть программы, то пришлось все писать на VB. Соответственно, обращение к двум разным файлам. И эта процедура занимает значительно времени..
Код:
       For i = 2 To 65000
            If oZapSheet.cells(i, 1).value = "" Then Exit For
            For j = ColN + 1 To 65000
                If oSheet.cells(j, 2).value = "" Then Exit For
                If oZapSheet.cells(i, 1).value = oSheet.cells(j, 2).value Then
                    oZapSheet.cells(i, 8).value = oSheet.cells(j, TermR).value
                    oZapSheet.cells(i, 9).value = oSheet.cells(j, RatR).value
                End If
            Next j
        Next i
Для чего и появилась необходимость в использовании Access.
Bur вне форума Ответить с цитированием
Старый 04.04.2011, 17:11   #4
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Этот цикл точно медленно будет работать, если хотите я его оптимизирую до нормальной скорости меньше полсекунды

вы мне скажите
по какому столбцу лежит первый критерий, и сколько столбцов в первой таблице

по какому столбцу лежит Второй критерий, и сколько столбцов во второй таблице

если хотите сбрасывайте в личку или на почту
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 04.04.2011, 17:36   #5
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Код:
Set dict = CreateObject("Scripting.Dictionary")
'1 table
a = Sheets(1).[a2].CurrentRegion.Value
x = 3 'сколько столбцов должно быть в массиве
Dim f()
ReDim f(1 To UBound(a), 1 To x)
For i = 2 To UBound(a)
dict.Add a(i, 1), i
f(i, 1) = a(i, 1)
Next

' 2 Table
b = Sheets(2).[a2].CurrentRegion.Value
For i = 2 To UBound(b)
If dict.exists(b(i, 1)) Then
c = dict.Item(b(i, 1))
f(с, 2) = b(i, 2) '
f(с, 3) = b(i, 3)
'f(с, x) = b(i, x) таким образом добавляете данные в массив
End If
Next
' выгрузка данных
Sheets(3).[a1].Resize(UBound(a), x) = f
примерно так
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234

Последний раз редактировалось R Dmitry; 04.04.2011 в 17:40.
R Dmitry вне форума Ответить с цитированием
Старый 04.04.2011, 17:58   #6
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

пример в xls, думаю приспособите
Вложения
Тип файла: zip Книга2.zip (12.0 Кб, 8 просмотров)
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 05.04.2011, 10:40   #7
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Большое спасибо!
Bur вне форума Ответить с цитированием
Старый 05.04.2011, 13:30   #8
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Можно небольшое пояснение к коду?
Код:
Set dict = CreateObject("Scripting.Dictionary")
'1 table
a = Sheets(1).[a2].CurrentRegion.Value 'Что за тип имеет переменная "а"? и что означает [a2], это начальная точка заполнения?
x = 3 'сколько столбцов должно быть в массиве
Dim f()
ReDim f(1 To UBound(a), 1 To x)
For i = 2 To UBound(a)
dict.Add a(i, 1), i
f(i, 1) = a(i, 1)
Next

' 2 Table
b = Sheets(2).[a2].CurrentRegion.Value
For i = 2 To UBound(b)
If dict.exists(b(i, 1)) Then
c = dict.Item(b(i, 1)) 'Это как я понимаю, номер совпавшего ключа, который для этого и вносился при добавлении Add
f(с, 2) = b(i, 2) '
f(с, 3) = b(i, 3)
'f(с, x) = b(i, x) таким образом добавляете данные в массив
End If
Next
' выгрузка данных
Sheets(3).[a1].Resize(UBound(a), x) = f
Bur вне форума Ответить с цитированием
Старый 05.04.2011, 14:28   #9
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

a- это массив данных из диапазона, dim a ()
диапазон данных формируется из дипазона данных ,
которому принадлежит ячека а2 ,
Код:
Sub fff()
Sheets(1).[a2].CurrentRegion.Select
End Sub
выполните этот код и посмотрите как выбирается диапазон данных для массива а

по второму все правильно Вы поняли, он также является номером строки массива f , в который добавляются данные

ps. то форум по access
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт значений из внешних книг Excel по списку файлов Varen1k Microsoft Office Excel 14 14.08.2018 10:09
Импорт TXT файлов в Excel Per4eLO Microsoft Office Excel 7 08.02.2017 19:33
Импорт данных c Бд(конкретной таблицы) Sql в Excel... David-D ASP.NET 1 25.02.2011 23:26
SQL-запрос в excel, или импорт данных в word Sanek_81 Microsoft Office Excel 7 10.02.2011 14:40
Импорт ТХТ файлов в Excel Sepaa Microsoft Office Excel 8 13.11.2010 22:06