2017-02-09 3 views
1

Я пытаюсь прочитать файл CSV и разделить строки на столбцы листа.Передача двух массивов в качестве аргументов VBA

Таким образом, программа считывает CSV, затем считывает строку (получая позицию и длину строки), а затем выводит результаты в столбцы.

Я сделал макрос, который делает это, но теперь я хочу сделать это с помощью массивов, которые я раньше не использовал, но can not, кажется, передает массивы в качестве аргументов функции 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() Как вариант, вам необходимо передать вариант: lineArray As Variant (который будет представлять собой 2D-массив) или массив: lineArray() Как строка/длинный/двойной – User632716

+0

Спасибо, что фактически решил проблему! Вы должны отправить ответ, чтобы я мог высказать вам те моменты, которые вы заслуживаете! @tompreston – svacxpython

+1

Я не был уверен, что это полностью ответит, но рад, что это помогло, я написал его ниже, связанный сайт тоже очень полезен для этого. – User632716

ответ

1

Там приличный учебник об этом здесь: http://www.cpearson.com/excel/vbaarrays.htm

По существу с Variant, если вы хотите передать вариант для функции вы должны использовать синтаксис:

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 

Удачи вам в проекте.

Смежные вопросы