CopyFromRecordset неправильно форматирует ячейки как дату?

У меня есть лист Excel, который загружает данные из базы данных, а затем помещает их в таблицу Excel с помощью команды VBA CopyFromRecordset. Моя проблема в том, что ряд ячеек (которые должны быть целыми числами) продолжают форматироваться как дата, независимо от того, что я делаю. Я изменил числовой формат в Excel на числовой, но всякий раз, когда я перезагружаю данные из базы данных, формат переключается обратно на сегодняшний день.

Тип данных в базе данных — Integer, и тем не менее, когда я загружаю данные из БД, Excel по-прежнему меняет формат ячейки на Date. Даже если конечный пользователь вводит целое число в ячейку после загрузки данных, Excel меняет его на дату. Например, если я ввожу в ячейки число 5, Excel меняет его на 1/5/1900.

Почему Excel продолжает изменять эти ячейки на даты, даже после того, как раскрывающийся список формата изменен на что-то другое?

Что я пробовал:

  • Изменен формат с даты на число, общий и текст. Он возвращается к дате на CopyFromRecordset

  • удалив столбец и создав новый в формате Number. Он все еще возвращается на CopyFromRecordset

  • Приведите тип данных к целому числу в операторе выбора

Любые другие идеи?

Часть кода VBA, которая загружает данные из базы данных:

SQLStr = "Select ......, [SO] FROM v_TRACKING"
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server Native Client 11.0};Server=" & Server_Name & ";Database=" & Database_Name & ";Trusted_connection=yes;"
rs.Open SQLStr, Cn, adOpenStatic

dataRange = "a13:az" & (rs.RecordCount + 12)

With ActiveSheet.Range(dataRange)
    .ClearContents
    .CopyFromRecordset rs
End With

Все остальные столбцы остаются в правильном формате, но по какой-то причине столбец SO форматируется как дата. Я уже несколько дней бьюсь об стену по этому поводу, так что любые идеи будут оценены :)


person PessimisticPaperClip    schedule 26.12.2018    source источник


Ответы (2)


Я сталкивался с этой проблемой раньше; это можно решить, используя свойство Cells диапазона:

With ActiveSheet.Range(dataRange)
    .ClearContents
    .Cells(1,1).CopyFromRecordset rs
End With
person RADO    schedule 27.12.2018
comment
Это сработало! Это здорово, потому что по-прежнему позволяет мне очистить содержимое диапазона. Я не понимал, что одна ячейка работает как диапазон. Спасибо еще раз! - person PessimisticPaperClip; 27.12.2018

Одной ячейки достаточно для диапазона, чтобы отформатировать столбец в числовом формате.

DataRange = "a13"
With ActiveSheet.Range(DataRange)
    With ActiveSheet.Range(DataRange).CurrentRegion
        .ClearContents
        .CurrentRegion.Columns("SO").NumberFormatLocal = "0_ "
    End With
    .CopyFromRecordset rs
End With
person Dy.Lee    schedule 27.12.2018