Страницы: 1
RSS
Вставить таблицу Access в массив вертикально
 
Добрый день. Есть макрос, который берет таблицу Access в массив, но проблема в том, что массив горизонтальный выходит. То есть, вместо 6 столбцов получается 6 строк. Функция Transpose не работает, выдает ошибку Out of memory. Как вставить данные в массив вертикально?
Код
Sub Access()
Dim s As String, fldr As String
Dim dbsNorthwind As Database
Dim rstEmployees As Recordset
Dim strMessage As String
Dim b As Variant

Set dbsNorthwind = OpenDatabase("C:\OP.accdb")
Set rstEmployees = dbsNorthwind.OpenRecordset("SELECT * FROM q_promoexcel")
    b = rstEmployees.GetRows(rstEmployees.RecordCount)
     b = TransposeArray(b)
End sub
_______________________________________________________________________________________

Function TransposeArray(ByVal arr As Variant) As Variant
    Dim tempArray As Variant
    ReDim tempArray(LBound(arr, 2) To UBound(arr, 2), LBound(arr, 1) To UBound(arr, 1))
    For x = LBound(arr, 2) To UBound(arr, 2)
        For y = LBound(arr, 1) To UBound(arr, 1)
            tempArray(x, y) = arr(y, x)
        Next y
    Next x
    TransposeArray = tempArray
End Function

Изменено: Hellmaster - 10.10.2019 22:45:24
 
Так там трансформироыание стоит. В строке 11. Если вам не надо, то убрать.
По вопросам из тем форума, личку не читаю.
 
БМВ, эта строка вызывает функцию ниже. после добавления в массив таблицы Access данные в массиве перевернулись горизонтально, как на скриншоте, то есть вместо 6 столбцов у меня образовалось 6 строк. Функцией я пытался вернуть их назад, но во время выполнения вылетает ошибка out of memory.
Изменено: Hellmaster - 10.10.2019 21:23:15
 
А функцией транспонирования не пробовали? Worksheetfunction.Transpose
 
Цитата
Hellmaster написал:
то есть вместо 6 столбцов у меня образовалось 6 строк
понятие строки и столбцы в массиве - условны. В зависимости от того, что вы дальше с этим делаете, можно и не трогать.
По вопросам из тем форума, личку не читаю.
 
Hellmaster, объявите b и bb массивами и укажите размерность:
Код
    Dim b(), bb()
    ReDim b(1 To rstEmployees.RecordCount, 1 To rstEmployees.Fields.Count)
    ReDim bb(1 To rstEmployees.Fields.Count, 1 To rstEmployees.RecordCount)

    b = rstEmployees.GetRows
    bb = TransposeArray(b) 

Кстати, выгружать на лист в транспонированном виде еще можно так:
Код
Range("A1").CopyFromRecordset rstEmployees
Изменено: Ungrateful - 11.10.2019 09:57:42
 
БМВ, мне в таблице аксеса провести расчеты и вернуть таблицу с расчетами обратно в аксес в другую таблицу. возвращается она транспонированная)
Ungrateful,  на лист я не могу вывести таблицу. у экселя нет столько строк) с двумя массивами попробую поработать. пока что он транспонирует только первые 6 столбцов в 6 строк. Спасибо
 
Цитата
Hellmaster: Функция Transpose не работает
здравствуйте!
Попробуйте её усовершенствованную версию - тут показал
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Hellmaster написал:
возвращается она транспонированная)
покажите как вы возвращаете.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
покажите как вы возвращаете.
А смысл, Михаил? Думаете у ТС решена проблема
Цитата
Hellmaster написал:
вернуть таблицу с расчетами обратно в аксес
С точки зрения же обработки нет никакой разницы как расположены данные записи таблицы по первому индексу массива строки, а по второму - данные строк или по первому индексу данные строки, а по второму - строки, по большому счёт дело привычки. А вот как вернуть данные в таблицу Access на более чем 1000000 строк - та ещё задача по быстродействию :)
 
Цитата
Андрей VG написал:
Думаете у ТС решена проблема
Андрей, ну надеяться то можно :-)
По вопросам из тем форума, личку не читаю.
 
Jack Famous, спасибо, этот вариант работает!
Страницы: 1
Наверх