Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Все тот же экспорт из Access в Excel


Автор: shurrik 6.9.2006, 05:07
Private Sub Кнопка139_Click()
Dim ExcelApp As Object, ExcelWorkbook As Object, ExcelSheet As Object
Set ExcelApp = CreateObject("Excel.Application")
'ExcelApp.Workbooks.Add
ExcelApp.Workbooks.Open "C:\Ocenka\Ocenka.xls"
Set ExcelWorkbook = ExcelApp.Workbooks(1)
Set ExcelSheet = ExcelApp.Workbooks(1).Worksheets(1)
With ExcelSheet

Здесь надо вставить код, чтобы в ячейки в Excel вставлялись данные из баззы Access'а. Вот что только не перерыл ответа так и не нашел. Были варианты, но они не подходят.


ExcelApp.Visible = True
WorkBook.Close SaveChanges:=False
Set WorkBook = Nothing
AppExcel.Quit
Set AppExcel = Nothing
End Sub

Автор: shurrik 8.9.2006, 09:10
Неужели никто не подскажет. Я вообще не программировал в Access. Програмил в других. А тут по работе надо access-овскую прогу подредактировать.

Автор: Юдифь 22.10.2006, 22:36
Не знаю, может тебе уже не нужно, но вот пример:


Код

Set rstSpis = CurrentDb.OpenRecordset("тут имя твоей таблицы")

'последовательный ввод записей из таблицы в рабочий лист
k = 1
j = 1
rstSpis.MoveFirst
    Do Until rstSpis.EOF
        For i = 0 To rstSpis.Fields.Count 
            .ActiveSheet.Cells(k, i + 1).Value = rstSpis.Fields(i).Value
        Next i
        k = k + 1
   Loop

Автор: shurrik 29.1.2007, 05:38
Пишет Compile Error: Invalid or unqualified reference и ссылается на строчку: .ActiveSheet.Cells(k, i + 1).Value = rstSpis.Fields(i).Value именно на .ActiveSheet

Добавлено @ 05:39 
в чем трабл?

Автор: dionisiu 29.1.2007, 15:35
Так код, приведённый Юдифь вставь вместо 
Цитата(shurrik @  6.9.2006,  05:07 Найти цитируемый пост)
Здесь надо вставить код, чтобы в ячейки в Excel вставлялись данные из баззы Access'а. Вот что только не перерыл ответа так и не нашел. Были варианты, но они не подходят.

а после Loop не забудь добавить End With

Автор: shurrik 30.1.2007, 04:29
Ну это и дураку понятно, что End With добавить надо  smile

Добавлено @ 04:30 
Так кто-нибудь подскажет почему ошибка вылазит? Заранее благодарен!

Автор: bopoha 4.2.2007, 15:26
Как то нелогично получается:
строка
".ActiveSheet.Cells(k, i + 1).Value ..."
с учетом with выглядит так:
"ExcelSheet.ActiveSheet.Cells(k, i + 1).Value ...."
т.е. "лист.лист.ячейка"

я бы тоже ругался, т.к.  (помойму) ActiveSheet определен только у Workbook

Итого, нужно так

".Cells(k, i + 1).Value ...."

Автор: shurrik 6.2.2007, 09:30
Все равно ругается на эту строку  smile 

Автор: bopoha 6.2.2007, 10:31
Тогда кинь БД с этой функцией и табличкой посмотрим. Никогда с подобной ошибкой не встречался.

Автор: shurrik 6.2.2007, 11:49
http://rapidshare.com/files/15152757/Ocenka.rar.html - Здесь всё. Экспорт в Excel Кнопка 160

Автор: bopoha 9.2.2007, 01:02

Код должен выглядеть так:

Код

    Do Until rstSpis.EOF
        For i = 1 To rstSpis.Fields.Count - 1
            ExcelSheet.Cells(k, i + 1).Value = rstSpis.Fields(i).Value
        Next i
        k = k + 1
        rstSpis.MoveNext
   Loop


Почему не работало:
rstSpis.Fields.Count - количество элементов, а не максимальный индекс! Поэтому элемента с номером rstSpis.Fields.Count нет. Вот и ругалось.

И еще ты забыл переходить на следующую запись: rstSpis.MoveNext.

И еще:
Объяви в начале модуля директиву Option Explicit. Она требует явного описание всех переменных. 
rstSpis нигде не объявлена. Чуть ошибешся в имени и можешь очень долго искать ошибку.

