Страница: 1 |
|
Вопрос: Сравнение масивов
|
Добавлено: 08.12.08 10:28
|
|
Автор вопроса: AngryBadger
|
Всем доброго времени суток!
Подскажите, есть ли в VBA функция сравнения двух масивов? Проблема в следующем, есть два масива разного размера(клиенты на начало недели и клиенты на конец недели), необходимо путем сравнения определить какие клиенты добавились, а какие выбыли за неделю.
Ответить
|
Номер ответа: 1 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #1
|
Добавлено: 08.12.08 20:23
|
Как таковой функции, реализующей сравнение массивов, которое в Вашем случае правильно было бы назвать разностью, в VBA не существует. Я предлагаю вариант функции, основанной на использовании коллекции из уникальных элементов.
- Option Explicit
- Option Base 1
-
- Function ArraysDifference(primArray As Variant, secondArray As Variant) As Variant
- Dim newItems() As String
- Dim item As Variant
- Dim tempItems As New Collection
- Dim count As Integer
-
-
- For Each item In primArray
- tempItems.Add item, item
- Next item
-
-
-
- count = 0
- For Each item In secondArray
- On Error Resume Next
- tempItems.Add item, item
- If Err = 0 Then
- count = count + 1
- ReDim Preserve newItems(count)
- newItems(count) = item
- End If
- On Error GoTo 0
- Next item
- ArraysDifference = newItems
- End Function
-
- Sub TestArrayDifference()
- Dim array1, array2 As Variant
- Dim newEmploy, escEmploy As Variant
-
- array1 = Array("Дима", "Вася", "Петя", "Костя", "Паша")
-
- array2 = Array("Лёха", "Игорь", "Петя", "Костя", "Боря")
-
- newEmploy = ArraysDifference(array1, array2)
-
- escEmploy = ArraysDifference(array2, array1)
- End Sub
Ответить
|
Номер ответа: 3 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #3
|
Добавлено: 09.12.08 16:36
|
Михаил: А есть ли у тебя пример программного заполнения массива?
Массив можно заполнять из разных источников: диапазонов, файлов, функций... Какой вариант Вас интересует?
Ответить
|
Номер ответа: 5 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #5
|
Добавлено: 09.12.08 20:13
|
Ну вот к примеру макрос, который заносит в массив значения из числового диапазона.
- Option Explicit
- Option Base 1
-
- Sub RangeArray()
- Dim theNumbers() As Integer
- Dim theRange As Range
- Dim item As Variant
- Dim i As Integer
-
-
- Set theRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
-
- i = 0
- For Each item In theRange
- i = i + 1
- ReDim Preserve theNumbers(i)
- theNumbers(i) = CInt(item)
-
- Debug.Print theNumbers(i)
- Next item
- End Sub
Ключевой здесь является строка
- ReDim Preserve theNumbers(i)
Оператор Redim Preserve переопределяет размерность массива, сохраняя все его элементы.
Возможен и более рациональный вариант, в котором размерность массива определяется непосредственно перед циклом:
- Option Explicit
- Option Base 1
-
- Sub RangeArray()
- Dim theNumbers() As Integer
- Dim theRange As Range
- Dim item As Variant
- Dim i As Integer
-
-
- Set theRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
-
- ReDim theNumbers(theRange.Cells.Count)
-
- i = 0
- For Each item In theRange
- i = i + 1
- theNumbers(i) = CInt(item)
-
- Debug.Print theNumbers(i)
- Next item
- End Sub
В этом случае оператор Preserve, сохраняющий элементы, нам уже не нужен, ибо вначале массив пустой.
Ответить
|
Номер ответа: 6 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #6
|
Добавлено: 09.12.08 21:44
|
Наиболее удобно было бы заполнять из диапазона.
Вот любопытный способ:
- Dim ar() As Variant
- ar() = Range("A1:A10")
- Dim x As Integer
- For x = 1 To 10
- Debug.Print ar(x, 1)
- Next
что интересно, LBound этого массива = 1, даже при Option Base 0
Ответить
|
Страница: 1 |
Поиск по форуму