Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 10:19   #1
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию [B]Странный макрос[/B]

Макрос в приложенном файле имеет странную особеность: он работает ровно в половине раз, то есть один раз срабатывает, в следующий нет и комп долго висит. Когда его писал я хотел просто удалить записи 0 файл(а,ов). Как такое может быть?
P.S.А еще он частенько удаляет не все записи,оставляя ровно три, хотя все записи совершенно идентичны.
Вложения
Тип файла: doc 11.06.2009.doc (6.7 Кб, 148 просмотров)
mephist вне форума Ответить с цитированием
Старый 11.06.2009, 10:32   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вы бы лучше сам макрос нам показали...

Не увидев код, Вам никто ничего не посоветует.
EducatedFool вне форума Ответить с цитированием
Старый 11.06.2009, 10:43   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Да, юноша, что-то вы намудрили. Выложите текст макроса. Хотя можно и без него сказать, что в макросе присутствует логическая ошибка.
Приложенном файле я макроса не нашел. Файл текстовый, хотя имеет расширение .doc
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.06.2009, 11:17   #4
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

Извиняйте, лопухнулся, что текст не выложил.
Sub Delete_0_Files()
'
' Delete_0_Files Ìàêðîñ
'
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFor matting
With Selection.Find
.Text = "0 ôàéë(à,îâ)^p"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Следует отметить несколько фактов.
1. текст в досовской кодировке 866, потому что записи туда передаются из консоли.
2. Вместо
.Text = "0 ôàéë(à,îâ)^p"
должно быть
.Text = "0 файл(а,ов)^p" (в Visual Basic все отображается правильно)
3. Через раз он идеально срабатывает. А в остальных случаях комп надолго задумывается, хотя в обоих случаях ситуации совершенно анологичные.
mephist вне форума Ответить с цитированием
Старый 11.06.2009, 11:42   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Весь ваш макрос можно заменить одной строкой:
Код:
ActiveDocument.Range.Find.Execute "0 файл(а,ов)^0013",,,,,,,,,"",wdReplaceAll
Ваш макрос, я так понимаю, был записан макрорекордером. Мне не понятно зачем два раза выполнять Selection.Find.Execute
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 11.06.2009 в 12:27.
viter.alex вне форума Ответить с цитированием
Старый 11.06.2009, 15:15   #6
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

Мастер, мастер. Спасибо большое!
Я вообще не знаю Visual Basic, но даже я понимал, что там много лишних строк.
viter.alex можешь обьяснить в чем смысловая нагрузка ",,,,,,,,,"????
Никогда ничего похожего не видел.
А если мне еще хорошую книжку посоветуют по Visual Basic адаптированную как раз под написание макросов, то я вообще на седьмом небе от счатья буду.
mephist вне форума Ответить с цитированием
Старый 11.06.2009, 16:04   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Смысловая нагрузка состоит в том, что после каждой запятой должно следовать значение соответствующего параметра команды. Если ничего после запятой не стоит, то значение берется по умолчанию.
Вы можете посмотреть это сами.
  1. Зайдите в редактор VBA и нажмите Ctrl+G. Появится Immediate Window.
  2. Скопируйте в него строку, которую я привел в своем предыдущем сообщении.
  3. Поставьте курсор между любыми запятыми и нажмите Ctrl+I.
Должно получиться как на картинке. Перемещая курсор между запятыми, выделенное в подсказке слово будет изменяться, указывая на параметр, который можно указать.

Запятые можно не ставить, но тогда нужно точно указывать имя параметра, например, ваша строка может выглядеть так:
Код:
ActiveDocument.Range.Find.Execute FindText:="0 файл(а,ов)^0013", ReplaceWith:="", Replace:=wdReplaceAll
Но мне лень писать каждое имя параметра.

Кстати, как только вы напишите имя параметра и поставите после него двоеточие и знак равенства, то этот параметр подсветится в подсказке, давая знать, что имя параметра вы написали правильно.

Если подсказка не появляется, значит либо объект или метод не распознан по какой-то причине.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 11.06.2009 в 16:09.
viter.alex вне форума Ответить с цитированием
Старый 11.06.2009, 16:59   #8
mephist
Форумчанин
 
Регистрация: 01.05.2009
Сообщений: 200
По умолчанию

Супер. Я даже не расчитывал на такой подробный ответ. Большое спасибо.
mephist вне форума Ответить с цитированием
Старый 11.06.2009, 19:32   #9
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

Selection.Find.ClearFormatting

Я не понимаю вот этой строки, кто-нибудь может объяснить ее на своих пальцах, так сказать?
Busine2009 вне форума Ответить с цитированием
Старый 12.06.2009, 09:49   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Процедура Selection.Find.ClearFormatting выполняет сброс настроек поиска в значения по умолчанию. Это нужно делать в том случае, если вы проводите поиск через объект Selection.
При поиске через Range этого не происходит.
Пример. Ведем поиск через Selection:
Код:
  With Selection.Find
    .Text = "test"
    .Font.Color = wdColorAqua
    .Execute
  End With
Если после этого мы вновь запустим поиск через Selection, зададим другие параметры, например .Font.Bold = True, чтобы искать жирный шрифт, но не сбросим настройки, то искать будет не только по жирности шрифта, но и по его цвету, т.к. это задали раньше. И в результате следующий код будет работать не совсем так, как нам этого хочется:
Код:
  With Selection.Find
    .Text = "test"
    .Font.Bold = True
    .Execute
  End With
Поэтому нужно добавить процедуру очистки форматирования:
Код:
  With Selection.Find
    .ClearFormatting
    .Text = "test"
    .Font.Bold = True
    .Execute
  End With
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается. Ples Microsoft Office Excel 8 17.12.2016 18:15
В окне кода странный шрифт Elvisnya Общие вопросы Delphi 4 04.06.2009 12:34
Странный тип Yuran Общие вопросы Delphi 4 10.06.2008 10:11
Странный скрипт на страницах моих сайтов! Lx62GjVWZQJFjPD JavaScript, Ajax 5 29.03.2008 17:22
Странный, не стандартный файл valerij Microsoft Office Excel 4 26.03.2008 12:24