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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 00:35   #1
Maxxusha
 
Регистрация: 11.07.2010
Сообщений: 5
По умолчанию Word. Расставить случайные числы в начале абзаца

Всем Привет!

Возникла необходимость написать простенький макрос, может кто подскажет. Существует текст, состоящий из нескольких абзацев. Нужно расставить случайные числа (целые в заданном диапазоне) в начале каждого абзаца, за исключением абзацев, начинающихся с символов "#$%". Расстановка по сочетанию клавиш, то есть каждый абзац обрабатывается нажатием клавиш. Единственная тонкость - случайные числа соседних абзацев должны быть разные (абзац "#$%" выступает как любая другая цифра). Диапазон случайных чисел можно задать в любом формате в начале документа.

Пример.

Существующий файл:

Абзац1
Абзац2
Абзац3
#$%Абзац4
Абзац5
Абзац6
#$%Абзац7
Абзац8

Файл после обработки:

1Абзац1
4Абзац2
3Абзац3
#$%Абзац4
5Абзац5
8Абзац6
#$%Абзац7
4Абзац8

На данном этапе сейчас дошел только до того, что генерирует случайные числа в заданном диапазоне и ставит в начало абзаца. А переходы с сравнением предыдущей цифры пока не получаются.
Заранее спасибо.
Maxxusha вне форума Ответить с цитированием
Старый 12.07.2010, 01:14   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

просто совет (как вариант) сразу нагенерите чисел с запасом так, чтобы соседние отличались. Сохраните их в массив (или в коллекцию). А потом доставайте по очереди по мере необходимости..

p.s. в программирования на VBA под Word не силён, поэтому конкретным кодом не могу помочь...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2010, 06:59   #3
Maxxusha
 
Регистрация: 11.07.2010
Сообщений: 5
По умолчанию

ИМХО, таким образом не совсем оптимально будет - дольше и памяти больше нужно. Тут алгоритм прозрачен, но возникают сложности с синтаксисом, так как напрямую с VBA очень мало имел дело.
Maxxusha вне форума Ответить с цитированием
Старый 12.07.2010, 10:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
ИМХО, таким образом не совсем оптимально будет - дольше и памяти больше нужно.
согласен. Ну я же говорю - просто, как вариант... \

Погодите, Вам же нужно, чтобы не совпадали цифры в текущем и предыдущем абзацах?!
Так допустимо? :
Цитата:
1Абзац1
4Абзац2
1Абзац3
тогда достаточно хранить в одной глобальной переменной предыдущее значение. и всё. Генерить пока случайное значение совпадает с предыдущим.


Цитата:
Тут алгоритм прозрачен, но возникают сложности с синтаксисом, так как напрямую с VBA очень мало имел дело.
вот, вот... та же беда.. Вот именно поэтому я и пытаюсь придумать "зрзац"-алгоритм...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2010, 11:40   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Так подойдёт?
Код:
Sub InsertRandomNumberBeforeParagraph()
  Dim opar As Paragraph
  Set opar = ActiveDocument.Paragraphs.First
  Dim nPrevNum As Integer
  Dim nLBound As Integer
  Dim nUBound As Integer
  
  nLBound = 1
  nUBound = ActiveDocument.Paragraphs.Count
  
  Do Until opar Is Nothing
    If Left(opar.Range.Text, 3) <> "#$%" Then
      nPrevNum = GenRndNumber(nLBound, nUBound, nPrevNum)
      opar.Range.InsertBefore nPrevNum
    End If
    Set opar = opar.Next
  Loop
End Sub

'Функция для генерации случайного целого числа в заданных пределах
Function GenRndNumber(Lower As Integer, Upper As Integer, NotEqual As Integer) As Integer
  Randomize
  GenRndNumber = Int((Upper% - Lower% + 1) * Rnd + Lower%)
  Do While GenRndNumber = NotEqual
    GenRndNumber = Int((Upper% - Lower% + 1) * Rnd + Lower%)
  Loop
End Function
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 14.07.2010, 13:33   #6
Maxxusha
 
Регистрация: 11.07.2010
Сообщений: 5
По умолчанию

Спасибо за код, работает моментально, единственный момент, там по комбинации клавиш нужна одна цифра в начале абзаца, затем курсор ставится на начало следующего. Цикл убрал, курсор перевел, но по нажатию клавиш цифра ставится каждый раз в начало первого абзаца. Не подскажите синтаксис как переменной "opar" присваивать текущий параграф?
Maxxusha вне форума Ответить с цитированием
Старый 14.07.2010, 13:40   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Код:
Set opar = Selection.Paragraphs.First
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 14.07.2010, 13:50   #8
Maxxusha
 
Регистрация: 11.07.2010
Сообщений: 5
По умолчанию

Супер, спасибо. Попробую. Надеюсь доделать дальше сам.
Maxxusha вне форума Ответить с цитированием
Старый 14.07.2010, 23:57   #9
Maxxusha
 
Регистрация: 11.07.2010
Сообщений: 5
По умолчанию

Попробовал. Не получилось сделать, не хочет работать так, как нужно Никак не хочет делать вот такой алгоритм:

Курсор находится в начале любого абзаца
Нажимается сочетание клавиш, вызывающих данную подпрограмму.

Если:
начало текущего абзаца "#$%", переход к началу следующего абзаца, генерация числа, переход к началу следующего абзаца -> конец подпрограммы
Иначе:
смотрим предыдущий абзац
Если:
в начале "#$%", то генерация числа в текущем абзаце, переход к следующему абзацу -> конец подпрограммы
Иначе:
запоминаем номер в начале предыдущего абзаца, в текущем генерируем число, отличное от него, переход к следующему абзацу -> конец подпрограммы

Конец если
Конец если

Заранее спасибо

Последний раз редактировалось Maxxusha; 15.07.2010 в 00:04.
Maxxusha вне форума Ответить с цитированием
Старый 16.07.2010, 20:55   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Алгоритм неверный.
Цитата:
Иначе:
смотрим предыдущий абзац
Если:
в начале , то генерация числа в текущем абзаце, переход к следующему абзацу -> конец подпрограммы
Иначе:
запоминаем номер в начале предыдущего абзаца, в текущем генерируем число, отличное от него, переход к следующему абзацу -> конец подпрограммы

Конец если
Эта часть выполняется, если в начале абзаца стоят символы "#$%". Ты проверяешь первые символы в начале предыдущего абзаца, и, если они там тоже есть, генерировать номер в текущем абзаце. Но ведь в нём эти символы стоят!

Думай дальше. Или опиши подробнее, что ты хочешь. Ставить случайное число в начале текущего абзаца, а если в начале текущего абзаца стоят символы "#$%", то число вставлять в следующий?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расставить пробелы dukesoteg Помощь студентам 0 10.06.2010 18:30
Символ абзаца Dmittrii Microsoft Office Word 3 17.03.2009 12:13
Символ абзаца Word 2003 dreack Microsoft Office Word 5 01.03.2009 14:17
взаимно простое числы Cantana Помощь студентам 4 07.03.2008 08:46
Задача на длинные числы molodzo Помощь студентам 1 21.11.2007 11:23