2016-12-23 8 views
1

テキストファイルをスペースで区切ってExcelにインポートする例のVBコードがあるかどうかは、スペースの数に関係なく不思議でした。テキストファイルには、例えば100k行があり、各行には、1つ、2つ、または3つのetc空間で区切ることができます。vb.netがスペースで区切ってExcelにテキストファイルをインポートする

excelへのインポート結果は、テキストファイルの各行が各行にあり、スペースで区切られた各行の各単語がその行の各列にあることです。

私は、テキストファイルの各行を読み込んで、各行を解析し、変数に入れてからExcelに書き込むことでこれを達成しようとしました。私はこの方法が長くかかると思うし、私は各ラインの解析の途中です。しかし、私はスペースで区切られたExcelファイルにテキストファイルをインポートするのが速ければ速いと思います。私がvbaの代わりにvbを使用するのは、vbがスケジューラによって実行可能な実行可能ファイルを作成できるからです。おかげで、この例StreamReaderExcel

Dim reader As New System.IO.StreamReader("C:\test.txt") 
Dim allLines As List(Of String) = New List(Of String) 
Dim stringreader As String 
Dim a As String 
    stringreader = filereader.ReadLine() 

    Do While Not reader.EndOfStream 
     allLines.Add(reader.ReadLine()) 
     stringreader = reader.ReadLine() 
     MsgBox("The first line of the file is    " & stringreader) 
    Loop 

答えて

1

が最初に開かれています。その後、新しいWorkbookと新しいWorksheetが追加されます。最後に、テキストファイルは1行ずつ読み込まれます。各行はスペースで分割され、Excel Worksheetに書き込まれます。テキストファイルが処理された後、Streamが閉じられ、結果のあるExcelが開いたままになります。 HTH

ご使用のExcelのバージョンにOffice Primary Interopアセンブリをインストールします。

(例Ecel 2007 PIAへの参照を使用しています:C:\ WINDOWS \アセンブリ\ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll)

Imports System.IO 
Imports ExcelInterop = Microsoft.Office.Interop.Excel 

Module Module2 
    Sub Main() 
     Dim reader As StreamReader = New StreamReader("C:\test.txt") 
     Dim targetWorksheet As ExcelInterop.Worksheet = GetTargetWorksheet("c:\test.xls") 
     if targetWorksheet Is Nothing Then 
      Exit Sub 
     End If 
     Try 
      Dim line As String 
      Dim lineIndex As Long = 1 
      Do While reader.Peek() >= 0 
       line = reader.ReadLine() 
       WriteToExcel(line, targetWorksheet, lineIndex) 
       lineIndex += 1 
      Loop 
     Catch ex As Exception 
      Debug.WriteLine("The file could not be read:") 
      Debug.WriteLine(ex.Message) 
     finally 
      If Not reader Is Nothing Then 
       reader.Close() 
      End If 
     End Try 
    End Sub 

    Private Sub WriteToExcel(line As String, targetWorksheet As ExcelInterop.Worksheet, lineIndex As Long) 
     Dim column As Integer = 1 
     For Each part As String In line.Split(" ") 
      targetWorksheet.Cells(lineIndex, column).Value =part 
      column += 1 
     Next 
    End Sub 

    Private Function GetTargetWorksheet(targetPath As String) As ExcelInterop.Worksheet 
     Try 
      Dim excelApplication = New ExcelInterop.Application 
      excelApplication.Visible = True 
      Dim excelWorkbook As ExcelInterop.Workbook 
      excelWorkbook = excelApplication.Workbooks.Add() 
      excelWorkbook.SaveAs(targetPath) 
      Dim excelWorksheet As ExcelInterop.Worksheet = excelWorkbook.Worksheets.Add() 
      excelWorksheet.Name = "Import" 
      return excelWorksheet 
     Catch ex As Exception 
      Debug.WriteLine("The excel worksheet could not be created:") 
      Debug.WriteLine(ex.Message) 
     End Try 
     Return Nothing 
    End Function 
End Module 

EDIT:

テキストデータをインポートするExcelQueryTablesを使用することが可能です。考慮する設定があります(TextFileColumnDataTypesなど)。ここでは、すべての列がxlColumnDataType.xlTextFormatに設定されています。

Sub Main() 
    Dim targetWorksheet As Worksheet = GetTargetWorksheet("c:\test.xls") 
    if targetWorksheet Is Nothing Then 
     Debug.WriteLine("Target sheet is Nothing.") 
     Exit Sub 
    End If 

    Try 
     Dim qt As QueryTable 
     qt = targetWorksheet.QueryTables.Add(_ 
     Connection:="TEXT;C:\test.txt", _ 
     Destination:=targetWorksheet.Range("$A$1")) 

     With qt 
      .Name = "Import" 
      .FieldNames = True 
      .RowNumbers = False 
      .FillAdjacentFormulas = False 
      .PreserveFormatting = True 
      .RefreshOnFileOpen = False 
      .RefreshStyle = XlCellInsertionMode.xlInsertDeleteCells 
      .SavePassword = False 
      .SaveData = True 
      .AdjustColumnWidth = True 
      .RefreshPeriod = 0 
      .TextFilePromptOnRefresh = False 
      .TextFilePlatform = 1252 
      .TextFileStartRow = 1 
      .TextFileParseType = XlTextParsingType.xlDelimited 
      .TextFileTextQualifier = XlTextQualifier.xlTextQualifierDoubleQuote 
      .TextFileConsecutiveDelimiter = True 
      .TextFileTabDelimiter = False 
      .TextFileSemicolonDelimiter = False 
      .TextFileCommaDelimiter = False 
      .TextFileSpaceDelimiter = True 
      .TextFileColumnDataTypes = GetColumnDataTypes(targetWorksheet.Columns.Count) 
      .TextFileTrailingMinusNumbers = True 
      .Refresh(BackgroundQuery := False) 
     End With 

    Catch ex As Exception 
     Debug.WriteLine("The file could not be read:") 
     Debug.WriteLine(ex.Message) 
    End Try 
End Sub 

Private Function GetColumnDataTypes(queryTableColumnsCount As long) As Object 
    Dim textDataTypes As xlColumnDataType() 
    textDataTypes = Enumerable.Repeat(xlColumnDataType.xlTextFormat, queryTableColumnsCount).ToArray() 
    Return textDataTypes   
End Function 
+0

こんにちは、ありがとう、コード例ありがとうございます。非常によく見え、完璧に動作します。テキストファイルの行の文字列の中で、各単語間のスペースは予測不能で、1,2,3、またはそれ以上のスペースを持つことができます。だから私は余分なスペースを削除し、あなたのwritetoexcel関数に追加し、それは魅力的なように動作するコードを見つけるためにインターネット上で検索しました。余分なスペースがある場合、空白はExcelカラムに書き込まれません。 – Johnseito

+0

とにかく、コードが偉大であり、あなたのおかげですべてのおかげで、私はExcelでテキストファイルをインポートし、各行を行ごとに読み込むことができず、Excelごとに行ごとに書き込む能力がVBであるかどうか疑問に思っていました。インポート、私は非常に速いと思います。例えば、大容量ファイルが500k行の場合、vbがこれを行うことができない場合は、それも問題ありません。素晴らしいコードのおかげで再び! :) – Johnseito

+0

あなたは歓迎です、私はそれが助けてうれしいです! :)。テキストデータをExcelにインポートするための他の優れた機能については、編集済みの回答を参照してください。 – dee