Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11654
Последний выпуск: 19.06.2015

Как в Array поварьировать число элементов?

210
28 сентября
Dmitry2064
582 / / 06.12.2006
Задача - провести чистку текста (типа заменить пробелы после предлогов на неразрывные пробелы).
Это надо сделать как в осн. тексте, так и в сносках.
Для этого есть конструкция:
 
Код:
Set myStoryRangeFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
For Each myStoryRange In Array(myStoryRangeMain, myStoryRangeFoot)
...
Но если сносок в документ нет, возникает ошибка ("запрашиваемый номер семейства не существует").
Я собрался проверить наличие сносок так:
 
Код:
On Error Resume Next
Set myStoryRangeFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
If myStoryRangeFoot = Empty Then mFoots = False Else mFoots = True
Тогда строка
 
Код:
For Each myStoryRange In Array(myStoryRangeMain, myStoryRangeFoot)
должна стать короче на один пункт
 
Код:
For Each myStoryRange In Array(myStoryRangeMain)
Можно ли как-то это описать в виде двух вариантов массива, в котором и перебирать элементы?
Типа
mArr = (myStoryRangeMain) и, если сноски есть mArr = (myStoryRangeMain, myStoryRangeFoot)
240
12 октября
pashulka
982 / / 19.09.2004
 
Код:
On Error Resume Next
Set myFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
Set myMain = ActiveDocument.StoryRanges(wdMainTextStory)

For Each myStory In Array(myMain, myFoot)
    If Not IsEmpty(myStory) Then
       '...
    End If
Next
240
30 сентября
pashulka
982 / / 19.09.2004
Если действовать строго по Вашему плану, то Array можно заменить на коллекцию, но можно и просто :
 
Код:
For Each myStoryRange In ActiveDocument.StoryRanges
    'Ваши действия
Next
или если нужны только wdFootnotesStory, wdMainTextStory
 
Код:
For Each myStoryRange In ActiveDocument.StoryRanges
    Select Case myStoryRange.StoryType
        Case wdFootnotesStory, wdMainTextStory
           'Ваши действия
    End If
Next
210
02 октября
Dmitry2064
582 / / 06.12.2006
А все равно мне надо иметь возможность обработать текст, когда сносок может не быть.
То есть когда
 
Код:
myStoryRangeFoot = Empty
Я начал писать так:
 
Код:
If myStoryRangeFoot = Empty Then
    Case wdMainTextStory
Else
    Case wdFootnotesStory, wdMainTextStory
End If
Но VBA не дает поставить инструкцию if внутри case
statments invalid between Select case and first Case
313
02 октября
UserNet2008
710 / / 03.04.2010
Цитата:
Можно ли как-то это описать в виде двух вариантов массива, в котором и перебирать элементы?
Типа
mArr = (myStoryRangeMain) и, если сноски есть mArr = (myStoryRangeMain, myStoryRangeFoot)

 
Код:
Dim mArr(,)

 если сноски есть
  Redim mArr(myStoryRangeMain, myStoryRangeFoot)
иначе
 Redim mArr(myStoryRangeMain, 0)
240
02 октября
pashulka
982 / / 19.09.2004
Dmitry2064, Не нужно совмещать свои хотелки с моим ответом, по той простой причине, что в этом цикле - нет <сносок, которых может не быть>
 
Код:
For Each myStoryRange In ActiveDocument.StoryRanges
    'Ваши действия
Next
210
11 октября
Dmitry2064
582 / / 06.12.2006
Цитата: pashulka
Dmitry2064, Не нужно совмещать свои хотелки с моим ответом, по той простой причине, что в этом цикле - нет <сносок, которых может не быть>
 
Код:
For Each myStoryRange In ActiveDocument.StoryRanges
    'Ваши действия
Next

Спасибо, это я понял. Но как показала практика, "пробежка" во всем StoryRanges оказывается довольно долгой. Поэтому хотелось сократить до двух объектов:
myStoryRangeMain и myStoryRangeFoot.
Но в варианте с отсутствием сносок не смог правильно записать задачу.
Cпасибо за пояснения и Вам и UserNet2008.

210
11 октября
Dmitry2064
582 / / 06.12.2006
Цитата: UserNet2008
Цитата:
Можно ли как-то это описать в виде двух вариантов массива, в котором и перебирать элементы?
Типа
mArr = (myStoryRangeMain) и, если сноски есть mArr = (myStoryRangeMain, myStoryRangeFoot)

 
Код:
Dim mArr(,)

