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

Ваш аккаунт

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

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

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

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

248
28 сентября 2017 года
Dmitry2064
590 / / 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)
275
12 октября 2017 года
pashulka
985 / / 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
275
30 сентября 2017 года
pashulka
985 / / 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
248
02 октября 2017 года
Dmitry2064
590 / / 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
327
02 октября 2017 года
UserNet2008
748 / / 03.04.2010
Цитата:
Можно ли как-то это описать в виде двух вариантов массива, в котором и перебирать элементы?
Типа
mArr = (myStoryRangeMain) и, если сноски есть mArr = (myStoryRangeMain, myStoryRangeFoot)

 
Код:
Dim mArr(,)

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

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

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

 
Код:
Dim mArr(,)

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

248
11 октября 2017 года
Dmitry2064
590 / / 06.12.2006
Может быть так задаче понятнее:
 
Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
Set myStoryRangeFoot = ActiveDocument.StoryRanges(wdFootnotesStory)
For Each myStoryRange In Array(myStoryRangeMain, myStoryRangeFoot)
...
Next
Если wdFootnotesStory не существует, то будет ошибка. Как правильно записать условие, "искать в Main или (если есть и сноски), то и в Foot"?
327
11 октября 2017 года
UserNet2008
748 / / 03.04.2010
Моя бодъя sorry!
надо так
 
Код:
Dim mArr()
248
11 октября 2017 года
Dmitry2064
590 / / 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
327
11 октября 2017 года
UserNet2008
748 / / 03.04.2010
как-так
 
Код:
On Error GoTo errhandler
Set myStoryRangeFoot= ActiveDocument.StoryRanges(wdFootnotesStory)
errhandler:
If Err = 5941 Then MsgBox "Сносок нет."
248
11 октября 2017 года
Dmitry2064
590 / / 06.12.2006
Цитата: UserNet2008
как-так
 
Код:
On Error GoTo errhandler
Set myStoryRangeFoot= ActiveDocument.StoryRanges(wdFootnotesStory)
errhandler:
If Err = 5941 Then MsgBox "Сносок нет."

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

327
11 октября 2017 года
UserNet2008
748 / / 03.04.2010
 
Код:
ReDim mArr(myStoryRangeMain, 0)
Это интерпретация одномерново массива
Что может быть не так только значение myStoryRangeMain должно быть Integer or Long or Byte.
Or сам код не под строен под такую интерпретацию
327
12 октября 2017 года
UserNet2008
748 / / 03.04.2010
В коде есть такая строка после этой строки пишем Stop
 
Код:
Set myStoryRangeMain = ActiveDocument.StoryRanges(wdMainTextStory)
Stop
Запускаем макрос
Наводим курсор на myStoryRangeMain и правой кнопкой мыши, в меню выбираем Add Watch...
Под Expression: должно быть
myStoryRangeMain
Ok
Смотрим Value и Type должно быть Integer or Long or Byte
248
13 октября 2017 года
Dmitry2064
590 / / 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) текстовой оказывается. Что логично.

248
13 октября 2017 года
Dmitry2064
590 / / 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 октября 2017 года
Artemsk555
1 / / 22.10.2017
Приглашаем всех новичков пройти наши курсы http://best4you.kz/
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог