Страницы: 1
RSS
Как взять из 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
Изменено: Скрипт - 23.05.2014 18:12:36
 
Укажите столбцы:
Код
SELECT поле1,поле2,поле3 FROM [Данные$a:c] 
Excel + SQL = Activetables
 
PowerBoy, это если у первого столбца есть заголовок. А если нет заголовка?

Или после "FROM" нужно указать конкретные столбцы, а не просто имя листа?
Изменено: Скрипт - 23.05.2014 15:02:54
 
Цитата
Скрипт пишет: PowerBoy, это если у первого столбца есть заголовок. А если нет заголовка?
Будет F1
Excel + SQL = Activetables
 
PowerBoy, я пока не тестировал Ваш вариант (позже попробую).

Я указывал "F1", но данные всё равно брались из первого непустого столбца. Попробую Ваш вариант, когда после "FROM" указывать не просто имя листа, а имя листа и столбцы.
Изменено: Скрипт - 23.05.2014 15:07:23
 
PowerBoy, нет, не работает Ваше решение.
Делаю так:
Код
    myRecordSet.Open Source:="SELECT * FROM [Лист1$A:C]", _
                        ActiveConnection:=myConnection, _
                        CursorType:=adOpenForwardOnly
берутся данные, начиная с первого непустого столбца.
Делаю так:
Код
    myRecordSet.Open Source:="SELECT F1 FROM [Лист1$A:C]", _
                        ActiveConnection:=myConnection, _
                        CursorType:=adOpenForwardOnly
возникает ошибка "Отсутствует значение для одного или нескольких требуемых параметров".
Изменено: Скрипт - 23.05.2014 18:13:20
 
Вы на ходу меняете структуру таблицы - заголовок, понятно что оно не найдет новое поле так, как Excel в начале соединения запомнил уже все имена полей.
Как минимум надо пересоздать соединение с источником данных.
Excel + SQL = Activetables
 
PowerBoy, Вы предлагаете вносить изменения в Excel-файлы, а потом работать с ними как с базами данных? Я правильно понял?
 
Вы ведь работаете через ADO, там и так лист книги считается таблицей данных. Книгу можно считать базой данных.
Excel + SQL = Activetables
 
PowerBoy, Вы предлагаете, прежде, чем что-то сделать с Excel-файлом, сначала внести изменения в Excel-файл, а потом начать с ним работать? Например,
  1. макрос открывает Excel-файл;
  2. макрос делает заголовки в Excel-файле;
  3. макрос закрывает Excel-файл;
  4. макрос открывает Excel-файл с помощью ADO.
Такой алгоритм Вы предлагаете?
 
Файл Excel закрывать необязательно, а вот соединение к нему пересоздать - да.
Excel + SQL = Activetables
 
PowerBoy, в сообщении #10, есть алгоритм. Пункт 2 должен сделать ADO или обычные VBA-Excel-средства?
 
Средствами ADO Вы не создадите новый лист с заголовками, только VBA-Excel.
Если у Вас такие заморочки с этими заголовками, читайте таблицы(лист) вообще без них, тогда поля у Вас всегда будут F1,F2....FN.
Excel + SQL = Activetables
 
PowerBoy, но на вопрос этой темы так и нет ответа.
В сообщении #7 Вы написали, я так понял, что нужно узнать сколько столбцов в Excel-файле, а дальше что сделать? Как узнать, какой столбец ADO посчитал первым?
Изменено: Скрипт - 26.05.2014 14:16:13
 
Ну Вы можете и структуру узнать, например всех полей таблиц книги:
Код
Set GetFieldsTable = .Connection.OpenSchema(4) 
Excel + SQL = Activetables
 
PowerBoy, но можно узнать про те поля (под полем я понимаю столбец), в которых есть данные. Если поле полностью пустое, то никакой информации об этом поле нет.

А мне надо узнать, например, какой порядковый номер первого непустого столбца на Excel-листе.
Изменено: Скрипт - 26.05.2014 14:40:02
 
В продолжение поста 15
Код
Set GetFieldsTable = .Connection.OpenSchema(4, Array(Empty, Empty, ИмяЛиста))
ИмяПервогоПоля = GetFieldsTable.Fields(0).name 
Excel + SQL = Activetables
 
PowerBoy, у меня такое выдал вот этот код:
Код
GetFieldsTable.Fields(0).name
"TABLE_CATALOG"
Через "TABLE_CATALOG" можно узнать информацию о листе?
 
Да
ИмяЛиста на конце надо с $ писать
Excel + SQL = Activetables
 
Наврал я с кодом - вот полностью:
Код
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 
Excel + SQL = Activetables
 
PowerBoy, такой код:
Код
    Set myRecordSet = _
        myConnection.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Лист1$"))
формирует таблицу "myRecordSet", в которой 28 столбцов.
В каждой строке таблицы "myRecordSet" содержится информация по одному столбцу листа "Лист1". Столбцы берутся с первого непустого до последнего непустого, включая полностью пустые столбцы, которые находятся в этом интервале.

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

Т.е. ответа на вопрос этой темы нет.
Изменено: Скрипт - 27.05.2014 13:35:26
 
Я бы на Вашем месте забил на заголовки. В строке соединения поставил "HDR=No". Запрос был бы вида "SELECT * FROM [Лист1$A2:C10000]" - гдe уже точно F1-всегда будет столбец А, F2 - B ит.д.
Excel + SQL = Activetables
 
Если нет четких правил формирования файла, выступающем, как источник неких данных,
метод получения данных с помощью ADO можно засунуть в топку :)
------------
Поменяйте подход, либо придется налаживать правильную  организацию  входных данных.
Скрытый текст
 
PowerBoy, нет, такое тоже не даёт нужный результат. Столбец A пустой и возвращается кол-во столбцов "2", а нужно чтобы было "3":
Код
Изменено: Скрипт - 27.05.2014 13:55:51
 
B.Key, я решил использовать ADO, т.к. надо взять данные из большого кол-ва Excel-файлов (около 1 тысячи файлов). Чем можно заменить в этом случае ADO, чтобы макрос быстро работал?
 
А зачем Вам первый столбец, если он пустой? К остальным Вы можете обращаться по имени.
Excel + SQL = Activetables
 
PowerBoy, уберите из подписи адрес сайта.
 
Цитата
PowerBoy пишет:
А зачем Вам первый столбец, если он пустой? К остальным Вы можете обращаться по имени.
В сообщении #1 написана причина.
Имена у столбцов тоже не известно, какие могут быть, и я не могу влиять на имена столбцов. На Excel-файлы я никак не могу влиять, могу только брать из них данные из нужных столбцов.
 
Код
getobject
 
B.Key, попробую "GetObject" использовать.
Страницы: 1
Наверх