загрузка Данных в VBA от текстового файла

Я не очень знаком с 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
ReDim Txt$(0)
Do While Not EOF(1)
ReDim Preserve Txt$(UBound(Txt$) + 1)
Input #1, Txt$(UBound(Txt$))
Loop
Close #1

1
задан omegayen 24 May 2010 в 15:05
поделиться

3 ответа

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

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

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

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

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

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

, заменив

MsgBox strLing

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

strTemp = Split(strLine, " ")

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

0
ответ дан 3 September 2019 в 00:23
поделиться

В этом примере вам понадобится файл 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
ответ дан 3 September 2019 в 00:23
поделиться

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

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
1
ответ дан 3 September 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: