vba
  • excel-vba
  • ado
  • 2016-06-07 2 views 0 likes 
    0

    Я запрашиваю текстовый файл с использованием ADO для переноса данных в Excel.Запрос текстового файла ADO - результаты разделены запятой

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
         "Data Source=" & filePath & ";" & _ 
         "Extended Properties='text';" 
    
    rs.Open "SELECT * FROM " & fileName, cn 
    
    wsImport.Range("A1").CopyFromRecordset rs 
    

    Проблема, с которой я сталкиваюсь, заключается в том, что результаты запроса разделяются запятой как разделителем. Это означает, что когда я пишу данные на рабочий лист, он выводится через несколько столбцов.

    Я подтвердил, что он разбивается на этапе запроса, а не на запись данных на рабочий лист. Мне нужно использовать rs.Fields(0) и rs.Fields(1) для доступа к некоторым строкам данных, когда я хочу, чтобы все данные были доступны в первом поле созданного набора записей (позволяя записывать данные в столбец A рабочего листа).

    Может ли кто-нибудь уточнить, как я могу запросить текстовый файл, не разделяя данные каким-либо разделителем?

    Я также пробовал использовать ниже в расширенных свойствах.

    Extended Properties='text;HDR=Yes;FMT=Delimited'; 
    

    и

    Extended Properties='text;HDR=Yes;FMT=FixedLength'; 
    
    +0

    Вы должны были бы создать Schema.ini файл, но я не могу понять, почему вы хотите использовать ADO вообще здесь, а не только чтение текстового файла в переменную, колки в массив на каждом новый символ линии, а затем просто отбросьте массив в лист. – Rory

    +0

    Спасибо за ваш вход @Rory. С удовольствием рассмотрим ваше предложение, если бы вы могли привести пример того, как это будет работать? Я всегда работал с текстовыми файлами таким образом, исходя из предположения, что это был самый быстрый способ получения данных из текстового файла и в Excel. –

    ответ

    2

    Вот простой пример чтения текстового файла:

    Sub foo(filePath As String) 
        Dim sDataIn      As String 
        Dim sDataTemp()     As String 
        Dim sDataOut()     As String 
        Dim n       As Long 
    
        Open filePath For Binary As #1 
        sDataIn = Space$(LOF(1)) 
        Get #1, , sDataIn 
        Close #1 
        sDataTemp() = Split(sDataIn, vbNewLine) 
        ReDim sDataOut(1 To UBound(sDataTemp) + 1, 1 To 1) 
        For n = LBound(sDataTemp) To UBound(sDataTemp) 
         sDataOut(n + 1, 1) = sDataTemp(n) 
        Next n 
        ActiveSheet.Range("A1").Resize(UBound(sDataOut), 1) = sDataOut 
    End Sub 
    
    +0

    Это потрясающе - это похоже на гораздо более чистый способ работы с текстовыми файлами. Благодаря! Почему вы устанавливаете переменную 'sDataIn' в пробелы (такую ​​же длину текстового файла), вместо того, чтобы сразу же передавать данные текстового файла в переменную? –

    +0

    В двоичном режиме количество прочитанных байтов равно количеству символов, уже находящихся в переменной. – Rory

    +0

    Делает смысл - спасибо за объяснение, очень ценю. Хорошего дня. –

    0

    При включении записи макросов и пусть запись вы делаете все шаги, один раз чтобы импортировать файл, у вас должен быть ваш ответ.

    Я просто попробовал и получил это.

    Sub Macro1() 
    ' 
    ' Macro1 Macro 
    ' 
    ' Keyboard Shortcut: Ctrl+s 
    ' 
        With ActiveSheet.QueryTables.Add(Connection:= _ 
         "TEXT;C:\Users\your_path_here\test.txt", Destination:=Range("$A$1")) 
         .CommandType = 0 
         .Name = "test" 
         .FieldNames = True 
         .RowNumbers = False 
         .FillAdjacentFormulas = False 
         .PreserveFormatting = True 
         .RefreshOnFileOpen = False 
         .RefreshStyle = xlInsertDeleteCells 
         .SavePassword = False 
         .SaveData = True 
         .AdjustColumnWidth = True 
         .RefreshPeriod = 0 
         .TextFilePromptOnRefresh = False 
         .TextFilePlatform = 437 
         .TextFileStartRow = 1 
         .TextFileParseType = xlDelimited 
         .TextFileTextQualifier = xlTextQualifierDoubleQuote 
         .TextFileConsecutiveDelimiter = False 
         .TextFileTabDelimiter = False 
         .TextFileSemicolonDelimiter = False 
         .TextFileCommaDelimiter = False 
         .TextFileSpaceDelimiter = False 
         .TextFileColumnDataTypes = Array(1) 
         .TextFileTrailingMinusNumbers = True 
         .Refresh BackgroundQuery:=False 
        End With 
    End Sub 
    

     Смежные вопросы

    • Нет связанных вопросов^_^