2017-12-10 12 views
-3

私はそれぞれ異なる行にある数字と単語の両方を含む.txtファイルを持っていますが、Excelの1つの列のすべての数字と他の列のすべての単語を並べ替えるVBAサブを作るにはどうすればいいですか?VBA txtファイルから数字と単語を並べ替える方法は?

The image of the txt file and how the Excel should look in the result

私はこれを把握することはできませんし、私は、任意のフォーラムでこれを見つけることができません。

ありがとうございます。ここで

+0

あなたのためのソリューションを段階的にこの問題をアプローチです。ステージ1:VBAでテキストファイルを1行ずつ読み上げる方法を調べる。段階2:各行を(文字列として)テストして数値であるかどうか調べる( 'ISNUMERIC')。ステージ3:数字と文字列のリストをソートする方法を学びます。このようなステップを踏むと、それを得るでしょう。あなたが戻ってくることができ、あなたが好きなら、それぞれのステージのための個々の質問をすることができます。 – PeterT

+0

^^または、データをソートする必要がないために、2つの異なる変数を行カウンタとして使用する方法と、何かを列に書き込むたびに変数をインクリメントする方法を学びます。 – YowE3K

+0

数値と文字列のカウンタを増分する必要があります。別の質問をして特定の問題のコードを投稿すると、より多くのヘルプが得られます。 – PeterT

答えて

0

Option Explicit 

Private Const msSORT_SHEET As String = "____Sort" 

Sub TestReadFile() 
    Dim vNumbersArray As Variant, vWordsAtray As Variant 

    '* change filename below 
    Call ReadFile("n:\Unjumble Words And numbers.txt", vNumbersArray, vWordsAtray) 


    Dim vSortedNumberArray As Variant 
    vSortedNumberArray = SortVector(vNumbersArray) 

    Dim vSortedWordsArray As Variant 
    vSortedWordsArray = SortVector(vWordsAtray) 



End Sub 


Function SortVector(ByVal vVector As Variant) As Variant 
    Dim wsSort As Excel.Worksheet 
    Set wsSort = AddOrFindSortSheet 

    On Error Resume Next 
    Dim lRowCount As Long 
    lRowCount = UBound(vVector) - LBound(vVector) + 1 
    On Error GoTo 0 

    If lRowCount > 2 Then 

     wsSort.Cells.Clear 

     Dim rng1 As Excel.Range 
     Set rng1 = wsSort.Range(wsSort.Cells(1, 1), wsSort.Cells(1, lRowCount)) 
     rng1.Value2 = vVector 

     Dim v2d As Variant 
     v2d = rng1.Value2 

     Dim vTranspose As Variant 
     vTranspose = Application.Transpose(v2d) 

     wsSort.Cells.Clear 

     Dim rngSort As Excel.Range 
     Set rngSort = wsSort.Range(wsSort.Cells(1, 1), wsSort.Cells(lRowCount, 1)) 
     rngSort.Value2 = vTranspose 

     wsSort.Sort.SortFields.Clear 
     wsSort.Sort.SortFields.Add Key:=rngSort _ 
      , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     With wsSort.Sort 
      .SetRange rngSort 
      .Header = xlGuess 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 
     End With 

     Dim vSorted As Variant 
     vSorted = rngSort.Value2 

     SortVector = vSorted 

    End If 

End Function 

Function AddOrFindSortSheet() As Excel.Worksheet 

    Dim wsSort As Excel.Worksheet 
    Set wsSort = FindSortSheet 

    If wsSort Is Nothing Then 
     Set wsSort = AddSortSheet 
    End If 

    Set AddOrFindSortSheet = wsSort 
End Function 

Function AddSortSheet() As Excel.Worksheet 
    Dim wsAdded As Excel.Worksheet 
    Set wsAdded = ThisWorkbook.Worksheets.Add 
    wsAdded.Name = msSORT_SHEET 
    wsAdded.Visible = xlSheetHidden 
End Function 

Function FindSortSheet() As Excel.Worksheet 
    Dim wsLoop As Excel.Worksheet 
    For Each wsLoop In ThisWorkbook.Worksheets 
     If wsLoop.Name = msSORT_SHEET Then 
      Set FindSortSheet = wsLoop 
     End If 
    Next 

End Function 

Sub ReadFile(ByVal sFilename As String, ByRef pvNumbersArray As Variant, ByRef pvWordsAtray As Variant) 

    Dim fso As Scripting.FileSystemObject 
    Set fso = New Scripting.FileSystemObject 

    Debug.Assert fso.FileExists(sFilename) 

    Dim txt As Scripting.TextStream 
    Set txt = fso.OpenTextFile(sFilename) 

    Dim sLine As String 

    Dim dicNumbers As New Scripting.Dictionary 
    Dim dicText As New Scripting.Dictionary 

    While Not txt.AtEndOfStream 
     sLine = txt.ReadLine 
     If Len(sLine) > 0 Then 
      Debug.Print sLine 
      If IsNumeric(sLine) Then 
       dicNumbers.Add dicNumbers.Count, CDbl(sLine) 
      Else 
       dicText.Add dicText.Count, sLine 
      End If 

     End If 
    Wend 

    pvNumbersArray = dicNumbers.Items 

    pvWordsAtray = dicText.Items 

End Sub 
関連する問題