Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/автоматическая сборка "мусора" - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Word » автоматическая сборка "мусора" (макросы на службе рутинных работ)
автоматическая сборка "мусора"
карандаш Дата: Среда, 01.04.2015, 17:28 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
Есть множество исходных файлов
Необходимо их автоматическое преобразование в полуавтоматическом режиме, т.е. автоматом убираем "мусор", но не во всем файле, а в абзаце, на котором стоит указатель.
Мусором считается ручная нумерация абзацев и ручная отбивка отступа через пробелы и табуляцию.
Просьба помочь перевести алгоритм в реально работающий код на 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. помогите найти личный кабинет на форуме (для исправления пароля - запрос на изменение пароля не приходит на почту)
К сообщению приложен файл: 6518528.docx (39.4 Kb)


Сообщение отредактировал карандаш - Среда, 01.04.2015, 18:15
 
Ответить
СообщениеЕсть множество исходных файлов
Необходимо их автоматическое преобразование в полуавтоматическом режиме, т.е. автоматом убираем "мусор", но не во всем файле, а в абзаце, на котором стоит указатель.
Мусором считается ручная нумерация абзацев и ручная отбивка отступа через пробелы и табуляцию.
Просьба помочь перевести алгоритм в реально работающий код на 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. помогите найти личный кабинет на форуме (для исправления пароля - запрос на изменение пароля не приходит на почту)

Автор - карандаш
Дата добавления - 01.04.2015 в 17:28
nilem Дата: Суббота, 04.04.2015, 19:55 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может, как-то так:
[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
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеможет, как-то так:
[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
[/vba]

Автор - nilem
Дата добавления - 04.04.2015 в 19:55
карандаш Дата: Понедельник, 13.04.2015, 22:37 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
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

Flag_Number = False
Count_Level = 0
Count_Simbol = 0

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]


Сообщение отредактировал карандаш - Вторник, 14.04.2015, 00:09
 
Ответить
Сообщение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

Flag_Number = False
Count_Level = 0
Count_Simbol = 0

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]

Автор - карандаш
Дата добавления - 13.04.2015 в 22:37
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Word » автоматическая сборка "мусора" (макросы на службе рутинных работ)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!