По поводу отладки:
Очень удобно пользоваться Immediate Window (Ctrl + G). Там в режиме отладки можно проверять различные выражения на работоспосоность.
Например:
?ExcelSheet.Cells(k, i + 1).Value - это заработало


?rstSpis.Fields(i).Value - это нет, значит ошибка тут!


Обработка полей, так удобней - не ошибешся:

Код

Dim fld As DAO.Field
Dim rstSpis As DAO.Recordset

...

For Each fld In rstSpis.Fields
    ...
Next fld
...


ЗЫ: Тяжело было скачивать с рапиды. Целый день парился. В след раз просто прикрепляй к сообщению файлик.

Автор: shurrik 9.2.2007, 10:37
Цитата(bopoha @ 9.2.2007,  01:02)
Код должен выглядеть так:

Код

    Do Until rstSpis.EOF
        For i = 1 To rstSpis.Fields.Count - 1
            ExcelSheet.Cells(k, i + 1).Value = rstSpis.Fields(i).Value
        Next i
        k = k + 1
        rstSpis.MoveNext
   Loop


Почему не работало:
rstSpis.Fields.Count - количество элементов, а не максимальный индекс! Поэтому элемента с номером rstSpis.Fields.Count нет. Вот и ругалось.

И еще ты забыл переходить на следующую запись: rstSpis.MoveNext.

И еще:
Объяви в начале модуля директиву Option Explicit. Она требует явного описание всех переменных. 
rstSpis нигде не объявлена. Чуть ошибешся в имени и можешь очень долго искать ошибку.

По поводу отладки:
Очень удобно пользоваться Immediate Window (Ctrl + G). Там в режиме отладки можно проверять различные выражения на работоспосоность.
Например:
?ExcelSheet.Cells(k, i + 1).Value - это заработало


?rstSpis.Fields(i).Value - это нет, значит ошибка тут!


Обработка полей, так удобней - не ошибешся:

Код

Dim fld As DAO.Field
Dim rstSpis As DAO.Recordset

...

For Each fld In rstSpis.Fields
    ...
Next fld
...


ЗЫ: Тяжело было скачивать с рапиды. Целый день парился. В след раз просто прикрепляй к сообщению файлик.

Спасибо! Большое! Заработало!  С меня бутылка smile  
Теперь нужно, чтобы этот отчет формировался по заданному месяцу и году. Можно ли как нибудь сделать это через запрос или без него? Запрос есть: Format([Принадлежность];"mm.yyyy") С помощью него формируется отчет Access'овский. Как это реализовать в коде для Excel? Заранее благодарю

Автор: shurrik 9.2.2007, 16:57
Цель: Вывести в заголовок Экселевского документа название отделения из базы Access.
Что получилось: В Excel выгрузить получилось.
Не получилось: Выбирать отделение в форме "Настройка" приходится два раза. В файле, который я выложил, т.е. в самой форме "настройка", только одно выпадающее меню. При выборе отделения (используется таблица Подразделения), в таблицу "Локальная настройка" заносится только kod, а столбец Name остается пустым. Создаю второе выпадающее меню и таблицу "Отделение". Теперь заносится и название, но в таблицу "Локальная настройка" и "Отделение" (созданая уже мною дополнительно). Но теперь приходится выбирать и в первом меню и во втором одно и то же отделение, что конечным пользователям будет неудобно. Как все сделать, используя одно меню?  Что я только не делал ничего не получается. А ведь по любому дело в какой-то мелочи.
Ниже привел код.
Для выпадающего меню 1:
В конструкторе -> Данные -> Источник строк: SELECT Подразделения.kod, Подразделения.Name FROM Подразделения ORDER BY [kod];
Данные: kod
Тип источника строк: Таблица или запрос
Для выпадающего меню 2:
В конструкторе -> Данные -> Источник строк: SELECT Подразделения.Name FROM Подразделения ORDER BY [Name];
Данные: Name
Тип источника строк: Таблица или запрос
Код нажатия кнопки в форме "Настройка": 
CurrentDb.TableDefs("Оценка").Fields("Код филиала").DefaultValue = [Forms]![Настройка]![ПолеСоСписком0]
CurrentDb.TableDefs("Отделение").Fields("Name").DefaultValue = [Forms]![Настройка]![ПолеСоСписком7]

Автор: bopoha 10.2.2007, 01:06
Цитата(shurrik @  9.2.2007,  10:37 Найти цитируемый пост)
Спасибо! Большое! Заработало!  С меня бутылка   Теперь нужно, чтобы этот отчет формировался по заданному месяцу и году. Можно ли как нибудь сделать это через запрос или без него? Запрос есть: Format([Принадлежность];"mm.yyyy") С помощью него формируется отчет Access'овский. Как это реализовать в коде для Excel? Заранее благодарю


