Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
1

Макрос "Вывести в формате" xlsx ошибка более 65 тыс. записей

13.10.2013, 14:47. Просмотров 3612. Ответов 23
Метки нет (Все метки)


Подскажи, пожалуйста, почему выскакивает такая ошибка?
Пытаюсь сохранить таблицу в эксель 2007. Встречал ее уже несколько раз в разных местах

P.S. сохраняю через встроенную макрокоманду "Вывести в формате"...
0
Миниатюры
Макрос "Вывести в формате" xlsx ошибка более 65 тыс. записей  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2013, 14:47
Ответы с готовыми решениями:

Вывести нечётные числа. Ошибка: оператор "%" невозможно применить к операнду типа "string" и "int"
Я новичок в программировании, поэтому не судите строго если тут всё говно. Нужно сделать, чтобы код...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

Ввести строку. Заменить все буквы "е" и "а" в тексте на "8" , "4" и "6". Вывести на экран модифицированную строку
Ввести строку. Заменить все буквы "е" и "а" в тексте на "8" , "4" и "6". Вывести на...

Вывести данные в формате "Номер. Предложение. И еще одно целочисленное данное"
Добрый вечер. Необходимо вывести данные в формате "Номер. Предложение. И еще одно целочисельное...

23
Эксперт MS Access
26611 / 14310 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
13.10.2013, 15:04 2
Мне кажется, что есть ограничения на размер буфера. Видимо с ним вы и столкнулись.

Я, как правило, не пользуюсь буфером обмена, а вывожу в ексель с помощью CopyFromRecordset. Примерно так (для нового файла екселя)
Visual Basic
1
2
3
4
5
6
7
Dim oapp as object, owrk as object, osh as object
dim rst as dao.recordset
set rst=currentdb.openrecordset("MyQuery")
set oapp=Createobject("excel.application")
set owrk=oapp.workbooks.add
set osh = owrk.sheets.add
osh.range("a1").CopyFromRecordset rst
Для сохраненной книги ексель можно, вместо CreateObject, использовать GetObject с параметром пути

Можно также применять метод TransferSpreadsheet.
1
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
16.10.2013, 22:48  [ТС] 3
Цитата Сообщение от mobile Посмотреть сообщение
Мне кажется, что есть ограничения на размер буфера.
а я почему то не уверен, что на всех компьютеров одна и та же ошибка из-за буфера. И почему именно 65000 буфер не устраивает? Это скорее ошибка самого аксеса. Попробуйте кто-нибудь пжл выгрузить таблицу/запрос в которой примерно тысяч 100 будет строк в xlsx через макрокоманду, если получится буду сильно удивлен
0
Эксперт MS Access
26611 / 14310 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
16.10.2013, 23:03 4
Цитата Сообщение от emenem97 Посмотреть сообщение
И почему именно 65000 буфер не устраивает?
Наверное потому, что 2^16=65536. И под адрес буфера отведено 16 бит

Цитата Сообщение от emenem97 Посмотреть сообщение
Это скорее ошибка самого аксеса.
Буфер никак не принадлежит акцессу. Буфер бывает либо виндовый, либо офисный. У акса нет своего буфера.
2
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
16.10.2013, 23:06  [ТС] 5
Зачем Майкрософт создали стандартный макрос, который ни у кого не работает, не понятно...
0
7903 / 4949 / 546
Регистрация: 27.03.2013
Сообщений: 17,760
17.10.2013, 08:21 6
Цитата Сообщение от emenem97 Посмотреть сообщение
Зачем...
Наверное с учетом того, что лет через 150 уже будет работать у всех
2
3348 / 1766 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
17.10.2013, 08:43 7
mobile прав. При экспорте 70000 строк записей, вывелись только ровно 65536, остальные "обрезались".
0
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
17.10.2013, 23:08  [ТС] 8
а как с аксеса экспортировать в xlsx без буфера ? Пока у меня с этим целый велосипед, с процедуры написанной в VB.net подключаюсь к запросам/таблица и вывожу, напрямую из аксеса не знаю как, конкретно ковыряться в кодах на создание новых процедур я не силен, пользуюсь как правило готовыми, нашедшими на форуме, всего лишь частично могу переделать.

Так вот, на форуме по поиску экспорта в эксель 2007 не так уж много и тем, нашел кое-что более менее, но..не работает. Ошибка. Сам код вот:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Кнопка0_Click()
Dim ExcelApp As Object, ExcelWorkbook As Object, ExcelSheet As Object
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Workbooks.Open "D:\7777.xlsx" ' открываем файл в который будет произведена запись, его можно менять в зависимости от задачи
Set ExcelWorkbook = ExcelApp.Workbooks(1)
Set ExcelSheet = ExcelApp.Workbooks(1).Worksheets(1)
 Set rstSpis = CurrentDb.OpenRecordset("ТАБЛИЦА7777") ' Из какой таблицы будем считывать данные
 k = 0
j = 3
 rstSpis.MoveFirst
With ExcelSheet
Do Until rstSpis.EOF
For i = 3 To rstSpis.Fields.Count - 1
ExcelSheet.Cells(k + 1, i + 1).Value = rstSpis.Fields(i).Value ' производится запись в ячейки
Next i
k = k + 1
rstSpis.MoveNext
 
Loop
ExcelApp.ActiveWorkbook.Save
ExcelApp.Quit
End With
End Sub


Ругается вот на этой строке:
Visual Basic
1
ExcelSheet.Cells(k + 1, i + 1).Value = rstSpis.Fields(i).Value ' производится запись в ячейки
По коду видно, что должна таблица "ТАБЛИЦА7777" сохраниться сюда "D:\7777.xlsx"
как я понял с листом sheet. Файл подготовил создал, но не работает.
Можете подсказать?

