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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2014, 19:59   #1
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию Как взять из Excel данные, начиная с первого столбца, средствами ADO?

На Excel-листе первый столбец пустой и ADO берёт данные с первого непустого столбца.
Можно ли указать ADO, чтобы он брал данные с первого столбца, даже если первый столбец пустой?

Зачем это надо? Макросу указывается, с каким столбцом надо работать. Например, указали столбец 2. Но если на Excel-листе первый столбец пустой, то макрос будет работать со столбцом 3.

Используемые коды по взятию данных из Excel-листа:
Код:
        myRecordSetSheet.Open Source:="SELECT * FROM [" & arrShNames(i) & "]", _
                            ActiveConnection:=myConnection, _
                            CursorType:=adOpenForwardOnly
Здесь указывается столбец 1, но берётся первый непустой столбец:
Код:
        myRecordSetSheet.Open Source:="SELECT F1 FROM [" & arrShNames(i) & "]", _
                            ActiveConnection:=myConnection, _
                            CursorType:=adOpenForwardOnly
Скрипт вне форума Ответить с цитированием
Старый 25.05.2014, 02:51   #2
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

По видимому вы используете в строке подключения HDR=NO, и первый столбец совсем пустой. Поэтому и не берёт. Видимо особенность драйвера для Excel - всё же Excel не совсем полноценная база данных. Чтобы драйвер воспринимал столбец необходимо иметь где-нибудь в нём какое-нибудь данное.
Например, в А1 бла-бла
Тогда, при HDR=NO, и указании таблицы, допустим, [Лист1$A3:C10000], первый столбец воспринимается как текстовый длинной 255 символов.
Если есть возможность, то первой строке используйте названия столбцов, а в подключении укажите HDR=YES.
AndVGri вне форума Ответить с цитированием
Старый 25.05.2014, 08:02   #3
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

AndVGri, первый столбец совсем пустой. В программе "Excel" считается нормальным, если какие-то столбцы пустые. Иногда даже делают некоторые столбцы пустыми, чтобы лучше выглядела таблица и было удобно пользоваться таблицей.

Возможности нет использовать в пустом столбце заголовок столбца или записать текст "бла-бла".

Вот такой код я использую и данные берутся с первого непустого столбца:
Код:
Sub Procedure_1()
    
    'Полное имя Excel-файла, из которого нужно взять данные
    Const myFullName As String = "C:\Users\User\Desktop\База данных.xlsx;"
        
    'Библиотека "Microsoft ActiveX Data Objects версия Library".
    Dim myConnection As ADODB.Connection
    Dim myRecordSet As ADODB.Recordset
    
    
    'Создание объекта "Connection".
    Set myConnection = CreateObject(Class:="ADODB.Connection")
    
    'Указание полного имени Excel-файла и версии Excel-файла.
    myConnection.ConnectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & myFullName & _
        "Extended Properties=""Excel 12.0 Xml;HDR=Yes"""

    'Открытие Excel-файла.
    myConnection.Open
    
    'Создание объекта "Recordset".
    Set myRecordSet = CreateObject(Class:="ADODB.Recordset")
    
    'Указываем, из какого листа и какие столбцы взять.
    myRecordSet.Open Source:="SELECT * FROM [Лист1$]", _
                        ActiveConnection:=myConnection, _
                        CursorType:=adOpenForwardOnly
    
    'Вывод кол-ва полей (поля в повседневности называются "столбцы")
        'в View - Immediate Window.
    Debug.Print myRecordSet.Fields.Count
    
    'Закрытие Excel-файла
    myConnection.Close
    
End Sub
Такой код:
Код:
    'Указываем, из какого листа и какие столбцы взять.
    myRecordSet.Open Source:="SELECT F1 FROM [Лист1$A:C]", _
                        ActiveConnection:=myConnection, _
                        CursorType:=adOpenForwardOnly
тоже не решает задачу, кроме того, появляется ошибка "Отсутствует значение для одного или нескольких требуемых параметров".


Примечание

Для работы кода нужно подключить библиотеку:
Tools - References... - Microsoft ActiveX Data Objects версия Library.

Последний раз редактировалось Скрипт; 25.05.2014 в 08:09.
Скрипт вне форума Ответить с цитированием
Старый 25.05.2014, 13:55   #4
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

попробуйте сделать нужный диапазон именованным и обращаться к нему
Код:
select f1 from data
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 25.05.2014, 17:33   #5
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

R Dmitry, да, Ваш способ работает, но применить его я не смогу, т.к. не управляю Excel-файлами, которые являются базами данных.

Могу обрабатывать Excel-файлы, которые являются базами данных, только в том виде, в котором они есть.
Скрипт вне форума Ответить с цитированием
Старый 25.05.2014, 18:20   #6
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

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

Да ... еще вопрос.
Зачем использовать позднее связывание если подключена соответствующая библиотека?
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 25.05.2014, 18:51   #8
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
Зачем использовать позднее связывание если подключена соответствующая библиотека?
  1. чтобы отключить потом библиотеку и меньше вносить изменения в
    макрос;
  2. чтобы в макросе был синтаксис позднего связывания, т.к. позднее связывание может отличаться от раннего и просто так нельзя внести изменения, а нужно искать где-то информацию.

Последний раз редактировалось Скрипт; 25.05.2014 в 18:56.
Скрипт вне форума Ответить с цитированием
Старый 25.05.2014, 18:53   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
Ну у баз данных все должно быть одинаково )
-----------
Попробуйте контролировать количество полей, и уже исходя из результата обрабатывайте нужное поле в рекордсете.
В Excel может быть много всего в отличие от обычной базы данных, например, в отличие от баз данных программы "Access". Поэтому в Excel базы данных не могут быть всегда одинаковые.

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

Последний раз редактировалось Скрипт; 25.05.2014 в 18:58.
Скрипт вне форума Ответить с цитированием
Старый 26.05.2014, 11:41   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Я не могу никак влиять на Excel-файлы, которые представляют собой базы данных, - их формируют другие люди и я не могу никак влиять на этих людей. Что в этих Excel-файлах, которые представляются собой базы данных, может быть - я не знаю.
Тогда отказаться от SQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как взять из Excel данные, начиная с первого столбца, средствами ADO? Скрипт Microsoft Office Excel 0 21.05.2014 12:21
Как отсортировать данные начиная с восьмого разряда? Дмитрий177 Microsoft Office Excel 7 29.01.2011 04:43
Как средствами VBA экспортировать данные из Excel в Word? Pavel_Ine Microsoft Office Excel 3 20.04.2009 14:14
В прямоугольной матрице переставить столбцы так, чтобы сумма элементов столбца росла от первого столбца Aleo13 Помощь студентам 5 15.10.2008 18:34