Даты 'Text to Columns' функция в VBA - PullRequest
0 голосов
/ 19 сентября 2019

Я автоматизирую импорт некоторых данных с нескольких датчиков, но один из них вызывает некоторые проблемы с датами.

Он поставляет метки времени как dd-mm-yyyy hh:mm:ss, когда мой локальный стандарт равен dd/mm/yyyy hh:mm, и этокажется, вызывает некоторые проблемы.

Сначала я попытался решить эту проблему, заменив все "-" на "/".Это работает, когда выполняется вручную, но я не могу заставить его работать в VBA.

Итак, я попытался сделать это с помощью функции Text to Columns, но снова я не могу заставить VBA вернутьтот же результат, что и делать это вручную.Запись макроса привела к приведенному ниже коду, но, похоже, он не указывает, что столбец состоит из дат.

Соответствующий код:

        Range("AE10").Select
        Range(Selection, Selection.End(xlDown)).Select

        Selection.TextToColumns Destination:=Range("AE10"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True

Полный макрос:

Sub ImportBV()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'locate data file
Dim directory As String, fileName As String, path As String, decsep As String, thosep As String


path = ActiveWorkbook.path
directory = path & "\data\"
fileName = Dir(directory & "*.csv")
decsep = Sheets("Backend").Cells(7, 3).Value
thosep = Sheets("Backend").Cells(7, 4).Value

If fileName = "" Then
    MsgBox ("No .csv file found in " & directory)
    Exit Sub
End If

'import sheet
Name (directory & fileName) As (directory & "BlueVis_Export.txt") 'the csv format causes issues for English/international regional settings users
fileName = Dir(directory & "BlueVis_Export.txt")
Workbooks.OpenText (directory & fileName), DataType:=xlDelimited, Semicolon:=True, DecimalSeparator:=decsep, ThousandsSeparator:=thosep

Application.Calculation = xlCalculationAutomatic
    Workbooks(fileName).Sheets(1).Range("AB10").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.TextToColumns Destination:=Range("AB10"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True

    Workbooks(fileName).Sheets(1).Range("AE10").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.TextToColumns Destination:=Range("AE10"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True

    Workbooks(fileName).Save
Application.Calculation = xlCalculationManual

Workbooks.Open (path & "\Timestep.xlsm")

Workbooks(fileName).Worksheets(1).Copy _
    After:=Workbooks("Timestep.xlsm").Worksheets("README")


Workbooks(fileName).Close

Name (directory & fileName) As (directory & "BlueVis_Export.csv") 'Return to csv format for possible reuse


'Increase dt

Workbooks("Timestep.xlsm").Activate

Workbooks("Timestep.xlsm").Sheets(4).Range(Cells(10, 28), Cells(10, 29)).Select
Range(Selection, Selection.End(xlDown)).Copy Workbooks("Timestep.xlsm").Sheets(1).Range("A1")

Workbooks("Timestep.xlsm").Sheets(4).Cells(10, 32).Select
Range(Selection, Selection.End(xlDown)).Copy Workbooks("Timestep.xlsm").Sheets(1).Range("C1")
Workbooks("Timestep.xlsm").Sheets(4).Delete

Application.Run "'Timestep.xlsm'!change_dt"



Workbooks("Timestep.xlsm").Save

'move data to import paste
    ' Row = beginrij van Timestep converter row2 = beginrij van import sheet
row = 7
row2 = 5

Workbooks("Timestep.xlsm").Worksheets(1).Copy _
After:=Workbooks("data importer.xlsm").Worksheets("backend")

Workbooks("Timestep.xlsm").Activate
Application.Run "'Timestep.xlsm'!ClearData"
Workbooks("Timestep.xlsm").Save
Workbooks("Timestep.xlsm").Close

Sheets(20).Select

Do While Sheets(20).Cells(row, 2) <> ""
    Sheets("I BV").Cells(row2, 6).Value = Sheets(20).Cells(row, 2).Value
    Sheets("I BV").Cells(row2, 7).Value = Sheets(20).Cells(row, 3).Value
    Sheets("I BV").Cells(row2, 8).Value = Sheets(20).Cells(row, 4).Value
    row = row + 1
    row2 = row2 + 1
Loop
If Sheets("import interface").Cells(18, 7).Value <> "Rotated" Then
    Dim r As Integer
    r = Sheets("Import interface").Cells(18, 7).Value
    row2 = 5
    Do While Sheets("I BV").Cells(row2, 6).Value <> ""
        Sheets("I BV").Cells(row2, 9).Value = r
        row2 = row2 + 1
    Loop
    'Sheets("I BV").Range(Cells(4, 9), Cells(row2, 9)).Value = Sheets("import interface").Cells(18, 7).Value
End If


'return to normal
Sheets(20).Delete
Sheets("import interface").Select
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayAlerts = True

If Sheets("import interface").Cells(18, 7).Value <> "Rotated" Then
    MsgBox ("Import succesful.")
Else
    MsgBox ("Import succesful. Remember to fill in the 'reactor' column in the 'I BV' sheet manually.")
End If

End Sub

1 Ответ

0 голосов
/ 20 сентября 2019

Я посмотрел на ваши данные и код, и это кажется довольно сложным, отчасти из-за того, что у вас несколько заголовков столбцов.

Перед импортом в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...