Было бы не плохо полностью рабочий код (базу для примера) по экспорту закрепить в наработках, чтобы не было больше таких вопросов
0
3348 / 1766 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
18.10.2013, 08:30 9
Цитата Сообщение от emenem97 Посмотреть сообщение
а как с аксеса экспортировать в xlsx без буфера ?
Вам ведь написал mobile:
Цитата Сообщение от mobile Посмотреть сообщение
Я, как правило, не пользуюсь буфером обмена, а вывожу в ексель с помощью CopyFromRecordset. Примерно так (для нового файла екселя)
Visual Basic
1
2
3
4
5
6
7
Dim oapp as object, owrk as object, osh as object
dim rst as dao.recordset
set rst=currentdb.openrecordset("MyQuery")
set oapp=Createobject("excel.application")
set owrk=oapp.workbooks.add
set osh = owrk.sheets.add
osh.range("a1").CopyFromRecordset rst
0
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.10.2013, 20:34  [ТС] 10
Код сохраняет запрос "MyQuery". А в какой файл (куда)?
0
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.12.2013, 22:18  [ТС] 11
Можно подниму свою старую еще октябрьскую тему, чтобы понятнее было проблему? Ну не получается кодом выше выгрузить таблицу в аксель 2007. А уже приспичило. Я не понимаю куда там путь файла писать. Напишите, пожалуйста, процедуру целиком? С dao.recordset не сталкивался ранее и с трудом понимаю его
0
Эксперт MS Access
26611 / 14310 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
20.12.2013, 22:44 12
Здесь суть не в DAO-рекордсете, а в автоматизации. Что не имеет отношения к адо/дао. Вместо дао-рекордсета, с тем же успехом можете взять адошный.

Visual Basic
1
2
3
4
5
6
7
8
9
Dim oapp as object, owrk as object, osh as object
dim rst as dao.recordset
set rst=currentdb.openrecordset("MyQuery")
set owrk=GetObject("C:\Temp\МойФайл.xls") 'Путь к Excel-файлу
set oapp=owrk.Application
set osh = owrk.Worksheets("Лист1")   'Имя листа
osh.range("a1").CopyFromRecordset rst
oapp.Visible = True
owrk.Windows(1).Visible = True
1
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
20.12.2013, 22:59  [ТС] 13
Ругается почему то на строку
Visual Basic
1
Set owrk = GetObject("G:\МойФайл.xlsx") 'Путь к Excel-файлу
Файл есть на диске с листом Лист1

Добавлено через 1 минуту
Все получилось, это я накасячил. Спасибо
0
354 / 293 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
23.12.2013, 20:27 14
Это ограничение MS
возможен вариант записи частями по 64К
1
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
23.12.2013, 20:31  [ТС] 15
Цитата Сообщение от dimsaratov Посмотреть сообщение
возможен вариант записи частями по 64К
поподробней можно? В аксесе есть стандартная функция которая якобы позволяет выводить в xlsx формат, но на деле не работает стандартный макрос. Его как то особенно нужно использовать?
0
Эксперт MS Access
26611 / 14310 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
23.12.2013, 21:03 16
emenem97, а что не сработал CopyFromRecordset? Я пробовал, заполняет до миллиона в .xlsx.
0
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
23.12.2013, 21:09  [ТС] 17
Маленький файл вывел, большой нет. Ну я не успел еще поразбираться почему так получилось (возможно ошибка в чем то другом). Просто интересно почему Майкрософт сделали макрокоманду которая не работает и dimsaratov говорит что как то частяим можно. Я в аксесе больше стандартными инструментами (и макросами) пользуюсь, чему VBA - быстрее так и проще
0
Эксперт MS Access
26611 / 14310 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
23.12.2013, 21:18 18
Вот только что вывел в ексель 2010 рекордсет из 999 999 записей. Код аналогичный тому, что приводился выше
0
Миниатюры
Макрос "Вывести в формате" xlsx ошибка более 65 тыс. записей  
354 / 293 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
23.12.2013, 22:37 19
Функция сохранения из Access в Exel использует для этого стандартный буфер обмена у которого размер ограничен 65к

Добавлено через 1 минуту
mobile
а в 2007?
0
1298 / 504 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
25.12.2013, 18:11  [ТС] 20
Цитата Сообщение от mobile Посмотреть сообщение
Вот только что вывел в ексель 2010 рекордсет из 999 999 записей. Код аналогичный тому, что приводился выше
А у меня выводит успешно, но ровно 65536 строк, остальное обрезается.
Подозреваю что этот код именно для xls выгрузки, а не xlsx
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
Dim oapp as object, owrk as object, osh as object
dim rst as dao.recordset
set rst=currentdb.openrecordset("MyQuery")
set owrk=GetObject("C:\Temp\МойФайл.xls") 'Путь к Excel-файлу
set oapp=owrk.Application
set osh = owrk.Worksheets("Лист1")   'Имя листа
osh.range("a1").CopyFromRecordset rst
oapp.Visible = True
owrk.Windows(1).Visible = True


Вы же все таки не таким, а аналогичным говорите выгружаете? Хотя у меня проблема изначально стояла именно больше этого количества выгружать. Подскажите, пожалуйста
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2013, 18:11

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

Вывести данные в формате "метры и сантиметры"
Подскажите пожалуйста как сделать так чтобы в ответе не было округления до метров а указывались бы...

Вывести число в формате "... рублей ... копеек"
Подскажите как вывести в Excel число 178.54 в таком виде "178 рублей 54 копейки"??????????????????...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло",...

По нажатию кнопки "Дата" - текущую дату в формате "ДД, месяц_прописью, ГГГГ г."
По нажатию кнопки "Дата" - текущую дату в формате "ДД, месяц_прописью, ГГГГ г." (Пример, 15 марта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.