Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Упростить код. Добавлено: 19.01.09 10:07  

Автор вопроса:  AngryBadger
 Доброго времени суток!

Написал функцию для заполнения массива, но он медленно работает, если нужно заполнить большлй массив. Посмотрите пожалуйста, есть ли какая-нибудь возможность его упростить. Причем, нужно чтобы в массив значения ячеек попадали таким образом:
При выделении диапазона $A$1:B$3$

Массив(1)=Cells(1,1).Value
Массив(2)=Cells(2,1).Value
Массив(3)=Cells(3,1).Value
Массив(4)=Cells(1,2).Value
Массив(5)=Cells(2,2).Value
Массив(6)=Cells(3,2).Value

Вот мой код:

Option Explicit
Option Base 1
'______________________________________________________
Public Function FillTheArray() As Variant

Dim MyRange As Range           'Выделенный диапазон
Dim MyArray As Variant          'Массив, который заполняем
Dim i As Integer                 'Просто счетчик

Dim iSelRows As Integer             'Количество рядов в выделеном диапазоне
Dim iFirstRow As Integer            'Ряд первой ячейки в выделеном диапазоне
Dim iCurrentRow As Integer          'Ряд текущей ячейки
Dim iCurrentColumn As Integer       'Столбец текущей ячейки

    iSelRows = Selection.Rows.Count
    iFirstRow = Selection.Row
    iCurrentRow = Selection.Row
    iCurrentColumn = Selection.Column

    Set MyRange = Range(Selection.Cells.Address)
  ReDim MyArray(MyRange.Cells.Count)

For i = 1 To MyRange.Cells.Count
    MyArray(i) = Cells(iCurrentRow, iCurrentColumn).Value
    Debug.Print MyArray(i)
        If iCurrentRow + 1 < iSelRows + iFirstRow Then
            iCurrentRow = iCurrentRow + 1
        Else
            iCurrentRow = iFirstRow
            iCurrentColumn = iCurrentColumn + 1
        End If
Next i

FillTheArray = MyArray

End Function
'______________________________________________________
Sub FillTheArray_Test()
Dim MyArr As Variant
MyArr = FillTheArray
End Sub

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #1 Добавлено: 19.01.09 10:30
Что-то я совсем по-русски написал)), но думаю, все поняли)

Ответить

Номер ответа: 2
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #2 Добавлено: 19.01.09 13:21
  1. Public Function FillTheArray() As Variant
  2. Dim MyRange As Range           'Выделенный диапазон
  3. Dim MyArray() As Variant          'Массив, который заполняем
  4. Dim C As Long, R As Long
  5. Dim i As Long                 'Просто счетчик
  6. Set MyRange = Selection
  7. ReDim MyArray(MyRange.Count)
  8. For C = 1 To MyRange.Columns.Count
  9.   For R = 1 To MyRange.Rows.Count
  10.     i = i + 1
  11.     MyArray(i) = MyRange(R, C)
  12.   Next R
  13. Next C
  14. FillTheArray = MyArray
  15. End Function


Попробуй так (еще более по-русски, как мне кажется).
Большого выигрыша в скорости вряд-ли получится, но вдруг.
Кстати, объявлять массив просто как Variant не совсем корректно.

Ответить

Номер ответа: 3
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #3 Добавлено: 19.01.09 14:46
Угу. И ваще - работа с переменными типа Variant происходит значительно дольше чем с др. типами.

Ответить

Номер ответа: 4
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #4 Добавлено: 19.01.09 15:02
Да это-то понятно, но у меня массив, действительно, состоит из элементов с разными типами данных.
fAndOrIn, спасибо. Но выиграша в скорости, действительно нет. Ну и ладно)

Ответить

Номер ответа: 5
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #5 Добавлено: 19.01.09 20:04
Кстати, при тестировании на скорость, надеюсь, выключаете строки типа
  1. Debug.Print MyArray(i)
. В данном примере разница примерно в 50 раз!

Ответить

Номер ответа: 6
Автор ответа:
 AngryBadger



ICQ: 3329[нуль]7519 

Вопросов: 0
Ответов: 13
 Web-сайт: mfgang.ru
 Профиль | | #6
Добавлено: 19.01.09 21:52
Михаил at home

Ка-анэщна))), оно там нужно было для проверки))

Ответить

Страница: 1 |

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



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