На Excel-листе первый столбец пустой и ADO берёт данные с первого непустого столбца. Можно ли указать ADO, чтобы он брал данные с первого столбца, даже если первый столбец пустой?
Зачем это надо? Макросу указывается, с каким столбцом надо работать. Например, указали столбец 2. Но если на Excel-листе первый столбец пустой, то макрос будет работать со столбцом 3. Используемые коды по взятию данных из Excel-листа:
PowerBoy, я пока не тестировал Ваш вариант (позже попробую).
Я указывал "F1", но данные всё равно брались из первого непустого столбца. Попробую Ваш вариант, когда после "FROM" указывать не просто имя листа, а имя листа и столбцы.
Вы на ходу меняете структуру таблицы - заголовок, понятно что оно не найдет новое поле так, как Excel в начале соединения запомнил уже все имена полей. Как минимум надо пересоздать соединение с источником данных.
Средствами ADO Вы не создадите новый лист с заголовками, только VBA-Excel. Если у Вас такие заморочки с этими заголовками, читайте таблицы(лист) вообще без них, тогда поля у Вас всегда будут F1,F2....FN.
PowerBoy, но на вопрос этой темы так и нет ответа. В сообщении #7 Вы написали, я так понял, что нужно узнать сколько столбцов в Excel-файле, а дальше что сделать? Как узнать, какой столбец ADO посчитал первым?
PowerBoy, но можно узнать про те поля (под полем я понимаю столбец), в которых есть данные. Если поле полностью пустое, то никакой информации об этом поле нет.
А мне надо узнать, например, какой порядковый номер первого непустого столбца на Excel-листе.
For i = 0 To GetFieldsTable.Fields.Count - 1
.Cells(1, i + 1).Value = GetFieldsTable.Fields(i).name
Next
j = 2
Do While Not GetFieldsTable.EOF()
For i = 0 To GetFieldsTable.Fields.Count - 1
.Cells(j, i + 1).Value = GetFieldsTable.Fields(i).Value
Next
j = j + 1
GetFieldsTable.MoveNext
Loop
Set myRecordSet = _
myConnection.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Лист1$"))
формирует таблицу "myRecordSet", в которой 28 столбцов. В каждой строке таблицы "myRecordSet" содержится информация по одному столбцу листа "Лист1". Столбцы берутся с первого непустого до последнего непустого, включая полностью пустые столбцы, которые находятся в этом интервале.
Но у меня задача узнать про пустые столбцы, которые находятся в начале Excel-листа, чтобы сделать какой-то вывод о том, что происходит на Excel-листе.
Я бы на Вашем месте забил на заголовки. В строке соединения поставил "HDR=No". Запрос был бы вида "SELECT * FROM [Лист1$A2:C10000]" - гдe уже точно F1-всегда будет столбец А, F2 - B ит.д.
Если нет четких правил формирования файла, выступающем, как источник неких данных, метод получения данных с помощью ADO можно засунуть в топку ------------ Поменяйте подход, либо придется налаживать правильную организацию входных данных.
PowerBoy, нет, такое тоже не даёт нужный результат. Столбец A пустой и возвращается кол-во столбцов "2", а нужно чтобы было "3":
Код
Код
Sub Procedure_1()
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=No"""
'Открытие Excel-файла.
myConnection.Open
'Создание объекта "Recordset".
Set myRecordSet = CreateObject(Class:="ADODB.Recordset")
'Указываем, из какого листа и какие столбцы взять.
myRecordSet.Open Source:="SELECT * FROM [Лист1$A2:C3]", _
ActiveConnection:=myConnection, _
CursorType:=adOpenForwardOnly
'Вывод кол-во столбцов таблицы "myRecordSet" в View - Immediate Window.
Debug.Print myRecordSet.Fields.Count
End Sub
B.Key, я решил использовать ADO, т.к. надо взять данные из большого кол-ва Excel-файлов (около 1 тысячи файлов). Чем можно заменить в этом случае ADO, чтобы макрос быстро работал?
PowerBoy пишет: А зачем Вам первый столбец, если он пустой? К остальным Вы можете обращаться по имени.
В сообщении #1 написана причина. Имена у столбцов тоже не известно, какие могут быть, и я не могу влиять на имена столбцов. На Excel-файлы я никак не могу влиять, могу только брать из них данные из нужных столбцов.