Я не понял проблемы! Необходимо формировать запрос или на основании хранимого запроса с параметрами открывать Recordset и в путь...

Добавлено @ 01:14 
Цитата(shurrik @  9.2.2007,  16:57 Найти цитируемый пост)
Не получилось: Выбирать отделение в форме "Настройка" приходится два раза......


Брррр... ничего не понятно... но вобщем начнемс.

1. Хочешь, чтобы ты разобрался потом и тебя поняли? ПолеСоСписком0 и ПолеСоСписком7 не понятно про что. Обзывай как, напрмер, поля данных с префиксом... хоть понятней будет
Код

CurrentDb.TableDefs("Оценка").Fields("Код филиала").DefaultValue = [Forms]![Настройка]![ПолеСоСписком0]
CurrentDb.TableDefs("Отделение").Fields("Name").DefaultValue = [Forms]![Настройка]![ПолеСоСписком7]

Это же относится к меню 1 и меню 2.

2. Я так понял задачу: необходимо записать значение в поле, на основании выбранного значения из поля со списком. Решается это так:

Код

Me.P_Destination = Me.P_Source.Column(1) '-- присваиватся значение второго столбца


Делается это на событии "посел обновления" поля  P_Source.

Автор: shurrik 12.2.2007, 08:22
Цитата
Я не понял проблемы! Необходимо формировать запрос или на основании хранимого запроса с параметрами открывать Recordset и в путь...

На основании хранимого запроса.

Цитата
2. Я так понял задачу: необходимо записать значение в поле, на основании выбранного значения из поля со списком. Решается это так:
код Visual Basic 
1:
 Me.P_Destination = Me.P_Source.Column(1) '-- присваиватся значение второго столбца
Делается это на событии "посел обновления" поля  P_Source.

Да, вы правильно поняли задачу. На всякий случай прикрепил файлик программы с моими меню 1 и 2. Я вообще не программирую в Accesse, но по работе приходится. Желательно, чтобы записывалось в таблицу "Локальная настройка" или в отдельную таблицу. И вообще не пойму каким образом данные (в колонку kod) заносятся в таблицу "Локальная настройка"? Может я чего-то не туда смотрю или упускаю?

Автор: shurrik 12.2.2007, 08:23
Вторая часть архива

Добавлено @ 08:25 
Цитата
Me.P_Destination = Me.P_Source.Column(1) '-- присваиватся значение второго столбца
Делается это на событии "посел обновления" поля  P_Source.

Можно вот с этого места подробнее? 

Автор: bopoha 13.2.2007, 01:31
Не удержался и переименовал поля:
ПолеСоСписком0 - P_Podrazdeleine
ПолеСоСписком7 - P_Shapka

Вобщем необходимо добавить событие для поля P_Podrazdeleine "После обновления".
Код получился такой:
Код

Private Sub P_Podrazdeleine_AfterUpdate()
    Me.P_Shapka = Me.P_Podrazdeleine.Column(1)
End Sub

Что он делает: присваивает значение 2-й колонки из выбранной строчки в поле P_Podrazdeleine полю со списком P_Shapka,  а отсюда значение попадает прямо в таблицу. 

Автор: shurrik 13.2.2007, 02:40
Цитата(shurrik @ 12.2.2007,  08:23)
Вторая часть архива

Добавлено @ 08:25 
Цитата
Me.P_Destination = Me.P_Source.Column(1) '-- присваиватся значение второго столбца
Делается это на событии "посел обновления" поля  P_Source.

Можно вот с этого места подробнее?

Спасибо! Пошло. А как сформировать отчет в Excel за выбраный период с помощью запроса? (Я уже спрашивал раньше :-)) А есть какие нибудь статьи по экспорту в Excel? (например, закрашивание ячеек и т.п.) Можешь ссылки кинуть?

Автор: shurrik 17.4.2007, 05:40
Есть какие-нибудь идею по предыдущему сообщению?

Автор: shurrik 12.7.2007, 06:32
Товарищи программисты, неужели нету никаких мыслей? Подскажите  smile 

Автор: bopoha 12.7.2007, 08:34
Есть, вроде. я код на форуме выкладвывал, поищи. Или в ya.ru и google.com.

Автор: shurrik 12.7.2007, 08:57
Можешь ключевые слова подсказать? А то я везде искал и ничего не нашел

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)