2017-02-09 24 views
1

CSVファイルを読み込み、文字列をシートの列に分割しようとしています。2つの配列を引数として渡すVBA

したがって、プログラムはCSVを読み取り、文字列(文字列の位置と長さを取得)を読み取り、その結果を列に出力します。

これを行うマクロを作成しましたが、これまでは使用していなかった配列を使用していますが、配列をSplitColumns関数の引数として渡すことはできません。

したがって、文字列の仕様は "start pos、end pos、format"と似ていますが、現在はフォーマットを使用していません。

お手伝いできますか?私はこれが非常に単純な問題かもしれないと思う、私はちょうど最後の時間のためにこれに固執しています。

Option Explicit 

    Public Sub ConvertPanel() 

     Dim convertFile As Long, i As Long, y As Long 
     Dim specString As String 

     Dim a As Variant 
     Dim b As Variant 
     Dim c As Range 

     Set c = Worksheets(1).Range(Cells(1, 1), Cells(1, 1)) 

     specString = "1,10,@|11,2,@|15,1,@|16,4,@|20,2,@|23,1,@|31,1,@|35,1,@|39,1,@|41,1,@|160,1,@|161,2,@|163,1,@|165,1,@|25,2,@|29,2,@|34,1" 

     a = QuickRead("file.txt") 
     b = ConvertSpecString(specString) 


    End Sub 

    Private Function ConvertSpecString(ByVal specString As String) As String() 

      Dim fieldsInfo() As String 
      Dim inputString As String 

      inputString = Replace(specString, Space(1), vbNullString) 
      fieldsInfo = Split(inputString, "|") 
      ConvertSpecString = fieldsInfo 

    End Function 

    Private Function QuickRead(ByVal fileName As String) As String() 

     Dim fileNumber As Long 
     Dim stringRes As String 
     Dim fileSize As Long 
     Dim v As Variant 

     fileNumber = FreeFile 
     fileSize = FileLen(fileName) 
     stringRes = Space(fileSize) 

     Open fileName For Binary Access Read As #fileNumber 
      Get #fileNumber, , stringRes 
     Close fileNumber 

     QuickRead = Split(stringRes, vbCrLf) 

    End Function 

    Private Function SplitColumns(ByRef lineArray() As Variant, ByRef fieldsInfo() As Variant, ByVal StartCell As Range) As Variant 

     Dim indexLine As Long 
     Dim indexCount As Long 
     Dim stringRange As String 
     Dim stringColumn As Long 
     Dim fileInfo As String 

     stringRange = StartCell 
     stringColumn = startCell.Column 

      For indexCount = LBound(lineArray) To UBound(lineArray) 

       stringColumn = stringRange.Column 
       fileInfo = Split(fieldsInfo(indexCount), ",") 
       stringRange.EntireRow.Cells(1, stringColumn).Value = Mid(lineArray(indexCount), CLng(fileInfo(0)), CLng(fileInfo(1))) 
       stringColumn = stringColumn + 1 

      Next indexCount 


    End Function 
+2

問題は次のとおりです:lineArray()バリアントとして、variantを渡す必要があります:lineArrayバリアント(2D配列)または配列:lineArray()文字列/ long/doubleとして – User632716

+0

ありがとうございました実際に問題を解決しました!私はあなたに値するポイントを教えてくれるので、答えを提出してください! @tompreston – svacxpython

+1

私はこれが完全に答えるとは思えませんでしたが、助けてくれてうれしかった、私は下にそれを書いた、リンクされたサイトもこれに非常に役立ちます。 – User632716

答えて

1

これについてまともなチュートリアルがここにあります:バリアントと本質的にhttp://www.cpearson.com/excel/vbaarrays.htm

あなたが関数にバリアントを渡したい場合は、構文を使用する必要があります渡すために

Private Function SplitColumns(ByRef lineArray As Variant, ByRef fieldsInfo As Variant, ByVal StartCell As Range) As Variant 

を配列を使用することができます:

Private Function SplitColumns(ByRef lineArray() As String, ByRef fieldsInfo() As Double, ByVal StartCell As Range) As Variant 

しかし、あなたは変数を渡すことはできませんこのように:

ByRef lineArray() As Variant 

プロジェクトで幸運。

関連する問題