|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
Подскажите с проблемой. При выгрузке в Excel некоторые данный "прирастают мусором". Например в Access`е внесено значение "561,4", а в Excel выгружается "561,40002"(пример в приложенной картинке). Данные не высчитываемые, забивались руками. Код на экспорт в шаблон: Private Sub Выгрузка_в_EXEL_Click() 'Объявляем переменные Dim rst As Object Dim xlApp As Object Dim xlWb As Object Dim xlWs As Object Dim recArray As Variant Dim strSQL As String Dim fldCount As Integer Dim recCount As Long Dim iCol As Integer Dim iRow As Integer ' Создать экземпляр Excel и добавить книгу Set xlApp = CreateObject("Excel.Application") Set xlWb = xlApp.Workbooks.Open(CurrentProject.Path & "\Шаблоны\Карты_изоляции\171201\В_вводы.xlsx") Set xlWs = xlWb.Worksheets("Ввод") ' Вывести Excel на экран позволить пользователю управлять временем работы Excel xlApp.Visible = True xlApp.UserControl = True ' Скопировать имена полей в первую строку листа 'fldCount = rst.Fields.Count 'For iCol = 1 To fldCount ' xlWs.Cells(1, iCol).Value = rst.Fields(iCol - 1).Name 'Next ' Проверить версию Excel If Val(Mid(xlApp.Version, 1, InStr(1, xlApp.Version, ".") - 1)) > 8 Then 'EXCEL 2000,2002,2003 или 2007: используется метод CopyFromRecordset ' Скопировать набор записей на лист, начиная с ячейки A21 xlWs.Cells(21, 1).CopyFromRecordset rst 'Примечание. При использовании метода CopyFromRecordset произойдет сбой, если набор записей 'содержит поле объекта OLE или массив данных, таких как 'иерархические наборы записей Else 'EXCEL 97 или более ранней версии: Будет использоваться метод GetRows, а затем массив будет скопирован в Excel ' Скопировать набор данных в массив recArray = rst.GetRows 'Примечание. Метод GetRows возвращает массив, индексируемый с 0, первая 'размерность которого содержит поля, а вторая 'содержит записи. Массив будет транспонирован таким образом, чтобы 'первая размерность содержала записи, обеспечивая 'правильное отображение данных при копировании в Excel ' Определить количество строк recCount = UBound(recArray, 2) + 1 '+ 1, поскольку массив индексируется с 0 ' Проверить массив на наличие недопустимого содержимого при ' копировании массива в лист Excel 'For iCol = 0 To fldCount - 1 ' For iRow = 0 To recCount - 1 ' ' Обработка полей Date (дата) ' If IsDate(recArray(iCol, iRow)) Then ' recArray(iCol, iRow) = Format(recArray(iCol, iRow)) ' ' Обработка полей объектов OLE или полей массивов ' ElseIf IsArray(recArray(iCol, iRow)) Then ' recArray(iCol, iRow) = "Array Field" ' End If ' Next iRow 'следующая запись 'Next iCol 'следующее поле ' Транспонировать и скопировать массив в лист, ' начиная с ячейки A21 xlWs.Cells(21, 1).Resize(recCount, fldCount).Value = _ TransposeDim(recArray) End If ' Автоматически подобрать ширину столбцов и высоту строк 'xlApp.Selection.CurrentRegion.Columns.AutoFit 'xlApp.Selection.CurrentRegion.Rows.AutoFit ' Закрыть объекты ADO rst.Close 'cnt.Close Set rst = Nothing 'Set cnt = Nothing ' Освободить ссылки на Excel Set xlWs = Nothing Set xlWb = Nothing Set xlApp = Nothing End Sub Function TransposeDim(v As Variant) As Variant ' Пользовательская функция для транспонирования массива, индексируемого с 0 (v) Dim X As Long, Y As Long, Xupper As Long, Yupper As Long Dim tempArray As Variant Xupper = UBound(v, 2) Yupper = UBound(v, 1) ReDim tempArray(Xupper, Yupper) For X = 0 To Xupper For Y = 0 To Yupper tempArray(X, Y) = v(Y, X) Next Y Next X TransposeDim = tempArray End Function ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 06:49 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555, то что ты видишь в формах и то что хранится в таблицах зачастую несколько отличается друг от друга (и порой значительно!). Обрати внимание на свойство Формат и в таблице и у полей формы. В данном случае Access тебе показывает только заказанное (один или три) количество знаков после запятой. А в Excel сбрасываются истинные значения. Такие странные числа (по мнению многих кто не сталкивался с машинной обработкой) у тебя получились видимо при расчётах (или это вычисляемые поля). Почитай как машина хранит числа (обрати внимание на Single и Double ). Чтобы избежать такого тебе нужно самому округлять числа (ф-ция Round ) или усекать числа до требуемого кол-ва знаков после запятой. Самописных функций для усечения или специального округления ты во множестве найдёшь на страницах данного форума. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 07:16 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555, почитай немного - Что нужно знать про арифметику с плавающей запятой ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 07:22 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
Панург, в том-то и дело что данные в таблицы Access`а занесены в ручную (не импортировались, не высчитывались), все поля "Одинарные с плавающей точкой". Данных не много, заносил сам. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 07:39 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555, читай по ссылке, там объяснено. Округляй или усекай в коде. Можно форматировать в Excel. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 07:46 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555все поля "Одинарные с плавающей точкой".Да, и почему выбран этот тип? А не "Двойное с плавающей точкой" ( Double ) хотя бы. По коду . Там всё практически можно выкинуть (больше половины точно!). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 07:58 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555все поля "Одинарные с плавающей точкой" Вот из-за этого и мусор. В Экселе нет такого типа, преобразование добавляет погрешность. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 08:46 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
Всем спасибо. Решилось, заменой размера поля с "Одинарные с плавающей точкой" на "Действительное". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 09:15 |
|
Странность при экспорте в Excel
|
|||
---|---|---|---|
#18+
DimaSh5555Всем спасибо. Решилось, заменой размера поля с "Одинарные с плавающей точкой" на "Действительное".А еще есть тип денежный,формат основной-почитайте про плавающую точку(чисто "компьютерное" понятие) и,наверное,поймете почему так происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 10:48 |
|
|
start [/forum/topic.php?fid=45&fpage=40&tid=1611007]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 126ms |
0 / 0 |