на этой строке сразу текст краснеет и пишется Syntax Error.

210
11 октября
Dmitry2064
582 / / 06.12.2006
Может быть так задаче понятнее:
 
Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
Set myStoryRangeFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
For Each myStoryRange In Array(myStoryRangeMain, myStoryRangeFoot)
...
Next
Если wdFootnotesStory не существует, то будет ошибка. Как правильно записать условие, "искать в Main или (если есть и сноски), то и в Foot"?
313
11 октября
UserNet2008
710 / / 03.04.2010
Моя бодъя sorry!
надо так
 
Код:
Dim mArr()
210
11 октября
Dmitry2064
582 / / 06.12.2006
Цитата: UserNet2008
Моя бодъя sorry!
надо так
 
Код:
Dim mArr()

Ага, прошло. Зато теперь остановка на Redim mArr(myStoryRangeMain, myStoryRangeFoot) - Type mismatch пишет.

Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory) '' определили основной текстовый материал
For Each mStor In ActiveDocument.StoryRanges ''' ищем, есть ли сноски
    If mStor.StoryType = wdFootnotesStory Then
        Set myStoryRangeFoot = ActiveDocument.StoryRanges(wdFootnotesStory) ''' определили материал со сносками
    mSn = True
    Exit For
    Else
    mSn = False
    End If
Next

If mSn = True Then
ReDim mArr(myStoryRangeMain, myStoryRangeFoot) ''' type mismatch
Else
ReDim mArr(myStoryRangeMain, 0)
End If
313
11 октября
UserNet2008
710 / / 03.04.2010
как-так
 
Код:
On Error GoTo errhandler
Set myStoryRangeFoot= ActiveDocument.StoryRanges(wdFootnotesStory)
errhandler:
If Err = 5941 Then MsgBox "Сносок нет."
210
11 октября
Dmitry2064
582 / / 06.12.2006
Цитата: UserNet2008
как-так
 
Код:
On Error GoTo errhandler
Set myStoryRangeFoot= ActiveDocument.StoryRanges(wdFootnotesStory)
errhandler:
If Err = 5941 Then MsgBox "Сносок нет."

Но дело не в отсутствии сносок.
Остановка на строке даже такого вида:
ReDim mArr(myStoryRangeMain, 0).
Программе не нравится сама запись.

313
11 октября
UserNet2008
710 / / 03.04.2010
 
Код:
ReDim mArr(myStoryRangeMain, 0)
Это интерпретация одномерново массива
Что может быть не так только значение myStoryRangeMain должно быть Integer or Long or Byte.
Or сам код не под строен под такую интерпретацию
313
12 октября
UserNet2008
710 / / 03.04.2010
В коде есть такая строка после этой строки пишем Stop
 
Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
Stop
Запускаем макрос
Наводим курсор на myStoryRangeMain и правой кнопкой мыши, в меню выбираем Add Watch...
Под Expression: должно быть
myStoryRangeMain
Ok
Смотрим Value и Type должно быть Integer or Long or Byte
210
13 октября
Dmitry2064
582 / / 06.12.2006
Цитата: UserNet2008
В коде есть такая строка после этой строки пишем Stop
 
Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
Stop
Запускаем макрос
Наводим курсор на myStoryRangeMain и правой кнопкой мыши, в меню выбираем Add Watch...
Под Expression: должно быть
myStoryRangeMain
Ok
Смотрим Value и Type должно быть Integer or Long or Byte

Эта переменная (myStoryRangeMain) текстовой оказывается. Что логично.

210
13 октября
Dmitry2064
582 / / 06.12.2006
Цитата: pashulka
 
Код:
On Error Resume Next
Set myFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
Set myMain = ActiveDocument.StoryRanges(wdMainTextStory)

For Each myStory In Array(myMain, myFoot)
    If Not IsEmpty(myStory) Then
       '...
    End If
Next

Это то, о чем мечтал. Просто проверить переменку на непустоту.
Хотя
On Error Resume Next
может подложить свинью.
Поэтому написал в внутри цикла в начале On Error GoTo 0
А в конце (внутри же) - On error resume next.
Спасибо за помощь))

99K
22 октября
Artemsk555
1 / / 22.10.2017
Приглашаем всех новичков пройти наши курсы http://best4you.kz/

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог