Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача приватного опред пользователем массива / 16 сообщений из 16, страница 1 из 1
21.07.2009, 14:38:14
    #36100927
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Имеется множество одинаковых пар листов Excel с идентичным прогр кодом. Естественно, все переменные - private, во избежание конфликта имен. В кодах листов определены массивы определенной пользователем переменной, с кот, кстати, производится операция Redim, т.е. изменяющегося размера. Для управления листом из него создается форма, кот. читает БД и должна писать в этот приватный массив рез-ты запроса к БД.
Вопрос такой, - как передать ссылку на такой приватный массив в форму?
...
Рейтинг: 0 / 0
21.07.2009, 14:51:03
    #36100952
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
PS. Сейчас делаю это через Public функцию в листе, однако, в этом случае приходится менять прогр код в листах типа ListName.PublicFunction(.......). Т.е. код в листах теряет идентичность.
...
Рейтинг: 0 / 0
21.07.2009, 15:44:10
    #36101104
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Попробуй так:

в модуле Листа 1
Код: plaintext
1.
2.
Private Function FuncSheet1()
    MsgBox "Hello world!"
End Function

в модуле Листа 2
Код: plaintext
1.
2.
Sub MacroSheet2()
    x = Run("Sheet1.FuncSheet1")
End Sub
...
Рейтинг: 0 / 0
21.07.2009, 16:56:37
    #36101338
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Я уже так делаю, нмного иначе.
Лист1
Код: plaintext
1.
2.
3.
public sub Sub1()
     debug.print "qwerty"
endSub
Лист2
Код: plaintext
1.
2.
3.
 public sub Sub2
     Sheets("Лист1"). Sub1
end Sub
endSub
В этом случае 2-му листу или форме передается String - имя связанного листа. B т.к. таких (одинаковых) листов много. можно код не менять, а подставлять StringName Во так -

StringName="List1"
Sheets(StringName). Sub1

и выполняется функция нужного листа.

Для массива мне это не нравится, его приходится без конца копировать циклом через функцию и это достаточно тягомотно.
...
Рейтинг: 0 / 0
21.07.2009, 17:13:59
    #36101378
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
YUBA...
Для массива мне это не нравится, его приходится без конца копировать циклом через функцию и это достаточно тягомотно.
Функция или Ваш Sub1 не может вернуть массив?
...
Рейтинг: 0 / 0
21.07.2009, 19:14:23
    #36101671
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
без копирования массива не знаю как.
1. Функция не может возвращать массив.
Далее
Лист1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private DBData() as UserType
sub Sub1(DBData1() as UserType)
......
for i= 0  to N
'Копируем массив в массив
DBData(i).a=DBData(i).a
..........
Next
........
end Sub

Лист2 или Form
Код: plaintext
1.
2.
3.
4.
5.
Private DBDat() as UserType
......
Call ReadDB(DBDat, SQLStr) 'Читает данные из БД в массив
Call Sheets("Лист1").Sub1(DBDat) ' Копирует в массив на др. листе
........

Массивы большие, и копирование занимает много времени.
Нужно организовать ссылку на приватный массив из 1-го листа.
...
Рейтинг: 0 / 0
21.07.2009, 19:23:35
    #36101683
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Строка
Код: plaintext
1.
DBData(i).a=DBData(i).a
Читается как
Код: plaintext
1.
DBData(i).a=DBData1(i).a
Извините за опечатку.
Нужно сразу писать в приватный массив в Sub ReadDB
...
Рейтинг: 0 / 0
21.07.2009, 20:22:18
    #36101739
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Ну, вроде сделал.
List1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
private DBData() as UserType
Private LName as String
........
Call InitForm(LName)
.........
Public Sub ReadDB1(SQlStr as String)
Call ReadDB(SQLStr,DBData)
End Sub
...........
Call InitForm(LName) ' в форму (или другой лист) передается имя листа с массивом
Код в Форме или др. Листе
Код: plaintext
1.
2.
3.
4.
5.
Private ListName as string
Public Sub InitForm(Lname as String)
ListName=Lname
End Sub
.........
Call Sheets("ListName").ReadDB1(SQLSt) ' Читает БД в массив  1 -го листа 




[/SRC]
...
Рейтинг: 0 / 0
22.07.2009, 00:00:59
    #36101929
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
YUBAбез копирования массива не знаю как.
1. Функция не может возвращать массив.

YUBA, вы это опытным путем определили или прочитали где-то? ;-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private DBData() as UserType
sub Sub1(DBData1() as UserType)
......
for i= 0  to N
'Копируем массив в массив
DBData(i).a=DBData(i).a
..........
Next
........
end Sub
Call Sheets("Лист1").Sub1(DBDat) ' Копирует в массив на др. листе
........
[/quot]

