На днях столкнулся с ошибкой "Run-time error '2391'", на которую потратил кучу времени, не говоря уже о нервах =) Суть проблемы в следующем: Допустим, нужно импортировать данные таблички из Excel в Access. Для этого имеем такую вот структуру в Excel (см.рисунок). Для того, чтобы импорт свершился нужно создать такую же табличку с такими же заголовками полей в Access.
Все, структура данных в Excel есть, таблица для импорта в Access создана. Фактически, теперь все приготовления закончены. А теперь при помощи вот такой вот строки в коде должен произойти импорт данных из нашей таблички Excel в табличку table_1 в Access: DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "table_1", "путь_к_файлу_Excel", True, "Имя_листа_Excel$" И вроде бы все должно работать, ан нет! Получаем примерно следующее заявление: Конечно, первое, что приходит на ум - проверить соответствие названий столбцов в Excel и в таблице Access. Чаще всего находятся наименования, которые не соответствуют друг другу. В этом случае исправляем их, чтобы названия были идентичными, и - вуаля! - все работает. А если все поля друг другу соответствуют, но ошибка все равно возникает? А вот тут может иметь место следующий нюанс. Excel при импорте, так сказать проверяет наличие информации в ячейках и составляет для себя таблицу импорта. Технически может быть по-другому, но для понимания удобней всего такое сравнение. Так вот, возвращаясь к примеру выше, если вдруг в ячейке столбца "F" или "G" затесался какой-нибудь невидимый символ, например пробел, то Excel автоматом включит эти столбцы в свою таблицу импорта. Естественно, что этих столбцов в таблице Access не предусмотрено. То есть получится, что из Excel импортируется больше столбцов, чем есть в результирующей таблице table_1. Именно по этой причине нам в этом случае и выдается ошибка 2391. Для того, чтобы все наладить, нужно удалить пустые столбцы справа от таблицы. Макросом это можно сделать вот так: Columns("F:G").Select Selection.Delete Shift:=xlToLeft или так: Columns("G:I").Delete Shift:=xlToLeft В крайнем случае, всегда можно проделать данную операцию вручную, выбрав нужные столбцы -> правой кнопкой мыши -> "Удалить".
|