Всем привет, сегодня снова работаем с эксель таблицей и шаблоном в ворд, в этом видео я вам покажу как работать с большим текстом, если у нас допустим, в нашей ячейке будет содержаться текста значительно больше чем 255 символов.
С этим вы обычной можете столкнуться при создании шаблона, для экспорта данных из эксель в ворд, при замене текста, дополнительно я покажу как исправить еще одну ошибку.
Давайте возьмём пример из первого видео, перейдете по ссылке в описании на странице есть файл в архиве.
Давайте сделаем так что у нас в заголовке таблицы будет не адрес, а текст для примера. Будем практиковаться на основе ячейки C2
.
Давайте сделаем проверку длинны текста в ячейке, используя функцию ДЛСТР — длина строки. У нас здесь сейчас находится 15 символов.
Сделаем больше текста для этого я в Microsoft Word используя функцию LOREM()
, которая сформирует случайный текст.
Теперь я скопирую текст, нужен будет блокнот, вставлю текст из буфера обмена, уберу лишние отступы переносы.
Давайте посмотрим какой длины у нас получится сейчас этот текст. Так вот у нас даже не помещается текст на экране, поправим таблицу. Длина текста в ячейке 598 символов с пробелами.
Давайте перейдём в Редактор Visual Basic, alt+f11
и посмотрим код прошлого примера.
Исправим название переменной адрес на текст, здесь исправим на текст и посмотрим что у нас получится.
Теперь откроем шаблон и заменим Адрес на Текст и исправим конструкцию для замены на &text
.
Сохраним, закроем все лишнее, совместим для наглядности эксель файл и папку для вывода ворд файлов.
Посмотрим, что теперь получится, изменю масштаб, для доступа к кнопке запуска макроса.
Появляется ошибка № 5854 — слишком длинный строковый параметр.
И хотя бланк сформировался, произошло не то что ожидалось, ID
вывели, серийный номер не изменился, потому как по коду данного макроса, мы не дошли до номера мы остановились вот здесь, ошибка произошла выше.
Давайте откроем диспетчер задач, существует проблема которую мы сейчас решим, иначе у нас при любой ошибке в работе макроса в Диспетчере задач в фоне остается запущен экземпляр Microsoft Word в котором рухнул наш шаблон.
Давайте ещё раз попробуем сформировать посмотрим, что у изменится.
Опять ошибка, и сейчас в Диспетчере задач повис Microsoft Word, его нужно закрыть и так придется делать постоянно, будем снимать задачу иначе будут появляться новые ошибки.
Давайте теперь сделаем выход из нашей функции, где мои работаем, здесь у нас создание файла проходит нормально, этот кусок у нас нормально отрабатывает.
Вставим вот здесь следующий код:
On Error GoTo ErrorHadler
Это у нас метка перехода, если произойдет ошибка, мы перейдём в конец модуля, вот здесь мы сделаем Exit Sub
— Выход из модуля.
Ниже напишем ErrorHandler:
наша метка и здесь нам нужно будет вставить код сохранения, закрытия и выхода из Word.
wdDoc.Save wdDoc.Close wdApp.Quit
Также добавим сообщение
MsgBox "Не выполнено! " + Error
Вот теперь мы избавимся проблемы, когда у нас будет зависать в Диспетчере задач Microsoft Word, который мы не успеваем закрыть.
Давайте выполним макрос, появится сообщение — не выполнено слишком длинный строковый параметр, в принципе у нас документ сформировался, но он в целом не полностью отработал.
Сейчас мы исправим эту проблему, кстати гляну в диспетчер задач у нас Microsoft Word нигде не висит, и он нам не мешает. OK.
Теперь снова перейдём в редактор VBA. и разобьем переменную Text$
на фрагменты допустимой длины.
Ну кроме исправлю маленькую опечатку, тут естественно должен быть &text
.
Дайте я посмотрю, что изменится, хотя даже если мы исправили это значение, всё равно ничего не получилось.
Теперь удалим снова бланк, вернемся вот сюда, зададим переменную temp равно Left
возьмём от переменной Text$
255 символов, снова создадим переменную temp2, воспользуемся теперь функцией Mid
, мы возьмём начиная с 256 символа текст длиной 255 символов.
Теперь нужно будет продублировать здесь строку для замены значений, укажем переменные temp
, temp2
, здесь мы сделаем заменяемое значение text2
.
Сделаем с запасом, ещё разок скопирую и вставлю
temp3 = Mid(Text$, 512, 255).
Теперь мы шагнем от 256 + 255 равно 511, начиная с 512 символа мы опять шагнем на 255 символов.
Ещё продублирую строку замены, переменная temp3
, значение text3
.
Как нам указать в шаблоне заменяемые значения? А мы их ведем просто в наш шаблон, уже есть вот эта строка &text
, мы её скопируем и вставим несколько раз, дописав числа 2 и 3.
То есть у нас всякий раз вот этот фрагмент текст будет заменяться на значения из наших переменных temp
, temp2
, temp3
. Можно в коде VBA продолжать добавлять разбивку основного текста на части, но будьте внимательны, указывая смещение и длину символов. Соответствующе правки так же вносите в шаблон.
Давайте попробуем запустить и посмотрим, что получится, закрыли, свернули.
Впишемся ли мы в данное ограничение, О’кей, готово.
Так давайте наконец посмотрим, что у нас получилось, как видите текст у нас вместился полностью, единственное хочу заметить, что между предложениями появился квадрат со знаком вопроса, но это символ переноса строк, при подготовке текста в ячейке его нужно заменить пробелом.
Следующие файлы так же сформировались, но тут у нас все осталось как обычно.
Вот таким простым способом вы можете обойти эту условность, ограничение в 255 символов, в принципе сама строковая переменная Text$ может очень много вместить в себя значений, но при работе вот этой функции FindText замена текста, вот здесь, мы не можем производить большие какие-то преобразования, но вот с такой разбивкой большого текста на переменные в принципе можно это продолжать дальше.
То есть у нас 512 + 255 получается 767, следующий шаг в 255 символов можно делать с 768 знака.
У нас же есть ещё место и дальше можно продолжать опять там делать дальше разбивку, если у вас будет очень большой текст.
Исходный код из видео
Sub main() Dim wdApp As Object Dim wdDoc As Object HomeDir$ = ThisWorkbook.Path Set wdApp = CreateObject("Word.Application") i% = 2 Do If Cells(i%, 1).Value = "" Then Exit Do If Cells(i%, 1).Value <> "" Then NPP$ = Cells(i%, 1).Text ID$ = Cells(i%, 2).Text Text$ = Cells(i%, 3).Text SN$ = Cells(i%, 4).Text DataC$ = Date FileCopy HomeDir$ + "template.doc", HomeDir$ + "" + NPP$ + "_" + ID$ + "_" + DataC$ + ".doc" Set wdDoc = wdApp.Documents.Open(HomeDir$ + "" + NPP$ + "_" + ID$ + "_" + DataC$ + ".doc") On Error GoTo ErrorHandler temp = Left(Text$, 255) temp2 = Mid(Text$, 256, 255) temp3 = Mid(Text$, 512, 255) temp4 = Mid(Text$, 768, 255) wdDoc.Range.Find.Execute FindText:="&date", ReplaceWith:=DataC$ wdDoc.Range.Find.Execute FindText:="&id", ReplaceWith:=ID$ wdDoc.Range.Find.Execute FindText:="&text", ReplaceWith:=temp wdDoc.Range.Find.Execute FindText:="&text2", ReplaceWith:=temp2 wdDoc.Range.Find.Execute FindText:="&text3", ReplaceWith:=temp3 wdDoc.Range.Find.Execute FindText:="&text4", ReplaceWith:=temp4 wdDoc.Range.Find.Execute FindText:="&sn", ReplaceWith:=SN$ wdDoc.Save wdDoc.Close End If i% = i% + 1 Loop wdApp.Quit MsgBox "Готово!" Exit Sub ErrorHandler: wdDoc.Save wdDoc.Close wdApp.Quit MsgBox "Не выполнено! " + Error End Sub
Исходный код из видео — скачать архив с файлами
ZIP архив с файлами
Смотрите видео: Исправляем ошибку VBA № 5854 слишком длинный строковый параметр в шаблоне word из таблицы excel 255 символов
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
Salomon Пользователь Сообщений: 8 |
#1 20.03.2017 17:31:19 Добрый день. Есть макрос, позволяющий переносить текст из ячеек excel в вордовский шаблон. Однако, если в ячейку добавить больше 255 символов, то офис ругается и выдает ошибку «Run-time error ‘5854’: Слишком длинный строковый параметр». В инете пишут, что для лечения этой заразы необходимо сделать цикл, что у меня никак не получается. Люди добрые, помогите глупцу понять, как сделать этот самый цикл, ибо уже два дня как онный у меня не получается. Сам код и файлы прикладываю.
Изменено: Salomon — 20.03.2017 17:40:29 |
||
Salomon Пользователь Сообщений: 8 |
Файлы Прикрепленные файлы
|
Борис13 Пользователь Сообщений: 81 |
Как то удалось в итоге решить данную проблему? у самого такой же вопрос. |
Борис13 Пользователь Сообщений: 81 |
#4 20.11.2020 13:14:59 Самостоятельно решил данный вопрос. Может быть кому будет полезно:
Изменено: Борис13 — 20.11.2020 13:15:24 |
||
Тимофеев Пользователь Сообщений: 1319 |
#5 20.11.2020 13:52:57 Борис13,. а можете файлик архив правильный скинуть сюда |
- Remove From My Forums
-
Question
-
Hi,
I’m quite surprised to receive a «String too long» error when adding a new BuildingBlockEntries by code because I’m telling to add a range not a string and I have no problem to add it manually(Word interface) and besides that Building Blocks can
be very big.My code
Set objBB = objTemplate.BuildingBlockEntries.Add( Name:=txtNome, _ Type:=wdTypeCustom5, _ Category:=myCategory, _ Description:=txtDescrizione, _ Range:=myRange)
I have a table with three columns: 1°= name of BB; 2°= BB; 3°= Description.
Multiple rows.
I can iterate on all the rows to insert several BB.
For Each aRow In ActiveDocument.Tables(1).Rows ... Set MyRange = aRow.Cells(2).Range MyRange.End = MyRange.End - 1 ...
'The insert BB above next
I can’t spot the cause of the error. MyRange can contain 2,3,4 lines of text, with text and points. The Paragraph Format can be with borders and/or background colors.
Some time every things is OK, others fails
Thanks for any suggestion Lauro
-
Edited by
Monday, April 18, 2016 5:00 PM
-
Edited by
Answers
-
>>>Hi tried to save a BB from the Word interface and you cannot use a Name longer the 32 (?) charachters.
According to your description, I have reproduce this issue, based on my searching, Building Blocks/AutoText names have a maximum length of 32 characters and may include spaces. The number of entries and the length of their contents are limited only by the template
file size and available memory. So I suggest that you make Building Block name less or equal 32 character.For more information, click here to refer to this link:
http://word.mvps.org/faqs/customization/autotext.htm
In addition if you have any feedbacks for Word, please feel free to submit them to User Voice:
https://word.uservoice.com/
Thanks for your understanding.
-
Marked as answer by
David_JunFeng
Wednesday, April 27, 2016 7:29 AM
-
Marked as answer by
- Remove From My Forums
-
Question
-
Hi,
I’m quite surprised to receive a «String too long» error when adding a new BuildingBlockEntries by code because I’m telling to add a range not a string and I have no problem to add it manually(Word interface) and besides that Building Blocks can
be very big.My code
Set objBB = objTemplate.BuildingBlockEntries.Add( Name:=txtNome, _ Type:=wdTypeCustom5, _ Category:=myCategory, _ Description:=txtDescrizione, _ Range:=myRange)
I have a table with three columns: 1°= name of BB; 2°= BB; 3°= Description.
Multiple rows.
I can iterate on all the rows to insert several BB.
For Each aRow In ActiveDocument.Tables(1).Rows ... Set MyRange = aRow.Cells(2).Range MyRange.End = MyRange.End - 1 ...
'The insert BB above next
I can’t spot the cause of the error. MyRange can contain 2,3,4 lines of text, with text and points. The Paragraph Format can be with borders and/or background colors.
Some time every things is OK, others fails
Thanks for any suggestion Lauro
-
Edited by
Monday, April 18, 2016 5:00 PM
-
Edited by
Answers
-
>>>Hi tried to save a BB from the Word interface and you cannot use a Name longer the 32 (?) charachters.
According to your description, I have reproduce this issue, based on my searching, Building Blocks/AutoText names have a maximum length of 32 characters and may include spaces. The number of entries and the length of their contents are limited only by the template
file size and available memory. So I suggest that you make Building Block name less or equal 32 character.For more information, click here to refer to this link:
http://word.mvps.org/faqs/customization/autotext.htm
In addition if you have any feedbacks for Word, please feel free to submit them to User Voice:
https://word.uservoice.com/
Thanks for your understanding.
-
Marked as answer by
David_JunFeng
Wednesday, April 27, 2016 7:29 AM
-
Marked as answer by
- Remove From My Forums
Copy data from Excel to Word Document — Run-time error ‘5854’ — String parameter too long
-
Question
-
Hello Everyone.
I need a help with the VBA macro.
I have one excel file & a word file. I need the data in the excel sheet to copy in to the word document. I’d worked on it and it’s run accordingly. But when I put a long sentences in the excel’s cell, it return error and says ‘String parameter too long’
Anyone have idea or a way to solve this? Help me..
Here my files
ZIP : http://www.uploadmb.com/dw.php?id=1356662678
Notes: You need to open the excel file, in ‘Summary’ Sheet, then press the «Process Data» button and you get what i mean
TQ
Answers
-
Do a little research on ‘DocVariables’ in MS Word. When you’ve added a couple DocVariables in your Word document, run this code (run the code from Excel):
Sub PushToWord()
Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)
‘On Error Resume NextobjWord.ActiveDocument.variables(«BrokerFirstName»).Value = Range(«BrokerFirstName»).Value
objWord.ActiveDocument.variables(«BrokerLastName»).Value = Range(«BrokerLastName»).Value
objWord.ActiveDocument.variables(«Ryan»).Value = Range(«Ryan»).ValueobjWord.ActiveDocument.Fields.Update
‘On Error Resume Next
objWord.Visible = TrueEnd Sub
Of course, the ‘BrokerFirstName’ is a Named Range in Excel.
Try it and you’ll see how it works. Post back if you have specific questions.
Ryan Shuell
-
Edited by
Sunday, December 30, 2012 5:47 AM
-
Marked as answer by
Quist Zhang
Friday, January 4, 2013 7:41 AM
-
Edited by
- Remove From My Forums
Copy data from Excel to Word Document — Run-time error ‘5854’ — String parameter too long
-
Question
-
Hello Everyone.
I need a help with the VBA macro.
I have one excel file & a word file. I need the data in the excel sheet to copy in to the word document. I’d worked on it and it’s run accordingly. But when I put a long sentences in the excel’s cell, it return error and says ‘String parameter too long’
Anyone have idea or a way to solve this? Help me..
Here my files
ZIP : http://www.uploadmb.com/dw.php?id=1356662678
Notes: You need to open the excel file, in ‘Summary’ Sheet, then press the «Process Data» button and you get what i mean
TQ
Answers
-
Do a little research on ‘DocVariables’ in MS Word. When you’ve added a couple DocVariables in your Word document, run this code (run the code from Excel):
Sub PushToWord()
Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)
‘On Error Resume NextobjWord.ActiveDocument.variables(«BrokerFirstName»).Value = Range(«BrokerFirstName»).Value
objWord.ActiveDocument.variables(«BrokerLastName»).Value = Range(«BrokerLastName»).Value
objWord.ActiveDocument.variables(«Ryan»).Value = Range(«Ryan»).ValueobjWord.ActiveDocument.Fields.Update
‘On Error Resume Next
objWord.Visible = TrueEnd Sub
Of course, the ‘BrokerFirstName’ is a Named Range in Excel.
Try it and you’ll see how it works. Post back if you have specific questions.
Ryan Shuell
-
Edited by
Sunday, December 30, 2012 5:47 AM
-
Marked as answer by
Quist Zhang
Friday, January 4, 2013 7:41 AM
-
Edited by