Возник вопрос следующего характера: сталкивался ли кто-нибудь с проблемой изменения формата данных при транспонировании массива в коде макроса?
Имеется рекордсет, сформированный из внешней БД, из которого с помощью GetRows получаю массив. Тип определенных полей после формирования массива - Currency (денежный). Но таблица "перевернутая". При транспонировании следующим образом:
[vba]
Код
tmpAr = Application.Transpose(tmpAr)
[/vba]
те поля, которые были с типом денежный, конвертируются в текстовый тип данных в виде "0,00р.". При том, что те поля у которых тип был Double, остаются числовыми.
Это что-то с моим кодом или это такая неожиданная "фишка" Excel?
Всем доброго дня и с наступающими праздниками!
Возник вопрос следующего характера: сталкивался ли кто-нибудь с проблемой изменения формата данных при транспонировании массива в коде макроса?
Имеется рекордсет, сформированный из внешней БД, из которого с помощью GetRows получаю массив. Тип определенных полей после формирования массива - Currency (денежный). Но таблица "перевернутая". При транспонировании следующим образом:
[vba]
Код
tmpAr = Application.Transpose(tmpAr)
[/vba]
те поля, которые были с типом денежный, конвертируются в текстовый тип данных в виде "0,00р.". При том, что те поля у которых тип был Double, остаются числовыми.
Это что-то с моим кодом или это такая неожиданная "фишка" Excel?tsap
Сообщение отредактировал tsap - Понедельник, 29.12.2014, 12:31
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.
Все дело в том, что тип данных преобразуется именно при транспонировании и на выходе получаем данные вида, к примеру "4 250р.". в таком текстовом виде оно и записывается на лист. Тут форматом уже не поменяешь.
Hugo, tmpAr задаю как variant, т.к. в Recordset имеются как текстовые, так и числовые данные (часть с типом currency, другая часть - double).
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.
Все дело в том, что тип данных преобразуется именно при транспонировании и на выходе получаем данные вида, к примеру "4 250р.". в таком текстовом виде оно и записывается на лист. Тут форматом уже не поменяешь.tsap
Т.е. изначально в массиве currency, а после поворота получаете string? Не верю. Можете сделать небольшой пример базы и показать код, который с нею работает?
Т.е. изначально в массиве currency, а после поворота получаете string? Не верю. Можете сделать небольшой пример базы и показать код, который с нею работает?Hugo
Sub qq() Dim arr, arr1 arr = [a1:a10].Value For i = 1 To UBound(arr) arr(i, 1) = CCur(arr(i, 1)) Next ReDim arr1(LBound(arr, 2) To UBound(arr, 2), LBound(arr, 1) To UBound(arr, 1)) arr1 = Application.Transpose(arr) End Sub
[/vba]
tsap, Придется циклом.
Игорь, точно в стринг перекидывает. [vba]
Код
Sub qq() Dim arr, arr1 arr = [a1:a10].Value For i = 1 To UBound(arr) arr(i, 1) = CCur(arr(i, 1)) Next ReDim arr1(LBound(arr, 2) To UBound(arr, 2), LBound(arr, 1) To UBound(arr, 1)) arr1 = Application.Transpose(arr) End Sub
Вообще-то база на SQL сервере, набросал на скорую пример на соседнем листе в книге:
[vba]
Код
Sub Get_from_DB() '----------------------------- Dim cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As ADODB.Recordset '-------------------------- Dim s As String Dim tmpAr
With ThisWorkbook.Worksheets("Лист2").Range(Cells(4, 2), Cells(UBound(tmpAr) + 3, 9)) .Select .Value = tmpAr End With
rst.Close cnn.Close
With ThisWorkbook '+++++++++++ Возвращаем обычный формат ++++++++++++++++ .Worksheets("Db_Sheet").Range("c2:h20").Style = "Normal" '++++++++++++++++++++++++++++++++++++++++++++++++++++++ End With '----------------------------- End Sub
[/vba]
Вообще-то база на SQL сервере, набросал на скорую пример на соседнем листе в книге:
[vba]
Код
Sub Get_from_DB() '----------------------------- Dim cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As ADODB.Recordset '-------------------------- Dim s As String Dim tmpAr
With ThisWorkbook.Worksheets("Лист2").Range(Cells(4, 2), Cells(UBound(tmpAr) + 3, 9)) .Select .Value = tmpAr End With
rst.Close cnn.Close
With ThisWorkbook '+++++++++++ Возвращаем обычный формат ++++++++++++++++ .Worksheets("Db_Sheet").Range("c2:h20").Style = "Normal" '++++++++++++++++++++++++++++++++++++++++++++++++++++++ End With '----------------------------- End Sub