Есть множество исходных файлов Необходимо их автоматическое преобразование в полуавтоматическом режиме, т.е. автоматом убираем "мусор", но не во всем файле, а в абзаце, на котором стоит указатель. Мусором считается ручная нумерация абзацев и ручная отбивка отступа через пробелы и табуляцию. Просьба помочь перевести алгоритм в реально работающий код на VBA Алгоритм следующий
1. убираем из начала абзаца первые пробелы, цифры, точки. Точки-числа подсчитываем - это покажет уровень параграфа
2. применяем стиль нумерации того уровня, который насчитали по цифрам-точкам
[vba]
Код
Flag_Number = false // флаг чисел Count_Simbol = 0 // счетчик символов Count_Level = 0 // счетчик уровня
Selection.HomeKey Unit:=wdStory // указатель в начало параграфа (взято из автоматически записанного макроса)
If Количество символов в параграфе < 3 then GoTo LastOp // это не нумерованный параграф-абзац.
For ... // Цикл для каждого знака текущего параграфа
If Символ(i)<>[#, ".", " ", Tab] then GoTo LastOp // Выход Из Цикла For
Inc(Count_Simbol)
If Символ(i) = "#" then // если любая цифра
If Flag_Number = False then Flag_Number = True Inc(Count_Level) Next // в начало цикла End If
Else If Символ(i) = "." then Flag_Number = false End If
End For
LastOp: If Count_Simbol > 0 then Удалить первые символы в кол-ве Count_Simbol If Count_Level = 0 then Применить стиль "стандартный" If Count_Level = 1 then Применить стиль ".раздел 1" If Count_Level = 2 then Применить стиль ".раздел 2" If Count_Level = 3 then Применить стиль ".раздел 3"
[/vba]
p.s. если это что-то стоит, то можно обсудить p.p.s. помогите найти личный кабинет на форуме (для исправления пароля - запрос на изменение пароля не приходит на почту)
Есть множество исходных файлов Необходимо их автоматическое преобразование в полуавтоматическом режиме, т.е. автоматом убираем "мусор", но не во всем файле, а в абзаце, на котором стоит указатель. Мусором считается ручная нумерация абзацев и ручная отбивка отступа через пробелы и табуляцию. Просьба помочь перевести алгоритм в реально работающий код на VBA Алгоритм следующий
1. убираем из начала абзаца первые пробелы, цифры, точки. Точки-числа подсчитываем - это покажет уровень параграфа
2. применяем стиль нумерации того уровня, который насчитали по цифрам-точкам
[vba]
Код
Flag_Number = false // флаг чисел Count_Simbol = 0 // счетчик символов Count_Level = 0 // счетчик уровня
Selection.HomeKey Unit:=wdStory // указатель в начало параграфа (взято из автоматически записанного макроса)
If Количество символов в параграфе < 3 then GoTo LastOp // это не нумерованный параграф-абзац.
For ... // Цикл для каждого знака текущего параграфа
If Символ(i)<>[#, ".", " ", Tab] then GoTo LastOp // Выход Из Цикла For
Inc(Count_Simbol)
If Символ(i) = "#" then // если любая цифра
If Flag_Number = False then Flag_Number = True Inc(Count_Level) Next // в начало цикла End If
Else If Символ(i) = "." then Flag_Number = false End If
End For
LastOp: If Count_Simbol > 0 then Удалить первые символы в кол-ве Count_Simbol If Count_Level = 0 then Применить стиль "стандартный" If Count_Level = 1 then Применить стиль ".раздел 1" If Count_Level = 2 then Применить стиль ".раздел 2" If Count_Level = 3 then Применить стиль ".раздел 3"
[/vba]
p.s. если это что-то стоит, то можно обсудить p.p.s. помогите найти личный кабинет на форуме (для исправления пароля - запрос на изменение пароля не приходит на почту)карандаш
Sub ertert() If Selection.Type <> 1 Then MsgBox "Просто установите курсор внутри абзаца, который хотите преобразовать", 64 Exit Sub End If Dim i& With Selection .StartOf Unit:=wdParagraph, Extend:=wdMove .Expand wdSentence If .Characters.Count > 10 Then Exit Sub End With i = Len(Selection) - Len(Replace(Selection, ".", "")) Selection.Delete Selection.Expand wdParagraph Select Case i Case 1 Selection.Style = ActiveDocument.Styles("Подзаголовок") Case 2 Selection.Style = ActiveDocument.Styles("Выделение") Case 3 Selection.Style = ActiveDocument.Styles("Сильное выделение") End Select End Sub
[/vba]
может, как-то так: [vba]
Код
Sub ertert() If Selection.Type <> 1 Then MsgBox "Просто установите курсор внутри абзаца, который хотите преобразовать", 64 Exit Sub End If Dim i& With Selection .StartOf Unit:=wdParagraph, Extend:=wdMove .Expand wdSentence If .Characters.Count > 10 Then Exit Sub End With i = Len(Selection) - Len(Replace(Selection, ".", "")) Selection.Delete Selection.Expand wdParagraph Select Case i Case 1 Selection.Style = ActiveDocument.Styles("Подзаголовок") Case 2 Selection.Style = ActiveDocument.Styles("Выделение") Case 3 Selection.Style = ActiveDocument.Styles("Сильное выделение") End Select End Sub
nilem, спасибо не совсем то - если начало нестандартное - много пробелов, табуляций, точка после последней цифры нумерации не стоит, нет пробела между последней точкой и началом абзаца(первым словом), то не работает. Но на основе этого получилось собрать следующий макрос, работающий по первоначальному алгоритму + дополнение, если абзацы кто-то пронумеровал много- или одно уровневым списком (бывает и такое)
[vba]
Код
Sub reNumber() ' 'проверка отсутствие выделения If Selection.Type <> 1 Then MsgBox "Просто установите курсор внутри абзаца, который хотите преобразовать", 64 Exit Sub End If ' 'проверка наличия нужных стилей (чтобы не было ошибки применения) Dim p As Style, MyStyleIs As Boolean
MyStyleIs = False For i = 1 To ActiveDocument.Styles.Count ' так почему-то быстрее, чем с конца Set p = ActiveDocument.Styles(i) If Left$(p.NameLocal, 1) = "." Then MyStyleIs = True Exit For End If Next i If Not MyStyleIs Then LoadTemplate ' загрузка стилей, если они не нашлись ' ' если уже есть нумерация многоуровневыми стилями If Selection.Range.ListFormat.ListType = wdListOutlineNumbering Then Lev = Selection.Range.ListFormat.ListLevelNumber Selection.Expand wdParagraph Select Case Lev Case 1 Selection.Style = ActiveDocument.Styles(".Раздел 1") Case 2 Selection.Style = ActiveDocument.Styles(".Раздел 2") Case 3 Selection.Style = ActiveDocument.Styles(".Раздел 3") End Select Selection.Collapse Selection.MoveDown Unit:=wdParagraph, Count:=1 Exit Sub End If ' ' если обычный текст с/без нумерации в начале абзаца вручную Dim ch As String, Flag_Number As Boolean, Count_Level, Count_Simbol As Integer, r
With Selection .StartOf Unit:=wdParagraph, Extend:=wdMove .Expand wdParagraph n = .Characters.Count
For i = 1 To n
ch = .Characters(i) If (ch Like "[!0-9. ]") And (ch <> Chr(9)) Then Exit For Count_Simbol = Count_Simbol + 1
If ch Like "[0-9]" Then If Flag_Number = False Then Flag_Number = True Count_Level = Count_Level + 1 'Next '// в начало цикла End If ElseIf ch = "." Then Flag_Number = False End If
Next i
End With
Selection.End = Selection.Start + Count_Simbol If Count_Simbol > 0 Then Selection.Delete Selection.Expand wdParagraph Select Case Count_Level Case 0 Selection.Style = ActiveDocument.Styles(".стандартный") Case 1 Selection.Style = ActiveDocument.Styles(".Раздел 1") Case 2 Selection.Style = ActiveDocument.Styles(".Раздел 2") Case 3 Selection.Style = ActiveDocument.Styles(".Раздел 3") End Select 'Selection.Collapse Selection.MoveDown Unit:=wdParagraph, Count:=1 ' автоматически переходим к следующему абзацу (чтобы не надо было жать Ctrl+СтрелкаВниз) End Sub
[/vba]
nilem, спасибо не совсем то - если начало нестандартное - много пробелов, табуляций, точка после последней цифры нумерации не стоит, нет пробела между последней точкой и началом абзаца(первым словом), то не работает. Но на основе этого получилось собрать следующий макрос, работающий по первоначальному алгоритму + дополнение, если абзацы кто-то пронумеровал много- или одно уровневым списком (бывает и такое)
[vba]
Код
Sub reNumber() ' 'проверка отсутствие выделения If Selection.Type <> 1 Then MsgBox "Просто установите курсор внутри абзаца, который хотите преобразовать", 64 Exit Sub End If ' 'проверка наличия нужных стилей (чтобы не было ошибки применения) Dim p As Style, MyStyleIs As Boolean
MyStyleIs = False For i = 1 To ActiveDocument.Styles.Count ' так почему-то быстрее, чем с конца Set p = ActiveDocument.Styles(i) If Left$(p.NameLocal, 1) = "." Then MyStyleIs = True Exit For End If Next i If Not MyStyleIs Then LoadTemplate ' загрузка стилей, если они не нашлись ' ' если уже есть нумерация многоуровневыми стилями If Selection.Range.ListFormat.ListType = wdListOutlineNumbering Then Lev = Selection.Range.ListFormat.ListLevelNumber Selection.Expand wdParagraph Select Case Lev Case 1 Selection.Style = ActiveDocument.Styles(".Раздел 1") Case 2 Selection.Style = ActiveDocument.Styles(".Раздел 2") Case 3 Selection.Style = ActiveDocument.Styles(".Раздел 3") End Select Selection.Collapse Selection.MoveDown Unit:=wdParagraph, Count:=1 Exit Sub End If ' ' если обычный текст с/без нумерации в начале абзаца вручную Dim ch As String, Flag_Number As Boolean, Count_Level, Count_Simbol As Integer, r
With Selection .StartOf Unit:=wdParagraph, Extend:=wdMove .Expand wdParagraph n = .Characters.Count
For i = 1 To n
ch = .Characters(i) If (ch Like "[!0-9. ]") And (ch <> Chr(9)) Then Exit For Count_Simbol = Count_Simbol + 1
If ch Like "[0-9]" Then If Flag_Number = False Then Flag_Number = True Count_Level = Count_Level + 1 'Next '// в начало цикла End If ElseIf ch = "." Then Flag_Number = False End If
Next i
End With
Selection.End = Selection.Start + Count_Simbol If Count_Simbol > 0 Then Selection.Delete Selection.Expand wdParagraph Select Case Count_Level Case 0 Selection.Style = ActiveDocument.Styles(".стандартный") Case 1 Selection.Style = ActiveDocument.Styles(".Раздел 1") Case 2 Selection.Style = ActiveDocument.Styles(".Раздел 2") Case 3 Selection.Style = ActiveDocument.Styles(".Раздел 3") End Select 'Selection.Collapse Selection.MoveDown Unit:=wdParagraph, Count:=1 ' автоматически переходим к следующему абзацу (чтобы не надо было жать Ctrl+СтрелкаВниз) End Sub