Из обрывков, которые вы показываете трудно извлечь нужную информацию, но у меня подозрение, что ваш код работающий с массивами сильно улучшаем. А какой смысл копировать из массива в массив с помощью цикла, если это все равно запрос SQL? Или у вас там еще какой отсев идет? Массив на другом листе - это диапазон? В Диапазон тоже циклом копируете?
...
Рейтинг: 0 / 0
22.07.2009, 15:06:03
    #36103140
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Массив - это массив. Диапазон - это диапазон. Данные из массива на лист в чистом виде не попадают.
В общем, эта задача уже решена, решение в предыдущем посте.
Кстати покажите, как функция массив может вернуть. Я такого не знаю.
...
Рейтинг: 0 / 0
22.07.2009, 18:14:23
    #36103832
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
YUBAМассив - это массив. Диапазон - это диапазон. Данные из массива на лист в чистом виде не попадают.
В общем, эта задача уже решена, решение в предыдущем посте.
Кстати покажите, как функция массив может вернуть. Я такого не знаю.

Легко!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Function ReturnArray1()
    ReturnArray1 = Array("jan", "feb", "mar", "apr", "may")
End Function

Function ReturnArray2()
    Dim MyArray( 0  To  3 ) As String
    MyArray( 0 ) = "mon"
    MyArray( 1 ) = "tue"
    MyArray( 2 ) = "wed"
    MyArray( 3 ) = "thu"
    ReturnArray2 = MyArray
End Function

Function ReturnArray3()
    ReturnArray3 = [A1:E1].Value
End Function

Sub testFunctions()
    'Test 1
    For i =  0  To UBound(ReturnArray1)
        MsgBox ReturnArray1(i)
    Next i
    'Test 2
    arrTest = ReturnArray2
    For i =  0  To UBound(arrTest)
        MsgBox arrTest(i)
    Next i
    'Test 3
    [A1:E1].Value = Array( 33 ,  54 ,  66 ,  99 ,  100 )
    For i =  1  To UBound(arrTest)
        MsgBox ReturnArray3( 1 , i)
    Next i
End Sub

И если можно - услуга за услугу: что тогда такое "массив на др листе" и почему он копируется циклом, а не arrData=Range("A1:A10").Value ?
...
Рейтинг: 0 / 0
22.07.2009, 19:22:04
    #36103997
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
KL (XL)И если можно - услуга за услугу: что тогда такое "массив на др листе" и почему он копируется циклом, а не arrData=Range("A1:A10").Value ? Спасибо за код. не думал, что такое возможно без указателей.
Массив на др. листе - это просто, м.б. некорректно выразился.
Лист содержит VB код и в нем определен массив, в нашем случае User Defined Type
Private MyArr() as Mytype.
В ячейки листов данные из него попадают после обработки, задаваемой пользователем из формы. Там-же формируется и запрос к БД.
...
Рейтинг: 0 / 0
23.07.2009, 20:19:42
    #36106546
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
KL (XL), что-то не работает, однако
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Option Explicit

Dim X( 10 ) As Double
Dim x1( 10 ) As Double

Sub aa()
X( 0 ) =  0 
X( 1 ) =  1 
X( 2 ) =  2 
X( 3 ) =  3 
X( 4 ) =  4 
X( 5 ) =  5 
X( 6 ) =  6 
X( 7 ) =  7 
X( 8 ) =  8 
X( 9 ) =  9 

x1 = bb(X)
Debug.Print x1( 0 ), x1( 1 ), x2( 2 )
End Sub

Function bb(Y1() As Double) As Variant
bb = Y1
End Function
...
Рейтинг: 0 / 0
23.07.2009, 20:45:07
    #36106570
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
KL (XL), Вот в таком виде все действительно дышит, но д.б. определено через Variant
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Option Explicit

Dim X( 10 ) As Double
Dim x1 As Variant

Sub aa()
X( 0 ) =  222 
X( 1 ) =  223 
X( 2 ) =  224 
x1 = bb(X)
Debug.Print UBound(bb(X))
Debug.Print x1( 0 ), x1( 1 ), x1( 2 )
End Sub

Function bb(Y1() As Double) As Variant
bb = Y1
End Function
...
Рейтинг: 0 / 0
23.07.2009, 20:46:20
    #36106572
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
А так? :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Option Explicit

Dim X( 10 ) As Double
Dim x1

Sub aa()
    X( 0 ) =  0 
    X( 1 ) =  1 
    X( 2 ) =  2 
    X( 3 ) =  3 
    X( 4 ) =  4 
    X( 5 ) =  5 
    X( 6 ) =  6 
    X( 7 ) =  7 
    X( 8 ) =  8 
    X( 9 ) =  9 
    
    x1 = bb(X)
    Debug.Print x1( 0 ), x1( 1 ), x1( 2 )
End Sub

Function bb(Y1() As Double) As Variant
    bb = Y1
End Function
...
Рейтинг: 0 / 0
23.07.2009, 20:49:38
    #36106574
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача приватного опред пользователем массива
Через вариант, если присваивать весь массив разом. Если делать перебором, то можно использовать статический массив :-)
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача приватного опред пользователем массива / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]