Я посмотрел на ваши данные и код, и это кажется довольно сложным, отчасти из-за того, что у вас несколько заголовков столбцов.
Перед импортом в Excel вы ДОЛЖНЫ перейти на правильные даты, иначе вы получите смешанныйСумка импорта в зависимости от того, «день»> 12 или нет.
Я бы предложил использовать Power Query для импорта.
- Выберите источник (Из текста /CSV)
- Поскольку у вас есть десять строк заголовков, вы не сможете просто отформатировать столбцы даты так:
- Транспонировать таблицу
- Объединить строки заголовка,используя точку с запятой в качестве разделителя
- снова транспонировать.
- Поднять первую строку до заголовка
- Теперь выберите столбцы даты
- Щелкните правой кнопкой мыши по столбцу
- Выберите тип изменения с языковым стандартом
- Я использовал английский (Европа)
- Переставьте таблицу снова
- Разбить первый столбец точкой с запятой
- Транспонировать внастало время вернуться к нормальной конфигурации
- Закрыть и загрузить
Возможно, вам придется отформатировать столбцы даты обратно в дату / время, так как они могутотображаются как десятичные числа, например: 43724.6587
РЕДАКТИРОВАТЬ Учитывая, что вы не можете использовать Power Query, вот метод "чистого VBA", который должен правильно преобразовывать даты в d-m-y hh:mm:ss
форматировать до правильных дат.
Зависит от импорта столбца как TEXT
, чтобы Excel не делал с ним смешных вещей, а затем от конвертации.
Выбор датыстолбцы - это единственная потенциально сложная часть, но если они выполняются в одном и том же столбце при каждом запуске, вам может потребоваться только проверить их наличие (в файле примера было несколько пустых столбцов даты / времени).
Возможно, вам потребуетсяотредактировать некоторые аргументы для Connection
, особенно если они могут быть переменными.Спросите, есть ли у вас проблемы.
Sub importSensor()
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;D:\Users\Ron\Desktop\BlueVis_Export_beginning_from_16-9-2019_13_29_28.csv" _
, Destination:=Range("$A$1"))
.Name = "BlueVis_Export_beginning_from_16-9-2019_13_29_28"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
)
.TextFileDecimalSeparator = ","
.TextFileThousandsSeparator = " "
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Dim WS As Worksheet, WB As Workbook
Dim arrDtCols()
Set WB = ThisWorkbook
Set WS = WB.ActiveSheet
Dim R As Range, V As Variant
Dim vDtParts, vTimePart
Dim I As Long, J As Long
'Many ways of defining the date cols
' and you may need to add some checks that there are dates in the columns
arrDtCols = Array(28, 31, 34, 40, 49)
For I = LBound(arrDtCols) To UBound(arrDtCols)
With WS
Set R = Range(.Cells(10, arrDtCols(I)), .Cells(.Rows.Count, arrDtCols(I)).End(xlUp))
V = R
For J = 1 To UBound(V, 1)
vDtParts = Split(Split(V(J, 1), " ")(0), "-")
vTimePart = Split(V(J, 1), " ")(1)
V(J, 1) = DateSerial(vDtParts(2), vDtParts(1), vDtParts(0)) + CDate(vTimePart)
Next J
R = V
'could set format for the column here, as desired.
End With
Next I
End Sub