Ошибка переменная документа не указана word
У меня есть документ с некоторыми переменными документа, и я пытаюсь использовать эти переменные в документе. Но так как переменные устанавливаются внешней системой (что не очень хорошо задокументировано), я играю в догадки. Я предполагаю, что существует переменная с «последней датой ревизии», и затем начинаю угадывать, как эта переменная могла быть вызвана.
Есть ли способ перечислить все переменные документа в документе MS Word и их значения, чтобы их можно было искать при использовании их в документе? (Я работаю над MS Office 2010)
В Word есть несколько различных типов «переменных». Есть вещи, известные как «переменные документа», но есть и другие вещи, которые я буду называть «свойствами» - я постараюсь перечислить основные типы ниже.
В Word есть несколько мест, где вы можете найти некоторые типы свойств, но для истинных «переменных» и других типов свойств, если вы не можете использовать макросы или другой код, вам нужно будет разархивировать файл .docx и посмотрите на различные файлы там.
Места, которые вы можете посмотреть в Word 2010 (здесь не отображаются переменные документа) .
а. В «Backstage» - посмотрите на вкладку «File», «Info», и вы увидите некоторые свойства, перечисленные справа. Нажмите «Показать все свойства» в нижней части списка, и вы можете увидеть больше.
б. На вкладке Вставка, группа Текст, Быстрые детали-> Свойства вы должны увидеть список «Встроенные свойства + некоторые или все свойства, вставленные Sharepoint, если это то, что вы используете.
с. В «Информационной панели документа» (DIP). Если вы этого не видите, перейдите в меню «Файл», затем «Параметры», а затем, скажем, «Панель быстрого доступа». Выберите «Выбрать команды» в разделе «Все команды», затем найдите «Свойства», выберите его и нажмите кнопку «Добавить». Вы должны увидеть значок на панели быстрого доступа, который имеет маленькое белое «i» на круглом синем фоне. Нажмите на нее, и вы увидите либо некоторые встроенные свойства (Автор, Заголовок и т. Д.), Либо некоторые свойства «Тип контента» Sharepoint, если вы используете SharePoint. Вы можете переключаться между одним из нескольких представлений. Если затем щелкнуть раскрывающийся список в верхнем левом углу DIP и выбрать «Дополнительные свойства», вы увидите диалоговое окно с несколькими вкладками, в котором отображается
некоторые "встроенные" свойства
"пользовательские" свойства старого стиля "Пользовательский".
Для всего остального вам, вероятно, придется искать в XML в .docx. Для этого сделайте копию вашего документа. Допустим, копия называется mydoc.docx. Переименуйте его в mydoc.docx.zip, откройте zip, затем найдите несколько вещей, как предложено ниже .
а. Истинные переменные документа хранятся в папке word, в файле settings.xml, в элементе с именем w: docVars. Вы должны увидеть имя и значение для каждой переменной. Вы можете вставить значения переменных документа в ваш документ, используя поле .
б. Встроенные свойства документа, в том числе такие, как автор, заголовок и т. Д. В большинстве случаев значения могут быть вставлены в документ с использованием специальных полей, таких как или, в некоторых случаях, полей . Хотя это немного грязно, есть стандартный список имен. Вы можете найти большинство значений в папке docProps в файлах core.xml и app.xml. Однако некоторые («Свойства титульной страницы»), если они используются, хранятся в одном из файлов «item.xml» (например, «item1.xml» в папке customXml).
с. «определяемые пользователем» пользовательские свойства старого стиля, которые состоят в основном из пар имя / значение, значения которых можно вставить в документ с помощью полей , например, . Они отображаются в диалоговом окне Дополнительные свойства . но в .docx они находятся в файле custom.xml в папке docProps.
д. пользовательские свойства нового стиля, также известные как «свойства Sharepoint» или «свойства типа содержимого», поскольку они часто создаются и заполняются из столбцов в списке Sharepoint. Значения хранятся в «Пользовательских частях XML» и могут быть вставлены с использованием элементов управления контентом, которые были настроены так, чтобы указывать на соответствующий бит XML. (Только Word 2007 и более поздние версии). В .docx вы найдете несколько «схем» для этих переменных и значения переменных в папке customXML, в файлах с именем «item1.xml», «item2.xml» и т. Д.
е. наконец, любой разработчик может поместить свои собственные пользовательские части XML в документ Word и подключить элементы управления контентом к элементам и атрибутам в этих пользовательских частях XML. Я не буду пытаться вдаваться в детали того, как это делается, но вы найдете данные в файлах item1.xml, item2.xml и т. Д. В customXML. Однако, чтобы найти сами элементы управления контентом, их имена и то, с чем они связаны, вам, как правило, нужно искать в папке word, например, document.xml, и, возможно, один или несколько из «header» и «footer». XML-файлы.
Отличный ответ. Спасибо! Одно примечание: «б. На вкладке« Вставка »,« Текстовая группа »,« Быстрые детали-> Свойства », вы должны увидеть список« Встроенные свойства + некоторые или все свойства, вставленные Sharepoint, если это то, что вы используете ». В моей настройке У Quick Parts, похоже, нет «Свойства»
Свойства и DocVariables выглядят довольно похоже на то, как вы можете использовать их в полях слов и VBA. Есть ли компромиссы?
У меня была похожая проблема. Произошел сбой какого-то стороннего набора инструментов, и мне нужно было установить значение переменной.
Это немного грубо, но вот некоторый код VBA, который я добавил, который перечислит все переменные в ActiveDocument.Variables коллекции;
Вы можете создать новый макрос и выбросить его туда, который должен дать вам информацию. Найдя имя интересующей вас переменной, вы можете установить его с помощью
Это довольно круто, спасибо. Очень жаль, что Microsoft не предоставила предварительно упакованное окно выбора вида, которое вы предоставляете ему коллекцию, и у вас появляется всплывающее окно с двумя столбцами, которое позволяет выбрать один или несколько элементов из коллекции (или добавить новое значение в фактической коллекции), а затем позволяет вашему коду VBA получить доступ к выбранным элементам в вызывающей подпрограмме / функции.
Сразу скажу - на файловой базе в Windows 7 этот код работает корректно. Итак, есть: W2016Server + сервер приложений 8.3.10.2580 + самописный документ, в котором есть строчка ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайлаПаспортаЗаявки); Сразу говорю - файл я проверял вот так: Тест = Новый Файл("c: emp_pm est.docx"); Если Тест.Существует Тогда - он существует, и сервер его может прочитать. С правами доступа к папкам всё ОК. На сервере установлен Office 2013 (причем я ставил и 32-битный, и 64-битный), COM-компонент ручками зарегистрировал, поэтому строчка ОбъектВорд = Новый COMОбъект("Word.Application"); теперь выполняется без ошибок. В отладчике объект виден. Так вот, спотыкаемся на строчке ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайлаПаспортаЗаявки); Если файл имеет расширение DOC - ошибка такая: <Документ.дкЗаявкаНаПроект.МодульОбъекта>: Ошибка при вызове метода контекста (Add): Произошла исключительная ситуация (Microsoft Word): Ошибка в Word. Если файл имеет расширение DOCХ - ошибка чуть другая: <Документ.дкЗаявкаНаПроект.МодульОбъекта>: Ошибка при вызове метода контекста (Add): Произошла исключительная ситуация (Microsoft Word): Приложению Word не удалось прочитать документ. Возможно, он поврежден. Попробуйте выполнить следующие действия: * Откройте файл с помощью команды ''Открыть и восстановить''. * Откройте файл с помощью конвертера резервных копий. Я уже в отчаянии, целый день мучаюсь. Сборки Офиса 2013 - от Кролика, с самыми последними обновлениями, сами понимаете, это бренд, здесь всё пучком. (На Win7 с файловой базой, где всё работает - такая же). Майкрософту я доверяю меньше, но завтра-таки попробую поставить c оригинального образа RTM. Интуиция подсказывает, что не взлетит. Подскажите, что ещё можно попробовать проверить?Документ.дкЗаявкаНаПроект.МодульОбъекта>
А если попробовать зайти на сервер и вручную открыть данный файл? Открывается нормально и содержимое отображает?
[Сборки Офиса 2013 - от Кролика, с самыми последними обновлениями, сами понимаете, это бренд, здесь всё пучком. (На Win7 с файловой базой, где всё работает - такая же). Майкрософту я доверяю меньше, но завтра-таки попробую поставить c оригинального образа RTM] Достаточно спорное утверждение. Я бы больше доверял оригинальному дистрибутиву, чем какой-то сборке, из которой вполне могли повыкидывать "ненужные" вещи.
конечно, открывает и отображает :) Я же не первый день замужем. И даже ЗапуститьПриложение(ИмяФайла), я уверен, будет работать. и папка эта - не первая, до неё я использовал подкаталог во временной папке (пробовал разные). Разумеется, права доступа - всем на всё. Ещё раз повторю, что на локальном компьютере с W7 при такой же структуре папок и том же дистрибутиве Офиса (только без сервера приложений) всё работает. Мне кажется, подвох в Windows 2016. Другой вариант - в сервере приложений. Третьего не дано.
нафиг вам этот офис вообще уперся. распаковал, засунул в xml чо хочешь, запаковал и все дела. быстро, дешево и сердито.
Курить "профиль безопасности" в программе "Администрирование серверов 1С Предприятия". По умолчанию использование COM на сервере 1С запрещено. Не советую работать с вордом екселем и тд. на сервере. Зависнет ворд вместе с ним 1с сеанс, что будете делать?
попробуйте написать сценарий и из него управлять вордлм,а уже этот сценарий запустите из 1ц,если что-то пойдет не так можно убить сценарий и ворд из самой 1с а сервер,кстати,обычно 64-битный
Подвохов там масса. Начиная от того под кем выполняется. Если ушло на сервер значит выполняется под серверным userV8 значит у него должен быть доступ к dcom объекту. Лезешь в dcom офиса и выдаешь ему там все права. Но лучше сделать по другому. docx это упакованные в zip xml. на просторах интернета есть уже готовый код. Также реализацию и можно посмотреть в 1С Договорчики. Фактически docx распаковывается, в нужном xml правится, пакуется обратно. Сам понимаешь никаких проблем с COM и офис не нужен.
изначально офис был 32-битный и была ошибка при создании ком-объекта: ОбъектВорд = Новый COMОбъект("Word.Application"); Но я вручную создал коннектор (по инструкции), и ошибка исчезла. Более того, как сказано в , я снес 32-битный Офис и поставил 64-битный - это ничего не изменило. а ссылку? У меня 15 файлов, часть в DOCX, часть в HTML, надо все их упихать в один. Я делаю это с помощью метода InsertFile. Благодарю, сейчас почитаю про эти профили. Похоже, собака зарыта именно здесь. пользователю usr1cv8 уже выданы везде все права, в том числе в COM+. Насчет XML и ZIP - это интересно, но на будущее. Я уже написал код, который быстро работает на файловой базе. Теперь задача - заставить его выполняться на сервере.
Доброго времени суток!
Я бы хотел поднять скорее идейный вопрос: Как правильно заполнять шаблон Word?
Я знаю как минимум 5 способов заполнения Word шаблона, и все 4 имеют свои недостатки, пятый же настолько ужасен, что я его даже приводить не буду. Но крови он мне попил изрядно, т.к. приходится работать с чужим кодом. И так, давайте я перечислю то что знаю и плюсы и минусы этих подходов, а вы может быть подкините ещё способов для размышления, а может быть даже посоветуете единственно верный! Думаю тема будет многим полезна.
Описываю всё по русской версии Word.
1. DocVariable
Можно вставлять в шаблон поля с типом DocVariable, давать им имена, а потом в коде обращаться к ним примерно так:
В конце надо обязательно вызвать WordDoc.Fields.Update();
Плюсы: можно включить или выключить (Alt+F9) отображение этих переменных в шаблоне. Имена переменных видны прямо в шаблоне. Можно в разные места вставлять одну и ту же переменную.
Минусы: если вдруг по какой-причине вы не присвоили в коде значение такой переменной, то в результате в документе на месте переменной будет красоваться такая ошибка: «Ошибка! Переменная документа не указана.»
2-3 FormText или Bookmarks
Эти 2 способа я объединю, т.к. они по сути одинаковы и второй полностью перекрывает третий.
Второй и опишу. В шаблон вставляется Поле FORMTEXT, ему присваивается Закладка, по которой мы и будет обращаться к полю в коде. Примерно так:
Ну и тоже самое с закладками, т.е. можно вставить в документ Закладку и почти так же к ней обращаться, только закладки не видны в Шаблоне в отличии от FormText, что не очень удобно.
Плюсы: в Шаблоне видны места вставок их отображение можно включать и отключать (Alt+F9). Если в коде мы ей ничего не присваиваем, ничего не происходит.
Минусы: что бы увидеть имя Закладки, нужно лезть в свойства Поля. Одно и тоже Поле (т.е. с одинаковой Закладкой) нельзя использовать в разных местах.
4. Replace Text
Можно из кода воссоздать вызов всем знакомой функции «Найти и заменить». В коде это всё выглядит немного громоздко, благо один раз метод написали и забыли. Но суть следующая. В Word вставляются текстовые «метки», т.е. такие сочетания, которые вы будете искать в коде и заменять. Кто-то используется для меток угловые скобки, кто-то фигурные. Не суть, главное что бы метки уникальной выделялись из текста. Т.е. вы можете вставить в документ такую метку , а в коде искать текст « » и заменять на то, что вам надо.
Плюсы: в Шаблоне явно видны как сами метки, так их имена. Можно использовать одну и ту же метку в разных местах. Если вы из кода попытаете заменить не существующую метку, ничего не произойдёт. В предыдущих случаях этот момент идёт в минус, т.к. попытка обратиться к не существующему полю вызовет ошибку, но минус так себе, поэтому я его там и не указал.
Минусы: если в коде вы по какой-то причине пропустили какую либо метку, она очень не красиво будет смотреться в результирующем документе. Сам подход архитектурно кривоват, т.е. какие-то сепец. символы для выделения меток, да и после замены какой-либо метки вы уже ничего не можете с ней сделать в Шаблоне, что тоже не очень хорошо.
А какой способ используете вы и почему? Может быть я не правильно использую какой-либо из вышеперечисленных способов и можно исключить перечисленные в нём минусы? Я лично пользуюсь первым способом, т.к. его единственный минус наиболее безобидный на мой взгляд.
Ошибка переменная документа не указана
Давайте еще раз, правильная последовательность действий:
Открываем на редактирование стандартный (работающий) шаблон, удаляем из него все лишнее, вставляем переменные (кстати удобно копировать переменную и менять ее название), сохраняем в виде шаблона (.dot), загружаем в администраторе. Копируем «переменную» из похожего отчета, заменяем нужные нам селекты и переменные.
Все должно работать.
Столкнулась с проблемой при заполнении документа .dot.
Может кто-нибудь знает, как ее обойти? Подскажите, пожалуйста.
В word передаю значения переменных (коды полей DocVariable). На месте тех переменных, которым ничего не было передано (0-ые значения) пишет «Ошибка! Переменная документа не указана.» При этом смотрю аналогичные шаблоны: в такой же ситуации поле остается просто незаполненным, без этой надписи об ошибке.
Логично, что отличие где-то в настройках Word.
В вашем случае просто видимо либо в dot нету макроса, либо он не запускается при формировании документа.
Текст макроса там примерно такой:
.
Dim fld as Fields
for each fld in activedocument.fields
x = fld.update
if not x then fld.delete
next
.
Собственно макрос вам просто эти «пустые» переменные и удалит после формирования текста документа.
Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
ИТ-записки Чорнага кашака
Язык программирования самого высокого уровня содержит всего несколько команд для управления программистами
15 мар. 2010 г.
Использование полей и закладок при работе с MS Word из Delphi
В предыдущей заметке «Поиск и замена текста в документе MS Word из Delphi» я рассказывал, как дорабатывал старый модуль, который генерирует клиентам компании письма в формате MS Word с помощью поиска и замены текста. Сдав модуль заказчикам, я в свободное от работы время, переделал его. Вместо поиска и замены использовал поля с переменными (DocVariable).
В шаблон письма с помощью макроса добавил переменные
Sub AddFields()
ThisDocument.Variables.Add «FIO», «FIO»
ThisDocument.Variables.Add «ADDRESS», «ADDRESS»
.
End Sub
и расставил поля по тексту шаблона. В макросе у метода Add первый параметр – название переменной, а второй – ее значение. Я специально сделал их одинаковыми, чтобы пользователям было проще и нагляднее редактировать шаблоны.
Затем внес изменения в методы модуля работающие с MS Word. Если опустить все детали и различную логику, то упрощенно работа с MS Word выглядит так:
Var
wa: WordApplication;
ovDotName, ovFileName: OleVariant;
i: Integer;
q: TSDQuery;
.
begin
.
wa := CreateComObject(CLASS_WordApplication) as _Application;
ovDotName := ‘какой то шаблон.dot’;
wa.Documents.Add(ovDotName, EmptyParam, EmptyParam, EmptyParam);
For i := 0 to q.FieldCount-1 do
MSWordSetVariable(q.Fields[i].FieldName, q.Fields[i].AsString);
.
ovFileName := ‘письмо любимому клиенту.doc’;
wa.ActiveDocument.SaveAs(ovFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
.
Вот такая логика у индусов, писавших этот кусок MS Word.
После присвоения значений всем переменным, осталось только дать команду полям обновиться новыми значениями переменных. Для этого в VBA у коллекции объектов полей (Fields) есть метод Update:
А для того, чтобы избежать дальнейшего обновления полей, избавимся от их связи с переменными:
У каждого структурного элемента документа (заметки, колонтитула, сноски и т.д.) своя коллекция объектов полей, поэтому, если документ, как у меня, состоит из разных структурных элементов, то методы Update и Unlink необходимо вызвать для каждого из этих элементов. Для этого перебираем все элементы коллекции StoryRanges.
procedure MSWordUpdateStoryRanges;
Var
StoryRanges: Word2000.StoryRanges;
StoryRange: Word2000.Range;
iStoryIndex: integer;
Begin
StoryRanges := wa.ActiveDocument.StoryRanges;
For iStoryIndex := wdMainTextStory to wdFirstPageFooterStory do
Try
StoryRange := StoryRanges.Item(iStoryIndex);
If StoryRange <> nil then
begin
StoryRange.Fields.Update;
StoryRange.Fields.Unlink;
While (StoryRange.NextStoryRange <> nil) do
begin
StoryRange := StoryRange.NextStoryRange;
StoryRange.Fields.Update;
StoryRange.Fields.Unlink;
end;
end;
Except
StoryRange := nil;
End;
End;
И вызываю ее перед сохранением документа.
Все бы ничего, но часть текста передаваемого из программы в MS Word необходимо было выводить жирным шрифтом. А это через переменные не сделать 🙁 В подобном случае «поиск и замену текста» можно заменить на «переход к закладке и вывод текста». Например, в шаблон вставляем закладку с именем ‘писать текст сюда’, а в программе пишем:
Вот и все 🙂
Раннее связывание и использование полей/закладок дало существенный рост скорости генерации писем. Если на 500-х различных документах этого было почти не заметно, то при генерации 15 000 документов, прирост скорости составил 30% (специально проверил несколько раз на одних и тех же исходных данных).
Каким образом можно понять какие переменные прописаны в docvariable.
Сколько и какие переменные и с какими значениями. Это где-нибудь видно?
Макросом можно ли вывести все переменные docvariable в текст (имя и значение)?
2 Ответ от yshindin 18.12.2016 21:27:35
Каким образом можно понять какие переменные прописаны в docvariable.
Сколько и какие переменные и с какими значениями. Это где-нибудь видно?
Макросом можно ли вывести все переменные docvariable в текст (имя и значение)?
Переменные - это коллекция специальных объектов, хранимых вместе с документом. Их можно создавать, изменять, удалять. Их можно применять в тексте документа, например, через поле .
Вот пример - выдать в отладочной печати все переменные документа.
3 Ответ от yshindin 18.12.2016 21:36:03
. . .
Вот пример - выдать в отладочной печати все переменные документа.
. . .
Прошу прощения, лишние строки затесались
Вот правильный код.
4 Ответ от tna 18.12.2016 21:46:18
Почему то не выводит на экран (
5 Ответ от yshindin 18.12.2016 23:10:17
Почему то не выводит на экран (
VBA выводит это в область Immediate среды отладки. Перейдите в среду VBE (Alt+F11), отобразите область Immediate, затем запустите макрос.
6 Ответ от yshindin 18.12.2016 23:14:38
Почему то не выводит на экран (
Впрочем, если в документе еще нет переменных, то ничего не будет выведено.
Попробуйте такой код:
7 Ответ от tna 19.12.2016 07:38:32
работает предпоследний макрос
Sub DocVars()
Dim i As Long
For i = 1 To ActiveDocument.Variables.count
Debug.Print ActiveDocument.Variables(i).Name & _
" = " & ActiveDocument.Variables(i).Value & VbCrLf
Next i
End Sub
yshindin спасибо
8 Ответ от Boris_R 19.12.2016 11:31:44
Очень удобную надстройку, позволяющую работать с переменными документа, закладками и свойствами (Word Variables, Bookmarks and Properties editor add-in for Word 2007 - 2016), которую разработал Graham Mayor (ник на англоязычных сайтах - gmayor) можно скачать отсюда:
внешняя ссылка
После запуска надстройки в открывшемся окне можно увидеть все переменные документа, отредактировать (при необходимости) их значения, создать новые переменные, а также работать с закладками и свойствами документа.
9 Ответ от tna 19.12.2016 12:00:21
Спасибо, но у меня 2003 (
10 Ответ от tna 20.12.2016 08:32:59
После танца с бубном удалось подключить к 2003. Очень удобная надстройка. Еще раз спасибо.
11 Ответ от tna 20.12.2016 08:36:56
Вопрос решен. Тема закрыта Всем спасибо.
Похожие темы
Переменные docvariable
Для тех, кто хочет превратить процесс создания, проверки и редактирования, оформления и форматирования текстов из рутины и нудной механической работы в удовольствие, существует прекрасная возможность перенять приемы по автоматизации работы в Ворде, а также познакомиться с тонкими и редко используемыми настройками приложения на форуме сайта Ворд Эксперт. На портале о Microsoft Office Word вы узнаете про: как в верде сделать рамку.
На форуме обсуждаются любые вопросы, связанные с программой. В первую очередь это написание всевозможных макросов и шаблонов для тех, либо иных операций. На портале о Microsoft Office Word вы узнаете про: как сделать чтобы в worde таблицы не прыгали. Участники делятся секретами настроек приложения, оптимизации своей работы, предлагают готовые решения или схемы, по которым можно разработать решения самому. На портале о Microsoft Office Word вы узнаете про: повторить введённый текст. Также в специальном подфоруме есть возможность оставить заявку с описанием своей проблемы.
страницы
авторство
Представляет переменную, храняную в документе. Переменные документов используются для сохранения параметров макроса между сеансами макроса. Объект Variable входит в коллекцию Переменные . Коллекция Переменные включает все переменные документа в документе или шаблоне.
Примечания
Чтобы вернуть один объект Variable, используйте Переменные (Index), где Index — это имя переменной документа или номер индекса . В следующем примере отображается значение переменной документа Temp в активном документе.
Номер индекса представляет положение переменной документа в коллекции Переменные . Последняя переменная, добавленная в коллекцию Переменные , — индекс No 1; вторая переменная, добавленная в коллекцию, — индекс Номер 2 и так далее. В следующем примере отображается имя первой переменной документа в активном документе.
Чтобы добавить переменную в документ, используйте метод Add из коллекции Переменные . В следующем примере к активному документу добавляется переменная документа с именем "Темп" со значением 12.
Если попытаться добавить переменную документа с именем, которое уже существует в коллекции Переменные , возникает ошибка. Чтобы избежать этой ошибки, перед добавлением новых переменных можно ввести коллекцию. Если переменная "Синий документ" уже существует в активном документе, в следующем примере ее значение составляет 6. Если эта переменная еще не существует, этот пример добавляет ее в документ и задает ее до 6.
Переменные документа невидимы для пользователя, если поле DOCVARIABLE не вставляется с соответствующим именем переменной. В следующем примере в активный документ добавляется переменная документа с именем "Темп", а затем вставляется поле DOCVARIABLE для отображения значения в переменной.
Чтобы добавить переменную документа в шаблон, откройте шаблон в качестве документа с помощью метода OpenAsDocument . В следующем примере хранится имя пользователя (в диалоговом окне Параметры ) в шаблоне, присоединенного к активному документу.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Читайте также: