На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки

1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость - сестра таланта.
3. Не забывайте использовать теги [сode=vba] ...текст программы... [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Модераторы: Old Bat, MIF
  
> В чем ошибка?
    Программа открывает файл, считывает один за другим параграфы и заполняет с помощью процедуры FillVisitUserWithLogData некую структурку visitUser полученными данными.
    ExpandedWrap disabled
      Dim docLogFile As Document
      Dim rngLogFileRange As Range
      Dim parLogFile As Paragraph
       
      Set docLogFile = Documents.Open(FileName:=strLogFileName, ReadOnly:=True, Visible:=False)
       
       
      For Each parLogFile In docLogFile.Paragraphs
       
          Set rngLogFileRange = parLogFile.Range.Select
          FillVisitUserWithLogData rngRange:=rngLogFileRange, visitUser:=visitUser
       
      End For
      '----------------------------------------------------
      Private Sub FillVisitUserWithLogData(rngRange As Range, visitUser As Visit)
          '...
          '...
          '...
      End Sub

    Во время запуска программы на выполнение возникает ошибка: "Compile error: ByRef argument type mismatch", при этом подсвечивается параметр rngLogFileRange в строке вызова процедуры FillVisitUserWithLogData. Не могу понять что приводит к ошибке. Вроде, все типы совпадают.
      а что имелось ввиду под этим: Set rngLogFileRange = parLogFile.Range.Select?
      select - это метод, он ничего не возвращает, поэтому у тебя твоя range переменная = Nothing - вот и ошибка

      п.с. на будующее юзай пошаговый запуск (F8) со включенными locals window (там отображаются значения всех переменных в данный момент) и watches window при необходимости (туда можно вставить дополнительные конструкции и отслеживать их значение)...
      Сообщение отредактировано: Krasnaja Shapka -
        Цитата
        а что имелось ввиду под этим: Set rngLogFileRange = parLogFile.Range.Select?
        select - это метод, он ничего не возвращает, поэтому у тебя твоя range переменная = Nothing - вот и ошибка

        При помощи Set rngLogFileRange = parLogFile.Range.Select я хотел установить рандж в 1 параграф, ну и передавать его процедуре для обработке. А Select для того, чтобы весь этот процесс наблюдать визуально, для контроля (где-то вычитал про такой прием).
        Так, как сделать, чтобы все было ОК, чтобы возвращался рандж?
          разбей это на два оператора...

          Set rngLogFileRange = parLogFile.Range
          и
          parLogFile.Range.Select (или rngLogFileRange.select)

          Добавлено
          а можешь вообще вызвать

          FillVisitUserWithLogData parLogFile.Range, visitUser

          и избавишься от лишней переменной... :)
          Сообщение отредактировано: Krasnaja Shapka -
            Цитата
            разбей это на два оператора...

            Set rngLogFileRange = parLogFile.Range
            и
            parLogFile.Range.Select (или rngLogFileRange.select)

            Не-а, твой вариант тоже не работает. Кажется я нашел причину ошибки. Переменная rngLogFileRange объявляется вместе с еще одной:
            ExpandedWrap disabled
              Dim rngLogFileRange, rngRange As Range

            А если их объявить так:
            ExpandedWrap disabled
              Dim rngLogFileRange As Range
              Dim  rngRange As Range

            то все работает правильно. Объяснения у меня этому нет.

            P.S.
            Появилась другая ошибка:

            ExpandedWrap disabled
              Dim tblTargetTable As table
                  ' ...
                  ' ...
                  ' ...
              Set tblTargetTable = InsertNextOutputTable(docDocument:=docActive, intTableIndex:=visitUser.intIndex)
              '-----------------------------------
              Private Function InsertNextOutputTable(docDocument As Document, intTableIndex As Integer)
                 Dim tblTable As table
                  ' ...
                  ' ...
                  ' ...
                 InsertNextOutputTable = tblTable
              End Function


            Компилятор выдает ошибку 13. Мол, опять с типами косяк какой-то. Подсвечивает всю строку целеком. В чем дело?
              В VBA, в отличие от VB, тип переменной нужно указывать после ее объявлеия.
              Если тип переменной опущен, то ей автоматически присваивается тип Variant, НЕ OBJECT.
              Function InsertNextOutputTable надо объявить как AS TABLE ( или OBJECT)
                то у вас
                Цитата awax @
                Dim rngLogFileRange As Range

                то
                Цитата awax @
                Dim rngLogFileRange, rngRange As Range

                вы определитесь, а? :)

                вы пробовали свой макрос по F8 прогнать или проще в форуме спрашивать? :)))
                  Цитата pvr @
                  Function InsertNextOutputTable надо объявить как AS TABLE ( или OBJECT)

                  Это как? Table Function InsertNextOutputTable? Как в сях?

                  -Added
                  Цитата Krasnaja Shapka @
                  то у вас
                  Цитата awax @
                  Dim rngLogFileRange As Range

                  то
                  Цитата awax @
                  Dim rngLogFileRange, rngRange As Range

                  вы определитесь, а? :)

                  вы пробовали свой макрос по F8 прогнать или проще в форуме спрашивать? :)))

                  Прошу прощения за несогласованность. Дело в том, что для краткости и четкости я убираю все то, что, как мне кажется, не относиться непосредственно к вопросу. Поэтому я убрал rngRange, но позже понял, что, возможно, этот самый rngRange и является причиной возникновения ошибки. Насколько я теперь понимаю (спасибо pvr!!!) при объявлении
                  ExpandedWrap disabled
                    Dim rngLogFileRange, rngRange As Range
                  переменная rngLogFileRange объявляется как variant. В моем случае это недопустимо.
                  А что касается F8, то я, безусловно, пользуюсь этой возможностью, но до определенного момента, пока не возникает ошибка, так что полностью прогнать макрос не получается.
                    Цитата
                    Цитата (pvr @ Вчера, 17:04)
                    Function InsertNextOutputTable надо объявить как AS TABLE ( или OBJECT)

                    Это как? Table Function InsertNextOutputTable? Как в сях?

                    Надо юзать Help или учебник какой....

                    ExpandedWrap disabled
                      Private Function InsertNextOutputTable(docDocument As Document, intTableIndex As Integer) As Table
                      Спасибо, pvr, но компилятор подкинул новую задачку. Функция InsertNextOutputTable создает таблицу и возвращает ссылку на нее.
                      ExpandedWrap disabled
                        Private Function InsertNextOutputTable(docDocument As Document, intTableIndex As Integer) as table
                            Dim tblTable As table
                            Dim rngTable As Range
                            ' ...
                            ' ...
                            ' ...
                            Set tblTable = docDocument.Tables.Add(Range:=rngTable, NumRows:=1, NumColumns:=5)
                            InsertNextOutputTable = tblTable
                        End Function

                      Используется ф-я следующим образом:
                      ExpandedWrap disabled
                        Dim tblTargetTable As table
                            ' ...
                            ' ...
                            ' ...
                        Set tblTargetTable = InsertNextOutputTable(docDocument:=docActive, intTableIndex:=visitUser.intIndex)

                      Во время прогона макроса, при входе в функцию, компилятор сразу останавливает выполнение программы, подсвечивает InsertNextOutputTable в последнем выражении функции и выдает ошибку Compile error: Invalid use of property. Все типы определены и совпадают. В чем дело? Учебник по VBA ответа на этот вопрос не дает ;)
                        ExpandedWrap disabled
                          Set InsertNextOutputTable = tblTable
                        , но лучше сразу
                        ExpandedWrap disabled
                          Set InsertNextOutputTable = docDocument.Tables.Add(Range:=rngTable, NumRows:=1, NumColumns:=5)

                        Цитата awax @
                        Учебник по VBA ответа на этот вопрос не дает

                        :huh: что за источник ?? см. создание ссылки на объект
                          Цитата
                          что за источник ??

                          VBA for Dummies :yes:
                            гм, попользуй ссылочку, много чего полезного есть
                            http://word.mvps.org/FAQs/MacrosVBA/
                              Цитата Old Bat @
                              ExpandedWrap disabled
                                Set InsertNextOutputTable = tblTable
                              , но лучше сразу
                              ExpandedWrap disabled
                                Set InsertNextOutputTable = docDocument.Tables.Add(Range:=rngTable, NumRows:=1, NumColumns:=5)

                              Спасибо за подсказку. Все работает. Ссылку почитаю. Держи плюс ;)
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0.1166 ]   [ 16 queries used ]   [ Generated: 24.07.26, 11:41 GMT ]