Как заполнить данные из файла .txt в Excel в VBA? - PullRequest
0 голосов
/ 05 апреля 2010

Я пытаюсь создать что-то для чтения данных из файла .txt, затем заполнить данные в .xls, но после открытия файла .txt как мне получить данные? В основном я пытаюсь получить третий столбец строк от «04/06/2010». После открытия файла .txt, когда я использую ActiveSheet.Cells(row, col), ActiveSheet не указывает на файл .txt.

Мой файл .txt выглядит следующим образом (разделенный пробелами):

04/05/10 23 29226
04/05/10 24 26942
04/06/10 1 23166
04/06/10 2 22072
04/06/10 3 21583
04/06/10 4 21390

Вот код, который у меня есть:

Dim BidDate As Date

BidDate = '4/6/2010'

Workbooks.OpenText Filename:=ForecastFile, StartRow:=1, DataType:=xlDelimited, Space:=True

If Err.Number = 1004 Then
    MsgBox ("The forecast file " & ForecastFile & " was not found.")
    Exit Sub
End If

On Error GoTo 0


Dim row As Integer, col As Integer


row = 1
col = 1

cell_value = activeSheet.Cells(row, col)
MsgBox ("the cell_value=" & cell_value)

Do While (cell_value  <> BidDate) And (cell_value <> "")
    row = row + 1
    cell_value = activeSheet.Cells(row, col)
   ' MsgBox ("the value is " & cell_value)
Loop

If cell_value = "" Then
    MsgBox ("A load forecast for " & BidDate & " was not found in your current load forecast file titled '" + ForecastFile + ". " + "Make sure you have a load forecast for the current bid date and then open this spreadsheet again.")
    ActiveWindow.Close
    Exit Sub
End If

Кто-нибудь может указать, где это идет не так?

Ответы [ 3 ]

0 голосов
/ 06 апреля 2010

Как правило, следует избегать использования объекта ActiveWorkbook, если вы не уверены, что рабочая книга, на которую вы хотите сослаться, будет всегда активной, когда ваш код выполняется. Вместо этого вы должны установить рабочую книгу, с которой вы работаете, в переменную. Теоретически, вы должны иметь возможность использовать метод OpenText для этого, но VBA это не нравится. (Я почти уверен, что это ошибка.) Так что сразу после того, как вы откроете текстовый файл, я сделаю следующее:

Workbooks.OpenText Filename:=Forecastfile, StartRow:=1, 
    DataType:=xlDelimited, Space:=True

Dim ForecastWorkbook As Workbook, book As Workbook
Dim ForecastFileName As String

ForecastFileName = "YourFileNameHere.txt"

For Each book In Application.Workbooks

    If book.Name = ForecastFileName Then

        Set ForecastWorkbook = book
        Exit For

    End If

Next book

Тогда вместо этого ...

cell_value = activeSheet.Cells(row, col)

... сделать это ...

cell_value = ForecastWorkbook.Sheets(1).Cells(row, col).Value
0 голосов
/ 11 апреля 2017

Ниже кода будет прочитан текстовый файл и вставлены значения в ячейку Sheet2. Однако, если вы поместите форматирование в столбец Дата, это сделает трюк

Public Sub Read_text()
Sheet2.Activate
Set fso = New FileSystemObject
Fname = Application.GetOpenFilename
x = 1
y = 1
Set Stream = fso.OpenTextFile(Fname, ForReading, True)
Do While Not Stream.AtEndOfStream
          Str_text = Stream.ReadLine 'Perform your actions
          rdtext = Split(Str_text, " ")
          Sheet2.Cells(x, y) = rdtext(0)
          Sheet2.Cells(x, y + 1) = rdtext(1)
          Sheet2.Cells(x, y + 2) = rdtext(2)
          x = x + 1
          y = 1
Loop
Stream.Close
End Sub

Например: приведенный ниже код изменит формат в '05 / 04/2010 '

Sheet2.Cells(x, y) = Format(rdtext(0), "mm/dd/yyyy;@")
0 голосов
/ 06 апреля 2010

В приведенном ниже примере я установил переменную ws равной нужному листу, и я могу использовать эту переменную, чтобы обратиться к листу позже. Ключевое слово ActiveWorkbook должно указывать на вновь открытый текстовый файл. Я мог бы сказать, что ты хотел сделать с информацией, такой, что я только что придумал.

Sub GetBidData()

    Dim dtBid As Date
    Dim ws As Worksheet
    Dim rFound As Range
    Dim sFile As String

    dtBid = #4/6/2010#
    sFile = Environ("USERPROFILE") & "\My Documents\ForecastFile.txt"

    Workbooks.OpenText Filename:=sFile, _
        StartRow:=1, _
        DataType:=xlDelimited, _
        Space:=True
    Set ws = ActiveWorkbook.Sheets(1)

    Set rFound = ws.Columns(1).Find( _
        Format(dtBid, ws.Range("A1").NumberFormat), , xlValues, xlWhole)

    If Not rFound Is Nothing Then
        MsgBox rFound.Value & vbCrLf & _
            rFound.Offset(0, 1).Value & vbCrLf & _
            rFound.Offset(0, 2).Value
    End If

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