Страница: 1 |
Вопрос: Аргумент функции массив (синтаксис) | Добавлено: 21.06.06 10:07 |
Автор вопроса: ![]() |
Создала процедуру, которая вызывается в главном модуле и получает n1 - количество выбранных пунктов списка и массив listname1(q) - имена выбранных пунктов списка (процедура работает правильно). Затем вызываю функцию NameList1
с аргументом listname1(), он меня посылает и говорит Subscript out of range. Текст процедуры: Sub trans(n1 As Integer, listname1() As String) Dim Acells() As String MsgBox (n1) For q = 0 To n1 MsgBox (listname1(q)) Acells(q) = (listname1()) Next q End Sub Текст функции: Public Function NameList1(listname1() As String) Dim ArrAdrCeLLs1(10000) As String With Worksheets(listname1()).Range("a1:w50") Set c = .find(999999, LookIn:=xlValues) If Not c Is Nothing Then firstaddress = c.Address Do ArrAdrCeLLs1(i) = c.Address NameList1 = ArrAdrCeLLs1(i) i = i + 1 Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstaddress End If End With End Function Полагаю, что-то с синтаксисом, подскажите где? |
Ответы | Всего ответов: 10 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #1 | Добавлено: 21.06.06 11:36 |
With Worksheets(listname1()).Range("a1:w50" А элемент массива указать...
![]() |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ICQ: 229-356-346 Вопросов: 8 Ответов: 20 |
Профиль | Цитата | #2 | Добавлено: 21.06.06 12:03 |
В этом все и дело. Не могу индекс массива передать. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #3 | Добавлено: 21.06.06 12:12 |
Если ты его знаешь, что мешает вместо: Public Function NameList1(listname1() As String) не сделать:
Function NameList1(ListName1() As String, ЭлементListName1 As Long)
'... With Worksheets(ListName1(ЭлементListName1 )).Range("a1:w50" ![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ICQ: 229-356-346 Вопросов: 8 Ответов: 20 |
Профиль | Цитата | #4 | Добавлено: 21.06.06 12:19 |
Делала я так. Дает ту же самую ошибку.
Public Function NameList1(listname1() As String, q As Long) Dim ArrAdrCeLLs1(10000) As String With Worksheets(listname1(q)).Range("a1:w50" ![]() Set c = .find(999999, LookIn:=xlValues) If Not c Is Nothing Then firstaddress = c.Address ![]() ArrAdrCeLLs1(i) = c.Address NameList1 = ArrAdrCeLLs1(i) i = i + 1 Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstaddress End If End With End Function Sub trans(n1 As Integer, listname1() As String) Dim Acells() As String, q As Long 'MsgBox (n1) For q = 0 To n1 'MsgBox (listname1(q)) Acells(q) = NameList1(listname1(), q) Next q End Sub |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #5 | Добавлено: 21.06.06 13:02 |
Возможно следущее:
For q = 0 To n1
'MsgBox (listname1(q)) То есть перебор ты нашинаешь с элемента нолик, а нижняя граница массива у тебя единичка. Вот и ошибка. Проверь в твоем массиве: Sub trans(n1 As Integer, listname1() As String)
Dim Acells() As String, q As Long, НижняяГраница As Long, ВерхняяГраница As Long 'MsgBox (n1) НижняяГраница = LBound(listname1()) ВерхняяГраница = UBound(listname1()) 'если НижняяГраница=1 а у тебя For q = 0 - то естественно ошибка! Ставь For q = 1 For q = 0 To n1 'MsgBox (listname1(q)) Acells(q) = NameList1(listname1(), q) Next q End Sub |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ICQ: 229-356-346 Вопросов: 8 Ответов: 20 |
Профиль | Цитата | #6 | Добавлено: 21.06.06 13:25 |
Спасибо. Стало гораздо светлее. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ICQ: 229-356-346 Вопросов: 8 Ответов: 20 |
Профиль | Цитата | #7 | Добавлено: 21.06.06 14:20 |
Можно ли передать параметр param из процедуры в основной модуль, не вызывая процедуру в нем (т.е. этот параметр был получен с помощью функции, а процедура уже отработала, например в блоке событий формы ввода).
Основной модуль: sub OsnMod() param ? end sud Процедура: sub proc() param=function() end sub |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #8 | Добавлено: 21.06.06 14:46 |
Конечно можно. Определяй переменную param на уровне модуля.
Стандартный модуль: Option Explicit
Public Param As Long 'дальше следуют все твои процедуры... Sub.. Sub... Sub... Обявленная таким образом переменная Param будет доступна во всех модулях всех процедур до закрытия проекта (то бишь твоего файлика). Устанавливать и считывать значение такой переменной можно будет из любого модуля. А вот объявлять ее лучше в стандартном модуле. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ICQ: 229-356-346 Вопросов: 8 Ответов: 20 |
Профиль | Цитата | #9 | Добавлено: 22.06.06 07:37 |
А значение этого параметра передать можно?
Option Explicit Public Param As Long Sub Макрос1() MsgBox (Param)'Дает 0. End Sub Sub proc() Param = 10 End Sub |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 7 Ответов: 188 |
Профиль | Цитата | #10 | Добавлено: 22.06.06 09:13 |
Ваша неправда!
MsgBox (Param)'Дает 0. Дает 10.
Сначала вызываешь Sub proc() Потом вызываешь Sub Макрос1() И будет 10. По другому невозможно.
|
Страница: 1 |
|