The_Prist Да, я понимаю значение директивы Option Explicit. Макрос выполняется корректно и результат так же корректен.
Проблема была в "безопасном режиме" шаблона, который открывался. В моем случае макрос открывал шаблон из указанного пути. В шаблоне в цикле делал замены в нужные места документов и затем сохранял шаблон под определенным именем. Ошибка изначально была связана с тем, что при открытии шаблона в безопасном режиме его невозможно редактировать, соответственно и делать замены в нём так же нельзя. А этот безопасный режим появился только в 2016 офисе (возможно и в 2013 он так же есть), поскольку в 2010 все открывалось нормально в обычном режиме. Стоит так же сказать, что шаблоны были в .doc формате для лучшей совместимости с более старыми офисами, поскольку макросом пользуются на самых разных ПК. Из-за этого и выползала ошибка.
Плюс я изначально все шаблоны загонял в отдельную папку на диске С. Учитывая, что макрос сейчас запускается из-под WIn 10, проблему так же создавала встроенная защита системы, поскольку она любит подтверждать через UAC все процедуры перезаписи/удаления. Поэтому и перенес папку с шаблонами в документы пользователя.
The_Prist Да, все верно, именно поэтому приходится в начале инициализировать экземпляр объекта Word.Application .WindowState = wdWindowStateNormal - на эту строку не ругается Инициализация объекта Word.Application идет в самом начале макроса. Если я убираю вот эту строку из кода
Добрый день, столкнулся со следующей проблемой в 2016 офисе.
Есть макрос, выполняющий роль заполнялки документов по шаблону. Выполняется макрос из excel файлика, среди шаблонов есть Word документы, соответсвенно приходится в самом макросе оперировать с этими word объектами через Word.Application. Макрос корректно работал на версии офиса 2010 и младше. Сейчас установили 2016 офис и возникла проблема - при выполнении одной из строк кода возникает ошибка
Код
Run-Time Error 4605
Данная команда недоступна
Начальная инициализация
Код
Dim WordApp As Object
Set WordApp = CreateObject("Word.Application")
With WordApp
.Visible = False
.WindowState = wdWindowStateNormal
.ScreenUpdating = False
End With
Проблемная функция
Код
Private Sub WordReplacement(word_selection As String, _
replacement_text As String, _
appobject As Object)
appobject .Application.Selection.Find.ClearFormatting
appobject .Application.Selection.Find.Replacement.ClearFormatting
With appobject.Application.Selection.Find
.Text = word_selection
.Replacement.Text = replacement_text
appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
End With
Проблемная строка на которой светится ошибка 4605
Код
appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Добрый день, форумчане, хотел бы узнать советы опытных по возможным вариантам оптимизации следующей задачи - в своих программках очень часто необходимо оперировать с присвоениями имен листам/книгам/файлам. Зачастую эти имена берутся определенным образом из ячеек. Однако для имен листов/книг/файлов есть ограничения - нельзя присваивать определенные символы типа кавычек и прочего.
Я написал мини-функцию, которая возвращает "отфильтрованный" от ненужных символов для сохранения. Но каждый раз смотря на неё я понимаю, что логика её работы слишком лобовая и наверняка есть более изящные методы реализации. Ниже мой вариант и описание логики.
В общем-то логика проста - функция принимает в качестве аргумента определенную строковую переменную. Внутри функции я заполняю строковый массив теми символами, от которых я хочу избавиться и передать уже "очищенный результат". Массив с нежелательными символами я просто тупо заполняю с помощью функции Chr и номером ненужного мне символа. Изначально, чтобы выбрать правильные номера Chr я тупо вывел все значения Chr(1) - Chr(256) и ненужные диапазоны номеров отметил.
Код
' ============================================================================================
' функция убирает недопустимые символы в имени файла
' ============================================================================================
Function IlligalSymbolsCut(name As String) As String
Dim i As Integer
Dim illegal_char(56) As String
'заполняем массив недопустимых символов
For i = 1 To 6
illegal_char(i) = Chr(i + 32)
Next i
illegal_char(7) = "39"
illegal_char(8) = ""
For i = 9 To 12
illegal_char(i) = Chr(i + 33)
Next i
illegal_char(13) = ""
illegal_char(14) = Chr(47)
For i = 15 To 21
illegal_char(i) = Chr(i + 43)
Next i
For i = 22 To 25
illegal_char(i) = Chr(i + 69)
Next i
illegal_char(26) = Chr(96)
For i = 27 To 31
illegal_char(i) = Chr(i + 96)
Next i
For i = 32 To 42
illegal_char(i) = Chr(i + 113)
Next i
For i = 43 To 49
illegal_char(i) = Chr(i + 128)
Next i
illegal_char(50) = ""
illegal_char(51) = ""
For i = 52 To 55
illegal_char(i) = Chr(i + 128)
Next i
illegal_char(56) = Chr(187)
'начинаем цикл по удалению недопустимых символов
IlligalSymbolsCut = name
For i = 1 To 56
IlligalSymbolsCut = Replace(IlligalSymbolsCut, illegal_char(i), "")
Next i
End Function
Господа, заранее извиняюсь за довольно дилетантский вопрос, но никак не могу разобраться что же от меня хочет компилятор и почему он не выполняет то, что я от него хочу. А хочу я следующее - чтобы в отдельную выбранную ячейку вбивалась специфическая формула, например, формула суммирования.
К примеру, есть такая вот формула
Код
Selection.FormulaR1C1 = "=SUM(R[-2]C:R[-5]C)"
Однако значения отставаний я хотел бы передавать через переменную my_direct_cell , к примеру так