If TypeOf Application.ActiveWindow Is Outlook.Inspector Then _
Set obj = Application.ActiveInspector.CurrentItem
If Not obj Is Nothing Then
If Not obj.Subject = NewSubject Then
obj.Subject = NewSubject
obj.Save
End If
End If
' 1 - нижняя граница массива, 5 - верхняя граница массива
Dim arr(1 To 5) As Integer
' Если не объявлять нижнюю границу,
' то по умолчанию в Excel нижняя граница массива будут начинаться с 0 до 5
ReDim
. Параметр Preserve
можно опустить:Dim arr() As Integer
b = 5
' Параметр Preserve нужен для сохранения значений в массиве при изменении верхней границы
ReDim Preserve arr(1 To b)
Chr(160)
и Chr(30)
.43003
и значение Дата_2 равно 44764
, то в формула ниже посчитается с ошибкой (будет значение ИСТИНА):{ IF { MERGEFIELD Дата_1 \@"DD.MM.YYYY' г.'" \* MERGEFORMAT } = { MERGEFIELD Дата_2 \@"DD.MM.YYYY' г.'" \* MERGEFORMAT } "ИСТИНА" "ЛОЖЬ" }
Option Explicit
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
Sub Replacement_tags()
Dim Content_Find As Find ' Объект Find
Set Content_Find = ActiveDocument.Content.Find
With Content_Find ' Найти маркер
.ClearFormatting: .Replacement.ClearFormatting ' Очистить формат
.MatchWildcards = False ' ВАЖНО! Отключить Подстановочные знаки
.Text = "[Шапка]": .Replacement.Text = "Начальнику управления..."
.Execute Forward:=True, Replace:=wdReplaceAll ' Заменить все маркеры [Шапка]
' Хитрость: перемещение курсора в конец заменённого текста
.Execute FindText:=.Replacement.Text, _
Forward:=True, Wrap:=wdFindStop, Replace:=wdReplaceNone
.Parent.Select ' Выделяем текст для управления курсором
'Selection.Collapse Direction:=wdCollapseEnd ' Курсор в конец найденного
End With
End Sub
.Replacement.Text = "Начальнику управления..." & String(3, Chr(13)) & "Начальнику управления..."
или вводить количество дублей в переменную Text
перед заменой:' Chr(13) - код символа возврата каретки. В других языках более привычная запись "\r"
CapText = "Начальнику управления..."
CapСount = InputBox("Введите количество 'Шапок'", , 1)
If Not CInt(Val(CapСount)) = CapСount Then _
MsgBox "Введите целое число", vbCritical: Exit Sub _
Else Text = CapText
While CapСount > 1
Text = Text & String(3, Chr(13)) & CapText
CapСount = CapСount - 1
Wend
' Используем хитрость из п.1, если планируем создать таблицу в месте маркера
Set tblNew = ActiveDocument.Tables.Add(Selection.Range, 3, 2)
With tblNew
.Columns(1).PreferredWidth = CentimetersToPoints(4) ' Колонка 1, Ширина 4 см
.Borders(wdBorderTop).LineStyle = wdLineStyleNone ' Границы таблицы, например
.Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle
.Borders(wdBorderVertical).LineStyle = wdLineStyleDot
For i = 1 To 2
.Cell(1, i).Range.Text = "Строка 1; #" & i
Next i
.Cell(1, 1).Range.InsertAfter Chr(13) & "Строка 2" ' Добавить текст
.Cell(tblNew.Rows.count, tblNew.Columns.count).Range.InsertAfter "Последняя ячейка"
End With
Private Sub Document_Open()
Replacement_tags ' Процедура из п.1
End Sub
Данные для заполнения шаблона можно поместить в отдельный файл.
- Открыть MS Word, в тексте написать маркер [Шапка]
- Открыть VBA в приложении (Alt+F11)
- Выбирать в меню Insert -> Module
- Вставить процедуру (из п.1)
- Нажать F5 (запустится процедура, в которой установлен курсор)
Selection
. Код для VBA:Option Explicit
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
Sub Replacement_tags()
Dim Content_Find As Find ' Объект Find (в VBScript переменные объявляются без указания типа)
Const wdFindContinue = 2 ' для VBScript
Const wdReplaceAll = 1 ' для VBScript
' Set objWrd = CreateObject("Word.Application") ' В MS Word объявлять не нужно
' в VBScript всё равно придётся открывать файл, так что objDoc = objWrd.ActiveDocument
' Set objDoc = objWrd.Documents.Open(Filename:="C:\FullName.doc")
Set Content_Find = ActiveDocument.Content.Find ' в VBScript - objDoc.Content.Find
With Content_Find ' Найти метку
.ClearFormatting: .Replacement.ClearFormatting ' Очистить формат
.MatchWildcards = False ' ВАЖНО! Отключить Подстановочные знаки
.Replacement.Font.Color = wdColorAutomatic ' wdColorAutomatic = -587137025
.Text = "p***p": .Replacement.Text = "newText"
.Execute2007 Forward:=True, Replace:=wdReplaceAll, Wrap:=wdFindContinue
End With
' Подсветить ".Text" в документе Word 2007+ (визуальная отладка)
With Content_Find ' Отменяется после метода "Execute" или "ClearHitHighlight"
.Parent.HomeKey wdStory ' wdStory = 6
.HitHighlight .Text, wdColorTan ' wdColorTan = &H99CCFF
End With
End Sub
.Selection.EndKey
не нужен, т.к. в вашем примере указана замена по всему тексту (.Replace = 1
), а поиск начинается с позиции курсора, т.е. сначала. Цикла поиска по тексту нет, так что .Wrap
можно не использовать.objWrd.ScreenUpdating = False
. =$E5<СЕГОДНЯ()
=$E5<СЕГОДНЯ()-29
Option Explicit
Option Base 1
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
Sub Merge_by_Rows() ' Без форматирования границ
Dim i As Integer, j As Integer, cnt As Integer
Dim arr() As Variant, s As String
With ActiveSheet.UsedRange ' Кол-во столбцов определяется по 1-й строке
arr = Range(Cells(1, 1), Cells(.Rows.Count + 1, Range("A1").End(xlToRight).Column))
End With
cnt = 1: s = get_Row(arr, cnt)
For i = LBound(arr, 1) + 1 To UBound(arr, 1)
If get_Row(arr, i) <> s Then
For j = LBound(arr, 2) To UBound(arr, 2)
With ActiveSheet.Range(Cells(cnt, j), Cells(i - 1, j)).Offset(, UBound(arr, 2))
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Value = arr(cnt, j)
End With
Next j
cnt = i: s = get_Row(arr, cnt)
End If
Next i
End Sub
Function get_Row(ByVal arr As Variant, ByVal num_Row As Integer) As String
Dim j As Integer
For j = LBound(arr, 2) To UBound(arr, 2)
get_Row = WorksheetFunction.Trim(get_Row & " " & arr(num_Row, j))
Next j
End Function
Select Case Val(Application.Version)
Case 12
' Excel 2007
Case 14
' Excel 2010, VB 7.0
Case 15
' Excel 2013
Case 16
' Excel 2016, VB 7.1
Case 17
' Excel 2019
Case Else
' Прочие
End Select
Cells(row, column).Interior.ColorIndex ' принимает значения от 0 до 56
Application
лучше написать WorksheetFunction
.' НомерСтроки - Кол-во непустых ячеек в колонке "1" + 1, а не номер первой пустой строки
' НомерСтроки - Номер первой пустой строки на рабочем листе
НомерСтроки = ActiveSheet.Cells.SpecialCells(xlLastCell).Row + 1
КолНепустых = ActiveCell.SpecialCells(xlCellTypeLastCell).Row - _
ActiveCell.EntireColumn.SpecialCells(xlCellTypeBlanks).Count
Dim y as byte, f as double
' ... цикл "For y" будет вложен в цикл: For x = 2 To 6
For y = 1 To 7
f = f + y
Next y
Option Explicit ' Обязательное объявление переменных
' чтобы избежать ошибок, и так удобнее пользоваться отладчиком
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
Sub Save_in_avArr() ' Процедура сохранения в массив avArr
' значений из Me!ОрганРегУчета и присвоение массиву avArr1
' верхней границы массива avArr
Dim i As Integer, avArr() As String, avArr1 As Variant
' По умолчанию функция Split использует разделитель "символ ПРОБЕЛ"
avArr = Split(Me!ОрганРегУчета)
' Передаваемая строка Me!ОрганРегУчета стала массивом avArr
' Нижняя граница массива LBOUND(avArr) = 0
ReDim avArr1(UBound(avArr)) ' Создаём массив avArr1 с верхней границей как у avArr
' Заполняем массив avArr1 от 0 до e (в вашем случае)
For i = LBound(avArr1) To UBound(avArr1)
' ...
' avArr1(i) = i
Next i
' Например, выводим на экран значения массива avArr1
MsgBox "№ имеет значение: " & Join(avArr, vbCr & "№ имеет значение: ")
End Sub
' Иногда вместо объявления динамического массива текстового типа String
Dim avArr() As String
' Удобнее использовать универсальный тип переменной Variant
Dim avArr() As Variant
' Тогда в ходе выполнения можно удалить из массива, например, элементы с 0 по 2
ReDim Preserve avArr(3 To UBound(avArr))
' Примечание: в многомерных массивах изменять можно только последнюю размерность
' Важно! Если не объявлять динамический массив, а поместить его в тип переменной
Dim avArr As Variant
' то работа со значениями массива будет медленнее примерно в 18 раз
' Процедуру разместить в модуле ThisOutlookSession.
' Уровень безопасности макросов (без цифровой подписи) - низкая.
Option Explicit
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
Private Sub Application_Reminder(ByVal Item As Object)
Dim objMsg As MailItem, sAttachment As String
Set objMsg = Application.CreateItem(olMailItem)
' Путь к файлу вложения (Указанный файл "Текст.txt" находится на Рабочем столе)
sAttachment = CreateObject("Wscript.Shell").SpecialFolders.Item("Desktop") & "\Текст.txt"
If Item.MessageClass <> "IPM.Appointment" Then
Exit Sub
End If
If Item.Categories <> "Automated Email Sender" Then
Exit Sub ' Закомментировать, если у события не указана категория
End If
With objMsg
.To = Item.Location ' Место события
.Subject = Item.Subject
.Body = Item.Body
' Если файл вложения существует, то добавить в письмо
If Len(sAttachment) > 0 Then .Attachments.Add sAttachment
'.Display '' Показать письмо (для отправки вручную; вместо '.Send)
.Send
End With: Set objMsg = Nothing
End Sub