2016-02-09 2 views
0

Я использую ADODB для извлечения данных из файла Excel в другой файл Excel без открытия источника. У меня есть сильное подозрение, что параметр IMEX=1 не принят в моей связи. Я начинаю мое соединение, как это:IMEX = 1, кажется, не имеет эффекта

con1.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
"Data Source=" & sFile & ";" & _ 
"Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""" 

Так что я прямо заявить, что я хочу IMEX=1 быть использованы, но я считаю, это не работает, хотя она существует в дереве свойств подключения:
connection properties - IMEX

Минимальный, полный и Проверяемость примера

1. Создайте файл C:/Temp/Source.xlsx, где вы должны ввести эти 9 значений:
Source
Сохранить и закрыть этот файл.

2. Вставьте следующий код в любом другом (новом) листе, который должен иметь лист с именем «Лист1» и запустить его:

Sub PullData() 

    Dim con1 As Object 
    Dim rst1 As Object 
    Dim sFile As String 
    Dim x As Long, Y As Long, Xupper As Long, Yupper As Long 
    Dim arrData() As Variant, arrTransp() As Variant 
    Dim rngTargStart As Range 

    Set con1 = CreateObject("ADODB.Connection") 
    Set rst1 = CreateObject("ADODB.Recordset") 
    sFile = "C:\Temp\Source.xlsx" 

    con1.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source=" & sFile & ";" & _ 
    "Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""" 

    'pulling 
    rst1.Open "SELECT * FROM [Sheet1$A1:A9];", con1, 3, 1 
    x = rst1.RecordCount '.GetRows sometimes yields "Record is too large". This line fixes it. 
    arrData = rst1.GetRows 
    rst1.Close 

    'transposing 
    Xupper = UBound(arrData, 2) 
    Yupper = UBound(arrData, 1) 
    ReDim arrTransp(Xupper, Yupper) 
    For x = 0 To Xupper 
     For Y = 0 To Yupper 
      arrTransp(x, Y) = arrData(Y, x) 
     Next 
    Next 

    'updating worksheet 
    Set rngTargStart = ThisWorkbook.Sheets("Sheet1").Range("A1") 
    rngTargStart.Resize(UBound(arrTransp, 1) + 1, UBound(arrTransp, 2) + 1).Value = arrTransp 

    con1.Close 
    Set con1 = Nothing 
    Set rst1 = Nothing 
End Sub 

После его выполнения я получаю это:
outcome

Любая идея, почему и как ее исправить? Буду очень благодарен за любые комментарии.

Полный con1.connectionstring выглядит следующим образом:

Provider = Microsoft.ACE.OLEDB.12.0; ID пользователя = Admin; источник данных = C: \ Temp \ Source.xlsx; Mode = Поделиться Deny None; Jet OLEDB: System database = ""; Jet OLEDB: путь к реестру = ""; Jet OLEDB: пароль базы данных = ""; Jet OLEDB: тип двигателя = 37; Jet OLEDB: режим блокировки базы данных = 0; OLEDB: глобальный частичный объем Ops = 2; Jet OLEDB: глобальные массовые транзакции = 1; Jet OLEDB: новая база данных Password = ""; Jet OLEDB: создание системной базы данных = False; Jet OLEDB: шифрование базы данных = False; Jet OLEDB: не копировать локаль на компактном = False; Jet OLEDB: компактный без восстановления реплик = False; Jet OLEDB: SFP = False; Jet OLEDB: поддержка сложных данных = False; Jet OLEDB: обход UserInfo Validation = False; Jet OLEDB: ограниченный DB Cac hing = False; Jet OLEDB: Bypass ChoiceField Validation = False;

Я использую Office Pro Plus 2013, 32-разрядный в Windows 7, 64-разрядный.

ответ

0

Это page объясняет это довольно хорошо. В принципе, получается, что входной столбец является числовым. Когда он добирается до строки 9 и находит текст, он может упасть и обычно будет. Поскольку IMEX установлен в 1, он не сбой и вместо этого возвращает значение null для значения. Если у вас есть 10-я строка с 8 в ней, это будет импортировано как 8 в строку 10.

Однако, если IMEX не установлен, тогда будет генерироваться ошибка, поэтому она работает как ожидалось, насколько я могу видеть ,

1

Первоначально я думал, что IMEX=1 предотвращает любую оценку любого количества значений и просто импортирует каждое значение в виде текста. По-видимому, не удается предотвратить оценку значений (по умолчанию оцениваются 8 значений). То, что на самом деле делает IMEX=1, хранит каждое значение в столбце как текст ТОЛЬКО, если определенные критерии удовлетворяются в этих 8 оцененных ячейках.Я тестировал разные наборы исходных данных, чтобы понять, как оцениваются эти 8 значений (какие значения имеют приоритет над другими при определении того, будут ли все значения в столбце рассматриваться как текст и, следовательно, импортированы). Это результат.

Текст значения> Числовые значения>текстовый формат> (Пользовательский формат)> числовой формат>отформатированные ячейки> Общий формат пустых ячеек

Значения выделены жирным шрифтом позволяет весь столбец импортировать (рассматривается как текст), только если в этих 8 оцененных ячейках нет значений более высокого приоритета. Например, если в пределах первых 8 ячеек имеется 7 пустых ячеек, которые отформатированы как текст и одна ячейка, у которой есть фактическое число внутри, вы не будете импортировать свои текстовые данные (вместо этого будут импортированы пустые значения).

Подробные результаты тестирования:

Если у вас есть какие-либо фактические текстовое значение в течение первых 8 ячеек, вы всегда удается импортировать все значения в столбце:
enter image description here
Если есть какие-либо числовое значение и не текстовые значения в пределах первых 8 ячеек, вы не импортировать текстовые значения в этом столбце (пустые значения будут импортированы, а):
enter image description here enter image description here
Теперь, если вы не имеете никакого значения s в ваших первых 8 ячеек, и по крайней мере один из них отформатирован как текст, вы будете иметь ваши текстовые значения импортируются:
enter image description here enter image description here
Если все 8 первых ячейки пусты, и если есть по крайней мере один number- отформатированные ячейки (без текста отформатированных ячеек), вы не импортировать текстовые значения в этом столбце (пустые значения будут импортированы, а): enter image description here enter image description here
Однако последний (только один числовой формат) будет успешно импортировать текстовые значения в колонке , если исходная книга не была открыта в любом экземпляре Excel во время импорта.

Тогда мы имеем пустые отформатированные ячейки (например, формат цвета) - текстовые значения в столбце будут успешно импортированы:
enter image description here
Другой случай - пустые неотформатированные клетки, но с некоторыми данных или форматов в другой колонке:
enter image description here
Наконец, если бы не было никаких данных или форматов в других столбцах (отлично очищенные строк), ваши первые строки могут исчезнуть с выхода:
enter image description here

Я пропустил пользовательские форматы, так как я думаю, что результат может зависеть от фактического формата. Мои результаты были интересными, так как когда исходная книга была открыта, я успешно импортировал текстовые данные в колонку, но когда она была закрыта, я этого не сделал. Я предполагаю, что пользовательские форматы, когда рабочая книга закрыта, могут рассматриваться как форматы чисел.
enter image description here enter image description here

Смежные вопросы