Страница 1 из 1

Срочняк!! Нужна рекомендация!

Добавлено: 29 ноя 2008, 23:03
Vaseninbox
Здравствуйте, уважаемые программисты!
Подскажите, как описАть следующее, чтобы обрабатывалось наиболее быстро:

Код: Выделить всё

Sub test()
1.Объявить двухмерный массив,например aMyArray, с диапазоном "A1:B10", в разных элементах которого будут разные типы данных (числа, названия чего-то и т.д.);

2.Указать ссылку на него;

3.Обратиться к элементам этого массива, например в следующем случае:
    Объект_Name.Свойство1 = aMyArray("значение элем. массива,например, ячейки "A9")
    Объект_Name.Свойство2 = aMyArray("значение элем. массива,например, ячейки "B5")
    Объект_Name.Свойство3 = aMyArray("значение элем. массива,например, ячейки "A2")
    Объект_Name.Свойство4 = aMyArray("значение элем. массива,например, ячейки "B10")
          .
          .
          .
'и т.д. ещё для 16-ти оставшихся свойств объекта...

4.Очистить сохранённые в памяти значения массива aMyArray для того, чтобы использовать этот же массив в другой процедуре, если удачно отработает test()
End Sub

Re: Срочняк!! Нужна рекомендация!

Добавлено: 30 ноя 2008, 05:30
EducatedFool

Код: Выделить всё

Sub test()
    Dim aMyArray ' объявлять массив не обязательно
    aMyArray = [a1:b10]
    Debug.Print aMyArray(1, 1)
    Debug.Print aMyArray(9, 2)
    Erase aMyArray ' очищать массив тоже не обязательно, т.к. массив объявлен в процедуре
End Sub

А не проще ли так: (для нескольких ячеек разницы в скорости заметно не будет)

Код: Выделить всё

Sub test2()
    Объект_Name.Свойство1 = [a9]
    Объект_Name.Свойство2 = [B5]
End Sub

Так будет ещё быстрее:

Код: Выделить всё

Sub test3()
    Dim aMyArray: aMyArray = [a1:b10]
    With Объект_Name
        .Свойство1 = aMyArray(1, 1)
        .Свойство2 = aMyArray(9, 2)
    End With
End Sub

А в некоторых случаях сработает и такой вариант:

Код: Выделить всё

Sub test4()
    Dim aMyArray: aMyArray = [a1:b10]
    With Объект_Name
        .Properties("Свойство2") = aMyArray(2, 2)
        For i = 1 To 10
            .Properties(aMyArray(i, 1)) = aMyArray(i, 2)
        Next
    End With
End Sub

Re: Срочняк!! Нужна рекомендация!

Добавлено: 30 ноя 2008, 11:21
Vaseninbox
А не проще ли так: (для нескольких ячеек разницы в скорости заметно не будет)
Код:

Код: Выделить всё

Sub test2()
    Объект_Name.Свойство1 = [a9]
    Объект_Name.Свойство2 = [B5]
End Sub
Действительно проще и разница не заметна,но при отправке 20-ти заявок придётся почти одновременно вызвать 20 подобных процедур (параметры заявки,т.е. её свойства забиты в ячейки), в каждой из которых около 10-ти свойств заявки.
Эти заявки дожны выставиться максимально быстро, чтобы успеть захватить текущий уровень цены...
А в случае выше придётся каждый раз ссылаться на определённую ячейку,на определённом листе. т.к. одновременно может быть открыто несколько книг Excel:

Код: Выделить всё

    Объект_Name.Свойство1 = Application.Workbooks("Книга1.xls").Worksheets("Лист1").Range(A9)
    Объект_Name.Свойство2 = Application.Workbooks("Книга1.xls").Worksheets("Лист1").Range(B5)
Поэтому,я думаю,что в моём случае наиболее быстро сработает следующий вариант:

Код: Выделить всё

Sub test()
Dim aMyArray: aMyArray = Application.Workbooks("Книга1.xls").Worksheets("Лист1").[B1:A10]
    With Объект_Name
        .Свойство1 = aMyArray(1, 1)
        .Свойство2 = aMyArray(9, 2)
    End With
End Sub

Re: Срочняк!! Нужна рекомендация!

Добавлено: 30 ноя 2008, 12:43
Vaseninbox
А как сохранить значение массива aMyArray, чтобы потом вызвать его из другой процедуры,не объявляя и не создавая его ещё раз??

Re: Срочняк!! Нужна рекомендация!

Добавлено: 30 ноя 2008, 12:53
EducatedFool

Код: Выделить всё

Dim aMyArray As Variant    ' (напишите в первой строке модуля) - массив доступен только из этого модуля
' или так:
'Public aMyArray As Variant    ' (напишите в первой строке модуля) - массив доступен из любого модуля

Sub test()
    aMyArray = Application.Workbooks("Книга1.xls").Worksheets("Лист1").[B1:A10]
    With Объект_Name
        .Свойство1 = aMyArray(1, 1)
        .Свойство2 = aMyArray(9, 2)
    End With
End Sub
После завершения процедуры test значения в массиве сохранятся.