Чтение и работа со строками длиннее 255 с помощью ADODB Excel 2010 VBA

Вот вам кое-что, ребята:

Я хочу читать информацию из закрытой книги с помощью ADODB в VBA EXCEL. Бывает, что строки в ячейках в Excel иногда имеют длину больше 255.

И вот это ограничение: http://support.microsoft.com/kb/189897

"Ваши данные могут быть усечены до 255 символов, если первые 8 записей для усекаемых полей содержат 255 или меньше символов. Драйвер Microsoft Excel ODBC по умолчанию просканирует первые 8 строк ваших данных, чтобы определить тип. данных в каждом столбце ".

Для этого есть «решение»: установка значения TypeGuessRows равным нулю (0) в реестре, но:

"По соображениям производительности установка значения TypeGuessRows на ноль (0) не рекомендуется, если ваша таблица Excel очень большая. Когда это значение установлено на ноль, Microsoft Excel будет сканировать все записи в вашей таблице, чтобы определить тип данных в каждой. столбец. "

Итак, вот мой вопрос:

Есть ли способ сказать (лгать) драйверу, что он прочитал более 255 символов (кроме помещения фиктивной строки в первую строку каждого столбца или установки значения TypeGuessRows на ноль (0)).

И если я не могу; есть ли способ записать в закрытые книги Excel и сохранить изменения, чтобы я мог вставить фиктивную первую строку в верхнюю часть каждого столбца, прежде чем я прочитал информацию из закрытой книги.


person Martin Patsov    schedule 11.09.2014    source источник
comment
Вы действительно тестировали производительность с TypeGuessRows = 0? Было бы разумно сначала посмотреть, насколько сильно это влияет на производительность ...   -  person    schedule 12.09.2014
comment
Кстати. вы можете вставлять значения, используя cn.Execute("INSERT INTO [namedRange] Values ('" & String(255, "i") & "'))", но он не примет строку длиной более 255 символов, поэтому не полагайтесь на это как на решение.   -  person    schedule 12.09.2014
comment
Я не тестировал производительность с TypeGuessRows = 0, НО мои файлы очень большие, с большим количеством информации, множеством строк, некоторые из них являются общими, И я не хочу связываться с настройками реестра. Так что это не решение для меня.   -  person Martin Patsov    schedule 12.09.2014
comment
Мне интересно, почему Microsoft не решает эту глупую проблему.   -  person Yash    schedule 27.08.2019
comment
@ user2781180 Я думаю, что принятый ответ дает нам причину: старые двоичные форматы Excel постепенно устаревают. Я не ожидал, что это будет исправлено.   -  person Martin Patsov    schedule 27.08.2019


Ответы (2)


Ваш вопрос был бы очень интересным и актуальным несколько лет назад.

С 2007 г. (см. MSDN: Знакомство с Office (2007) Open XML File Formats) старые двоичные форматы Excel постепенно устаревали, оставались позади в пространстве с закрытым исходным кодом, а некоторые устаревшие API (вместе с их ограничениями) были заменены альтернативами, особенно Microsoft: Open XML SDK 2.5

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

Некоторые связанные вопросы о переполнении стека со ссылками на, возможно, полезные решения:

Некоторые связанные API (для C #), заменяющие ADODB и снимающие его ограничения:

person xmojmr    schedule 12.09.2014
comment
Большое Вам спасибо. Думаю, мне стоит начать изучать C #. Хотел бы я сделать это только с помощью VBA ... - person Martin Patsov; 12.09.2014

РЕДАКТИРОВАТЬ:

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

Если, однако, вы можете ослабить ограничение на то, чтобы никогда не открывать эти исходные файлы, тогда процесс, описанный ниже, будет работать.

Исходный ответ:

Поскольку вы уже работаете в Excel VBA и хотите добавить фиктивные строки данных, перед запросом данных добавьте в макрос следующее:

  • открыть файл изначально в Excel
  • вставьте фиктивные строки
  • закрыть и сохранить файл

Затем вы можете перейти к запросу данных из закрытых файлов Excel с помощью ADODB.

person Rachel Hettinger    schedule 11.09.2014
comment
Я хочу прочитать информацию из закрытой книги. Я хочу писать в закрытые книги Excel и сохранять изменения. Закрытая рабочая тетрадь. Я не хочу их открывать. Если бы я хотел, я бы не использовал ADODB. Спасибо за ответ. - person Martin Patsov; 12.09.2014
comment
@ МартинП. хотя описаны некоторые приемы формул, например на vba4all.wordpress.com/2013/10/11/ невидимое открытие книги в Excel (stackoverflow.com/questions/579797/) выглядит как мне самое простое решение. Возможно, весь вариант использования (не описанный в вопросе) (и его ограничения), который вы решаете, следует переосмыслить. Одним из таких вариантов может быть перекачка большого количества информации из Excel в локальный механизм SQL Express. - person xmojmr; 12.09.2014