#excel #vba #ms-access #export #recordset
#excel #vba #ms-access #экспорт #набор записей
Вопрос:
У меня есть запрос, который показывает цену на мои продукты и сравнивает с предыдущими месяцами. Запрос в Access правильно отображает цены с 4 десятичными знаками, но когда я экспортирую в Excel с помощью приведенного ниже кода, цифры округляются до 2 десятичных знаков. В моем коде много строк форматирования, которые я опустил. Пожалуйста, обратите внимание, что я не форматирую цену в Excel. Я хочу показать все число. Я думаю, что функция набора записей каким-то образом округляет число. Я ценю помощь. Спасибо
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim i As Integer
Dim SQL As String
Dim rs1 As DAO.Recordset
SQL = "SELECT tblTempCurrentPastRawPrice.ID, tblTempCurrentPastRawPrice.[Raw Material]," amp; _
"tblTempCurrentPastRawPrice.Lastbought, tblTempCurrentPastRawPrice.PreviousPrice," amp; _
"tblTempCurrentPastRawPrice.Newdate, tblTempCurrentPastRawPrice.LastPrice," amp; _
"tblTempCurrentPastRawPrice.ReportDate FROM tblTempCurrentPastRawPrice ORDER BY tblTempCurrentPastRawPrice.[Raw Material]"
Set rs1 = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot)
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
With xlSheet
i = 7
Do While Not rs1.EOF
.Range("A" amp; i).Value = Nz(rs1![Raw Material], "")
.Range("B" amp; i).Value = Nz(rs1!Lastbought, "")
.Range("C" amp; i).Value = Nz(rs1!PreviousPrice, 0)
.Range("D" amp; i).Value = Nz(rs1!Newdate, 0)
.Range("E" amp; i).Value = Nz(rs1!LastPrice, 0)
i = i 1
rs1.MoveNext
Комментарии:
1. Если вы отредактируете ячейку Excel, десятичные дроби по-прежнему отсутствуют?
2. ДА. файл Excel содержит 2 десятичных знака. в Access отображается 0,3193, если я изменю формат в Excel, это будет 0,3200
3. Вы меняете формат в Excel до или после экспорта?
Ответ №1:
Интересно, я могу воспроизвести это. Это происходит потому, что столбцы имеют тип Currency
.
По-видимому, Excel, как обычно, хочет быть более умным, чем это полезно для вас, и предполагает, что Currency всегда поставляется с двумя десятичными знаками и округляет их.
Чтобы легко воспроизвести, используйте этот код:
With xlSheet
i = 7
.Range("F" amp; i).Value = CDbl(1.2345) ' Result: 1.2345
.Range("G" amp; i).Value = CCur(1.2345) ' Result: 1.23 €
End With
Обратите внимание, что CCur(1.2345)
в Access все еще 1.2345
.
Чтобы решить эту проблему, преобразуйте в Double
перед записью в Excel, а затем отформатируйте в качестве валюты в Excel (с 2 или 4 десятичными знаками, в обоих случаях число фактически будет содержать все 4 десятичных знака):
With .Range("C" amp; i)
.Value = CDbl(Nz(rs1!PreviousPrice, 0))
.NumberFormat = "#,##0.0000 $"
End With