В чем ошибка?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.249] |
|
|
Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Общие вопросы
Особенности VBA-кода
Оптимизация VBA-кода
Полезные ссылки
В чем ошибка?
|
|
|
|
|
Программа открывает файл, считывает один за другим параграфы и заполняет с помощью процедуры FillVisitUserWithLogData некую структурку visitUser полученными данными.
![]() ![]() 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. Не могу понять что приводит к ошибке. Вроде, все типы совпадают. |
|
Сообщ.
#2
,
|
|
|
|
а что имелось ввиду под этим: Set rngLogFileRange = parLogFile.Range.Select?
select - это метод, он ничего не возвращает, поэтому у тебя твоя range переменная = Nothing - вот и ошибка п.с. на будующее юзай пошаговый запуск (F8) со включенными locals window (там отображаются значения всех переменных в данный момент) и watches window при необходимости (туда можно вставить дополнительные конструкции и отслеживать их значение)... |
|
Сообщ.
#3
,
|
|
|
|
Цитата а что имелось ввиду под этим: Set rngLogFileRange = parLogFile.Range.Select? select - это метод, он ничего не возвращает, поэтому у тебя твоя range переменная = Nothing - вот и ошибка При помощи Set rngLogFileRange = parLogFile.Range.Select я хотел установить рандж в 1 параграф, ну и передавать его процедуре для обработке. А Select для того, чтобы весь этот процесс наблюдать визуально, для контроля (где-то вычитал про такой прием). Так, как сделать, чтобы все было ОК, чтобы возвращался рандж? |
|
Сообщ.
#4
,
|
|
|
|
разбей это на два оператора...
Set rngLogFileRange = parLogFile.Range и parLogFile.Range.Select (или rngLogFileRange.select) Добавлено а можешь вообще вызвать FillVisitUserWithLogData parLogFile.Range, visitUser и избавишься от лишней переменной... |
|
Сообщ.
#5
,
|
|
|
|
Цитата разбей это на два оператора... Set rngLogFileRange = parLogFile.Range и parLogFile.Range.Select (или rngLogFileRange.select) Не-а, твой вариант тоже не работает. Кажется я нашел причину ошибки. Переменная rngLogFileRange объявляется вместе с еще одной: ![]() ![]() Dim rngLogFileRange, rngRange As Range А если их объявить так: ![]() ![]() Dim rngLogFileRange As Range Dim rngRange As Range то все работает правильно. Объяснения у меня этому нет. P.S. Появилась другая ошибка: ![]() ![]() 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. Мол, опять с типами косяк какой-то. Подсвечивает всю строку целеком. В чем дело? |
|
Сообщ.
#6
,
|
|
|
|
В VBA, в отличие от VB, тип переменной нужно указывать после ее объявлеия.
Если тип переменной опущен, то ей автоматически присваивается тип Variant, НЕ OBJECT. Function InsertNextOutputTable надо объявить как AS TABLE ( или OBJECT) |
|
Сообщ.
#7
,
|
|
|
|
то у вас
Цитата awax @ Dim rngLogFileRange As Range то Цитата awax @ Dim rngLogFileRange, rngRange As Range вы определитесь, а? ![]() вы пробовали свой макрос по F8 прогнать или проще в форуме спрашивать? )) |
|
Сообщ.
#8
,
|
|
|
|
Цитата 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!!!) при объявлении ![]() ![]() Dim rngLogFileRange, rngRange As Range А что касается F8, то я, безусловно, пользуюсь этой возможностью, но до определенного момента, пока не возникает ошибка, так что полностью прогнать макрос не получается. |
|
Сообщ.
#9
,
|
|
|
|
Цитата Цитата (pvr @ Вчера, 17:04) Function InsertNextOutputTable надо объявить как AS TABLE ( или OBJECT) Это как? Table Function InsertNextOutputTable? Как в сях? Надо юзать Help или учебник какой.... ![]() ![]() Private Function InsertNextOutputTable(docDocument As Document, intTableIndex As Integer) As Table |
|
Сообщ.
#10
,
|
|
|
|
Спасибо, pvr, но компилятор подкинул новую задачку. Функция InsertNextOutputTable создает таблицу и возвращает ссылку на нее.
![]() ![]() 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 Используется ф-я следующим образом: ![]() ![]() Dim tblTargetTable As table ' ... ' ... ' ... Set tblTargetTable = InsertNextOutputTable(docDocument:=docActive, intTableIndex:=visitUser.intIndex) Во время прогона макроса, при входе в функцию, компилятор сразу останавливает выполнение программы, подсвечивает InsertNextOutputTable в последнем выражении функции и выдает ошибку Compile error: Invalid use of property. Все типы определены и совпадают. В чем дело? Учебник по VBA ответа на этот вопрос не дает |
|
Сообщ.
#11
,
|
|
|
|
![]() ![]() Set InsertNextOutputTable = tblTable ![]() ![]() Set InsertNextOutputTable = docDocument.Tables.Add(Range:=rngTable, NumRows:=1, NumColumns:=5) Цитата awax @ Учебник по VBA ответа на этот вопрос не дает что за источник ?? см. создание ссылки на объект |
|
Сообщ.
#12
,
|
|
|
|
Цитата что за источник ?? VBA for Dummies |
|
Сообщ.
#13
,
|
|
|
|
гм, попользуй ссылочку, много чего полезного есть
http://word.mvps.org/FAQs/MacrosVBA/ |
|
Сообщ.
#14
,
|
|
|
|
Цитата Old Bat @ ![]() ![]() Set InsertNextOutputTable = tblTable ![]() ![]() Set InsertNextOutputTable = docDocument.Tables.Add(Range:=rngTable, NumRows:=1, NumColumns:=5) Спасибо за подсказку. Все работает. Ссылку почитаю. Держи плюс |