2015-06-03 1 views
0

Я хотел бы использовать SQL для перемещения данных из листа в лист в той же книге.Использование SQL для копирования данных из рабочих листов на другие рабочие листы в одной книге?

Мои листы большие (ширина & глубина) и совмещение с VBA происходит медленно.

Сценарий состоит в том, что у меня есть листы с 1 по 5.
Я хочу создать лист (6) с колонкой или двумя листами 1 -5.
Ключ индекса является SKU и является общим для всех листов. Все листы сортируются по SKU для начала.

Когда я хватаю колонку в Листе (1), я могу просто положить ее в Лист (6), Столбец А. Когда я хватаю колонку на листе (2), я должен быть уверен, что SKU каждой строки соответствует и что данные из листа (2) и правильно помещены в следующий столбец для этого SKU. Если данные для этого SKU недоступны, соответствующая ячейка остается ПУСТОЙ. Данные из каждого столбца хранятся вместе в одном выбранном столбце на целевом листе.

Я не уверен, как настроить параметры соединения или набора записей, так как мы работаем в одной книге. Я не могу найти эту тему в любом месте. Обеспечение того, чтобы SKU получал правильные данные со всех листов, кажется мне немного сложным.

Я, кажется, что-то помню о невозможности установить соединения ADO для открытия книг/листов. Если это так, я создам отдельную книгу для извлечения данных и манипуляции там.

Буду признателен за любые рекомендации по этому вопросу. Для меня это все новое основание.

Спасибо, CraigM

+0

Долгосрочное решение может потребоваться переместить все это в базу данных –

ответ

0

Ниже решение я создал:
я получил sheet1, Лист2, как описано ниже изображений:
Sheet1 Sheet2
Чтобы скопировать с помощью SQL, следующий код был использован:
Примечание: вам нужно перейти в Инструменты> Справка> проверить объекты данных Microsoft ActiveX 2.8 Библиотека библиотеки и Microsoft Forms 2.0

Sub SQLCopy() 


Dim MyConnection As ADODB.Connection 
Dim MyRecord As ADODB.Recordset 

Set MyConnection = New ADODB.Connection 
Set MyRecord = New ADODB.Recordset 

' This is the Excel 97-2003 connection string. It should also work with 
' Excel 2007 onwards worksheets as long as they have less than 65536 
' rows 
With MyConnection 
    .Provider = "Microsoft.Jet.OLEDB.4.0" 
    .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ 
     "Extended Properties=Excel 8.0;" 
    .Open 
End With 

MyRecord.Open "SELECT [Sheet1$].[SKU],[SecondDATA] FROM [Sheet1$],[Sheet2$] WHERE " & _ 
    "[Sheet1$].[SKU] = " & _ 
    "[Sheet2$].[SKU]", MyConnection 

Sheets("Sheet3").Cells(2, 1).CopyFromRecordset MyRecord 

MyRecord.Close 
MyConnection.Close 

End Sub 


Ниже приведен результат на листе 3
Sheet3

+0

.open Ошибка выполнения '3706': поставщик не найден. Я использую этот код; С objConnection .Provider = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Источник данных =" & "F: \ Temp04 \ 2015-06-16-00, BirdFeetPricing.xlsm" & "; "& _ " Расширенные свойства = "" Excel 12.0; HDR = Да ""; " . ConnectionString = "Data Source =" & ThisWorkbook.FullName & "; "&" Расширенные свойства = Excel 12.0; " .Открыть Конец с – CraigM

+0

Я бегу на 64-битной машине .... это может изменить ситуацию. – CraigM

+0

Отсутствие 64 бит не является проблемой. Я использовал провайдера ACE в коде ранее в той же программе. Мне чего-то не хватает, но я не знаю, что. – CraigM

0

Прекрасный раствор, Keong kenshih!

Я смотрел через документацию Microsoft и, читая ее, указывает, что вы не можете использовать SQL в открытых книгах.

Благодарим за доказательство кода концепции. Я собираюсь включить его в свой проект в ближайшие пару дней. Должно обеспечить значительное улучшение производительности.

Я перейду от использования поставщика .jet к провайдеру .ace для совместимости с более новыми версиями Excel.

Nick.McDermaid: я не могу переместить все данные в базу данных, так как данные часто обновляются в Excel. Мне повезло, что у клиента даже есть Excel, они так обратные. У них нет понятия базы данных.Они застряли в 1970-х годах с Yahoo.

Еще раз спасибо за комментарии!

+0

Я смущен. Я запускаю точный код, впервые предложенный keong kenshih. Я получаю странную ошибку в инструкции MyRecord ниже. Эта ошибка: «Аргументы имеют неправильный тип, находятся вне допустимого диапазона или находятся в конфликте друг с другом». Я дошел до создания Sheet1, Sheet2 и Sheet3, у листов 1 и 2 есть данные по ним. MyRecord.Open "SELECT [Sheet1 $]. [SKU], [SecondDATA] FROM [Sheet1 $], [Sheet2 $] WHERE" & _ "[Sheet1 $]. [SKU]" = "[Sheet2 $]. [ SKU] ", objConnection – CraigM

+0

Я изменил свои листы, чтобы проверить ваш код. Я получаю сообщение об ошибке «Нет значения для одного или нескольких требуемых параметров». Я потерян, я не могу найти много документации по SecondData. MyRecord.Open "SELECT [Sheet1 $]. [SKU], [SecondDATA] FROM [Sheet1 $], [Sheet2 $] WHERE [Sheet1 $]. [SKU] = [Sheet2 $]. [SKU]", MyConnection – CraigM