загрузка данных в VBA из текстового файла - PullRequest
1 голос
/ 21 мая 2010

Я не очень знаком с VBA, но мне нужно использовать его для новой программы, которую я использую (не относится к Microsoft)

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

В частности, текстовый файл имеет 4 записи в строке. Таким образом, я хотел бы загрузить в столбце векторы (N на 1).

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

Так, например, я хочу загрузить первый столбец и сохранить его как массив A, затем второй столбец и сохранить как массив B, затем третий столбец и сохранить как массив C, а затем четвертый столбец и сохранить как массив D.

Этот фрагмент кода, найденный ниже из http://www.tek -tips.com / faqs.cfm? Fid = 482 - это то, что я нашел, что может загружать текст в массив, но мне нужно адаптировать его иметь возможность сохранять столбцы как разные массивы, как указано выше ...

Open "MyFile.txt" For Input As #1<br> ReDim Txt$(0)<br> Do While Not EOF(1)<br> ReDim Preserve Txt$(UBound(Txt$) + 1)<br> Input #1, Txt$(UBound(Txt$))<br> Loop<br> Close #1

Ответы [ 3 ]

1 голос
/ 22 мая 2010

Для этого примера вам понадобится файл schema.ini в том же каталоге, что и текстовый файл. Он должен содержать:

[Import.txt]
Format=Delimited( )

Где Import.txt - имя файла (http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx).

Затем вы можете использовать это, которое должно работать в VBScript или VBA с очень небольшим вмешательством:

Set cn = CreateObject("ADODB.Connection")

'Note HDR=Yes, that is, first row contains field names '
'and FMT delimted, ie CSV '

strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Docs\;" _
& "Extended Properties=""text;HDR=Yes;FMT=Delimited"";"

cn.Open strcon

strSQL="SELECT * FROM Import.txt" _

set rs = createobject("adodb.recordset")

rs.open strSQL,cn

MsgBox rs(2)
MsgBox rs.GetString

Первое окно сообщения должно возвращать третий столбец первой строки, это тест, который работает.

Второе окно сообщения должно возвращать весь файл, поэтому не используйте его с большим набором. С набором записей можно манипулировать, или вы можете использовать .GetRows для создания массива значений (http://www.w3schools.com/ado/met_rs_getrows.asp)

1 голос
/ 25 мая 2010

Кажется, что остающаяся проблема заключается в преобразовании из массива строк в четыре массива столбцов.Может быть, этот фрагмент поможет

Option Explicit
Option Base 0

Sub import()
    Dim sTxt() As String
    Dim sLine As Variant
    Dim iCountLines As Long
    Dim iRowIterator As Long
    Dim i As Long
    Dim sRow() As String
    Dim sColumnA() As String
    Dim sColumnB() As String
    Dim sColumnC() As String
    Dim sColumnD() As String

    ' read in file '
    Open "MyFile.txt" For Input As #1
    ReDim sTxt(0)

    Do While Not EOF(1)
        Input #1, sTxt(UBound(sTxt))
        ReDim Preserve sTxt(UBound(sTxt) + 1)
    Loop
    Close #1

    ' dim array for each columns '
    iCountLines = UBound(sTxt)
    Debug.Print "working with ", iCountLines, "lines"
    ReDim sColumnA(iCountLines)
    ReDim sColumnB(iCountLines)
    ReDim sColumnC(iCountLines)
    ReDim sColumnD(iCountLines)

    ' "transpose" sTxt '
    iRowIterator = 0
    For Each sLine In sTxt
        sRow = Split(sLine, " ")
        If UBound(sRow) = 3 Then
            sColumnA(iRowIterator) = sRow(0)
            sColumnB(iRowIterator) = sRow(1)
            sColumnC(iRowIterator) = sRow(2)
            sColumnD(iRowIterator) = sRow(3)
            iRowIterator = iRowIterator + 1
        End If
    Next sLine

    ' now work with sColumnX '
    Debug.Print "Column A"
    For i = 0 To iCountLines
        Debug.Print sColumnA(i)
    Next i

End Sub
0 голосов
/ 21 мая 2010

В вашем вопросе мало деталей, но я бы предложил использовать "Текст в столбец"

Если вы не очень знакомы с программированием на VBA, попробуйте записать макрос с помощью следующих шагов:

  1. Импорт файла в Excel
  2. выберите столбец A
  3. выберите меню инструментов "Текст в столбцы"
  4. выберите разделенный пробелом

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

РЕДАКТИРОВАТЬ (без использования Excel):

Взгляните на этот FSO метод.

заменой

MsgBox strLing

с некоторой функцией разделения, например

strTemp = Split(strLine, " ")

Вы сможете просмотреть все значения в исходном файле, это сработает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...