Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Меняется формат данных при транспонировании массива - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Меняется формат данных при транспонировании массива (Макросы/Sub)
Меняется формат данных при транспонировании массива
tsap Дата: Понедельник, 29.12.2014, 12:31 | Сообщение № 1
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013
Всем доброго дня и с наступающими праздниками!

Возник вопрос следующего характера: сталкивался ли кто-нибудь с проблемой изменения формата данных при транспонировании массива в коде макроса?

Имеется рекордсет, сформированный из внешней БД, из которого с помощью GetRows получаю массив. Тип определенных полей после формирования массива - Currency (денежный). Но таблица "перевернутая". При транспонировании следующим образом:

[vba]
Код
tmpAr = Application.Transpose(tmpAr)
[/vba]

те поля, которые были с типом денежный, конвертируются в текстовый тип данных в виде "0,00р.". При том, что те поля у которых тип был Double, остаются числовыми.

Это что-то с моим кодом или это такая неожиданная "фишка" Excel?




Сообщение отредактировал tsap - Понедельник, 29.12.2014, 12:31
 
Ответить
СообщениеВсем доброго дня и с наступающими праздниками!

Возник вопрос следующего характера: сталкивался ли кто-нибудь с проблемой изменения формата данных при транспонировании массива в коде макроса?

Имеется рекордсет, сформированный из внешней БД, из которого с помощью GetRows получаю массив. Тип определенных полей после формирования массива - Currency (денежный). Но таблица "перевернутая". При транспонировании следующим образом:

[vba]
Код
tmpAr = Application.Transpose(tmpAr)
[/vba]

те поля, которые были с типом денежный, конвертируются в текстовый тип данных в виде "0,00р.". При том, что те поля у которых тип был Double, остаются числовыми.

Это что-то с моим кодом или это такая неожиданная "фишка" Excel?

Автор - tsap
Дата добавления - 29.12.2014 в 12:31
Hugo Дата: Понедельник, 29.12.2014, 13:05 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Добрый день.
Какой тип данных в tmpAr?
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеДобрый день.
Какой тип данных в tmpAr?
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.

Автор - Hugo
Дата добавления - 29.12.2014 в 13:05
tsap Дата: Понедельник, 29.12.2014, 13:43 | Сообщение № 3
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013
Hugo, tmpAr задаю как variant, т.к. в Recordset имеются как текстовые, так и числовые данные (часть с типом currency, другая часть - double).
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.

Все дело в том, что тип данных преобразуется именно при транспонировании и на выходе получаем данные вида, к примеру "4 250р.". в таком текстовом виде оно и записывается на лист. Тут форматом уже не поменяешь.
К сообщению приложен файл: 6591283.png (7.9 Kb) · 2726090.jpg (29.5 Kb)


 
Ответить
СообщениеHugo, tmpAr задаю как variant, т.к. в Recordset имеются как текстовые, так и числовые данные (часть с типом currency, другая часть - double).
А формат ячеек листа нужно в коде задавать отдельно, чтоб Эксель не своевольничал.

Все дело в том, что тип данных преобразуется именно при транспонировании и на выходе получаем данные вида, к примеру "4 250р.". в таком текстовом виде оно и записывается на лист. Тут форматом уже не поменяешь.

Автор - tsap
Дата добавления - 29.12.2014 в 13:43
Hugo Дата: Понедельник, 29.12.2014, 13:59 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Т.е. изначально в массиве currency, а после поворота получаете string? Не верю.
Можете сделать небольшой пример базы и показать код, который с нею работает?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеТ.е. изначально в массиве currency, а после поворота получаете string? Не верю.
Можете сделать небольшой пример базы и показать код, который с нею работает?

Автор - Hugo
Дата добавления - 29.12.2014 в 13:59
RAN Дата: Понедельник, 29.12.2014, 14:47 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Игорь, точно в стринг перекидывает. :(
[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
[/vba]

tsap, Придется циклом.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Понедельник, 29.12.2014, 14:54
 
Ответить
СообщениеИгорь, точно в стринг перекидывает. :(
[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
[/vba]

tsap, Придется циклом.

Автор - RAN
Дата добавления - 29.12.2014 в 14:47
tsap Дата: Понедельник, 29.12.2014, 15:07 | Сообщение № 6
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013
Вообще-то база на 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                    
      
     cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
                             & ThisWorkbook.Path & "\" & ThisWorkbook.Name _
                             & ";" & "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
     cnn.Open
     With ThisWorkbook
     '++++++++++++ Искусственно задаем денежный формат +++++++++++++
     .Worksheets("Db_Sheet").Range("d2:d20").Style = "Currency"
     .Worksheets("Db_Sheet").Range("f2:f20").Style = "Currency"
     .Worksheets("Db_Sheet").Range("h2:h20").Style = "Currency"
     '++++++++++++++++++++++++++++++++++++++++++++++++++++++
     .Worksheets("Лист2").Range(Cells(4, 2), Cells(50, 9)).Clear
     End With
     Set rst = New ADODB.Recordset
         rst.CursorType = adOpenStatic
          
     Set cmd.ActiveConnection = cnn
         cmd.CommandText = "Select * from [Db_Sheet$a1:h16]"

         rst.Open cmd
         tmpAr = rst.GetRows
         tmpAr = Application.Transpose(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]
К сообщению приложен файл: 1341524.xls (45.5 Kb)


 
Ответить
СообщениеВообще-то база на 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                    
      
     cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
                             & ThisWorkbook.Path & "\" & ThisWorkbook.Name _
                             & ";" & "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
     cnn.Open
     With ThisWorkbook
     '++++++++++++ Искусственно задаем денежный формат +++++++++++++
     .Worksheets("Db_Sheet").Range("d2:d20").Style = "Currency"
     .Worksheets("Db_Sheet").Range("f2:f20").Style = "Currency"
     .Worksheets("Db_Sheet").Range("h2:h20").Style = "Currency"
     '++++++++++++++++++++++++++++++++++++++++++++++++++++++
     .Worksheets("Лист2").Range(Cells(4, 2), Cells(50, 9)).Clear
     End With
     Set rst = New ADODB.Recordset
         rst.CursorType = adOpenStatic
          
     Set cmd.ActiveConnection = cnn
         cmd.CommandText = "Select * from [Db_Sheet$a1:h16]"

         rst.Open cmd
         tmpAr = rst.GetRows
         tmpAr = Application.Transpose(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]

Автор - tsap
Дата добавления - 29.12.2014 в 15:07
tsap Дата: Понедельник, 29.12.2014, 15:11 | Сообщение № 7
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013

tsap, Придется циклом


Не хотел циклом, но видимо придется делать так <_<


 
Ответить
Сообщение

tsap, Придется циклом


Не хотел циклом, но видимо придется делать так <_<

Автор - tsap
Дата добавления - 29.12.2014 в 15:11
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Меняется формат данных при транспонировании массива (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!