Четене и работа с низове, по-дълги от 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