ник: Lukas
Спасибо, Анатолий.
Что хранят переменные типа Object, String и Variant я примерно догадываюсь.
Пример, на основе вашего:
Sub TestCopyArrays3()
Dim Arr1(1 To 2) As Variant
Dim Arr3(1 To 2, 1 To 2) As Variant
Arr3(1, 1) = "Первый элемент первой размерности массива"
Arr3(1, 2) = "Второй элемент первой размерности массива"
Arr3(2, 1) = "Первый элемент второй размерности массива"
Arr3(2, 2) = "Второй элемент второй размерности массива"
Call CopyMemory(lpvDest:=Arr1(1), lpvSource:=Arr3(1, 1), cbCopy:=UBound(Arr1) * 16)
Debug.Print Arr1(1)
Debug.Print Arr1(2)
End Sub
|
Дает результат:
Первый элемент первой размерности массива
Первый элемент второй размерности массива
|
То есть, мне возвращаются значения "построчно", а не "по столбцу" как мне требуется.
Однако, для массива (0, n) это не будет иметь значения.
Sub TestCopyArrays2()
Dim Arr3(0, 1 To 2) As Variant
Dim Arr1() As Variant
ReDim Arr1(1 To 2)
Arr3(0, 1) = "Первый элемент первой размерности массива"
Arr3(0, 2) = "Второй элемент первой размерности массива"
Call CopyMemory(lpvDest:=Arr1(1), lpvSource:=Arr3(0, 1), cbCopy:=UBound(Arr1) * 16)
Debug.Print Arr1(1)
Debug.Print Arr1(2)
End Sub
|
Результат:
Первый элемент первой размерности массива
Второй элемент первой размерности массива
|
То есть, в принципе, то что мне нужно.
Вот то, над чем я веселюсь:
Public Function Test5()
Dim varArr() As Variant, strArr() As Variant
With CurrentDb.OpenRecordset("SELECT Item From tbl21 WHERE ID<7", dbOpenSnapshot)'6 записей
.MoveLast: .MoveFirst
varArr = .GetRows(.recordCount)
ReDim strArr(1 To .recordCount)
.Close
End With
CopyMemory strArr(1), varArr(0, 0), 16 * UBound(strArr)
Debug.Print strArr(1); strArr(2); strArr(3); strArr(4); strArr(5); strArr(6)
End Function
|
Примерный результат =>
Причем, при первом вызове всегда дает правильный результат,
а на последующих либо врет - либо вылет в аут всего Access-а.
(на 2 вызов, на третий... всегда по-разному)