1

Тема: Код выдает ошибку. Что неправильно?

Sub test()
    Dim rng As Range
    Dim aName() As String
    Set rng = ActiveDocument.Range(Start:=0, End:=0)
    aName = FindBookmarkNameByStart(rng)     [b]<-- Error: Can't assign to array[/b]
End Sub

Private Function FindBookmarkNameByStart(rng As Range) As String
    Dim i As Long
    Dim j As Long
    Dim aName() As String
    For i = 1 To rng.Bookmarks.Count
        If rng.Bookmarks(i).Range.Start = rng.Start Then
            j = j + 1
            ReDim Preserve aName(1 To j)
            aName(j) = rng.Bookmarks(i).Name
            Debug.Print "Text Find: " & rng.Bookmarks(i).Range.Text
        End If
    Next i
    FindBookmarkNameByStart = aName
End Function

Отредактировано rizalut (10.01.2010 23:42:55)

2

Re: Код выдает ошибку. Что неправильно?

Варианта два. Сделать ваш массив глобальным или сделать, чтобы функция возвращала массив, а не строку.
Вариант 1:

'Объявляем массив общим для всего модуля
Dim aName() As String
Sub test()
    Dim rng As Range
    Set rng = ActiveDocument.Range(Start:=0, End:=0)
    Call FindBookmarkNameByStart (rng)
End Sub

'Вместо функции теперь можно использовать процедуру, которая будет изменять глобальную переменную
Private Sub FindBookmarkNameByStart(rng As Range)
    Dim i As Long
    Dim j As Long
    For i = 1 To rng.Bookmarks.Count
        If rng.Bookmarks(i).Range.Start = rng.Start Then
            j = j + 1
            ReDim Preserve aName(1 To j)
            aName(j) = rng.Bookmarks(i).Name
            Debug.Print "Text Find: " & rng.Bookmarks(i).Range.Text
        End If
    Next i
End Sub

Вариант 2:

Sub test()
    Dim rng As Range
    Dim aName()'Объявляем массив как Variant
    Set rng = ActiveDocument.Range(Start:=0, End:=0)
    aName = FindBookmarkNameByStart(rng)     <-- Error: Can't assign to array
End Sub

Private Function FindBookmarkNameByStart(rng As Range) As Variant
    Dim i As Long
    Dim j As Long
    Dim aName() As String
    For i = 1 To rng.Bookmarks.Count
        If rng.Bookmarks(i).Range.Start = rng.Start Then
            j = j + 1
            ReDim Preserve aName(1 To j)
            aName(j) = rng.Bookmarks(i).Name
            Debug.Print "Text Find: " & rng.Bookmarks(i).Range.Text
        End If
    Next i
    FindBookmarkNameByStart = aName
End Function

Но это всё теория. Мне не совсем понятен смысл данных действий. Вам нужны все закладки диапазона? Поясните, думаю, что можно сделать всё гораздо проще.

Лучше день потерять — потом за пять минут долететь!

3

Re: Код выдает ошибку. Что неправильно?

viter.alex, спасибо за внимание!

3 Вариант - передать процедуре ссылку на массив, находящийся внутри вызывающей процедуры. И она его изменит.


«Поясните, думаю, что можно сделать всё гораздо проще.»

Старая болячка, которую я считал, что залечил.

Вставка абзаца текста перед абзацем, начинающимся с закладки.
Начальная метка закладки перемещается в начало вставляемого текста.

Мне нужно вставить текст в начало документа.

Решил вопрос следующим образом:
Если в точке вставки есть закладки, начинающиеся в точке вставки,
то сохраняем их имена и ранги в соответствующих массивах.
Удаляем эти закладки.
Вставляем нужный текст.
Коллапсим ранг в той точке, где начинались закладки.
Добавляем в документ удаленные закладки из массивов,
заменяя начало их ранга на точку, где находится текущий ранг.

Если можно проще, напишите как. А то уж очень большой код получается.

4

Re: Код выдает ошибку. Что неправильно?

А почему бы просто не переопределить текст закладки?

Лучше день потерять — потом за пять минут долететь!

5

Re: Код выдает ошибку. Что неправильно?

Блок With в программе выдает ошибку 91. Вот кусочек кода. При переносе в отдельный проект - без проблем. Помогите разобраться. Переменнная взята просто для примера. Проект разрабатывается в VB6



Dim WordApp As Word.Application 
Dim newDoc As Word.Document 

Set WordApp = New Word.Application
WordApp.Visible = True

Set newDoc = Documents.Add("D:\Dov.doc")
newDoc.Activate

DataProp = DTPicker1

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "/Дата документа/"
.Replacement.Text = DataProp
.Forward = True
.Wrap = wdFindContinue
MatchWholeWord = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Модератор: пользуйтесь тегом [сode] для оформления кода!

6

Re: Код выдает ошибку. Что неправильно?

Ошибка в том, что вы обращаетесь к объекту Selection напрямую, как будто вы запускаете макрос в Word, а ведь это не так. Поэтому к Selection нужно обращаться через объект Word.Application:

WordApp.Selection

Кроме того, можно вообще отказаться от использования Selection и производить поиск и замену через объект Range. Тогда ваш код может выглядеть так:

Dim WordApp As Word.Application 
Dim newDoc As Word.Document 

Set WordApp = New Word.Application
WordApp.Visible = True

Set newDoc = Documents.Add("D:\Dov.doc")
DataProp = DTPicker1

With newDoc.Range.Find
  .Text = "/Дата документа/"
  .Replacement.Text = DataProp
  .Execute Replace:=WordApp.WdReplace.wdReplaceAll
End With

Как видите, запись стала намного короче. Кроме того, VB6 не понимается константу wdReplaceAll, т.к. она объявлена внутри объекта Word.Application, поэтому и к этой константе нужно обращаться через него.
И ещё.
Я вижу, что вы делаете замену, чтобы заменить некий кодовый текст на соответствующее значение. Это неверно. Для вставки текста в определённые места документа следует использовать закладки. Если одинаковый текст нужен в нескольких местах, то в одном месте нужно ставить закладку, а в остальных — перекрёстную ссылку на неё.
Об использовании закладок много говорится в блоге WordExpert

Лучше день потерять — потом за пять минут долететь!

7

Re: Код выдает ошибку. Что неправильно?

Спасибо за ответ!!!
Сейчас проверю. Но все-таки повторюсь: при вынесении данного блока за пределы проекта(создание нового проекта) все работает прекрасно(производится замена текста на значения переменных)