Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Аргумент функции массив (синтаксис) Добавлено: 21.06.06 10:07  

Автор вопроса:  SvetlanaL | ICQ: 229-356-346 
Создала процедуру, которая вызывается в главном модуле и получает 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
Автор ответа:
 SvetlanaL



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
Автор ответа:
 SvetlanaL



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
        ;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

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
Автор ответа:
 SvetlanaL



ICQ: 229-356-346 

Вопросов: 8
Ответов: 20
 Профиль | | #6 Добавлено: 21.06.06 13:25
Спасибо. Стало гораздо светлее.

Ответить

Номер ответа: 7
Автор ответа:
 SvetlanaL



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
Автор ответа:
 SvetlanaL



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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам