Разделение строк, разделенных vbNewLine - PullRequest
0 голосов
/ 02 апреля 2012

Я использую приведенный ниже код для разделения группы строк, разделенных запятой (,), затем сохраняю вывод в строковую переменную с именем msg. Строки в переменной msg отделяются vbNewLine.

Например: Оригинальная строка, например, фрукты, содержит: яблоко, манго, апельсин после применения функции splittext (фрукты) переменная теперь msg содержит: яблоко <<code>vbNewLine> манго <<code>vbNewLine> апельсин

Теперь я хотел отделить содержимое этого сообщения от ячейки (каждой строки). Например, манго в A1, яблоко в A2, оранжевый в A3 (на другом листе.

Я пытался 'ActiveWorkbooks.Sheets("Sheet2").Range("A" & i).Value = Cs(i), (см. Код ниже). Но это не работает. После выполнения ячейки на листе 2 остаются без изменений. Мне действительно нужна твоя помощь. Спасибо.

Function splittext(input_string As String) As String
      Dim SptTxt As String
    Dim Cs As Variant
    Dim CsL As Byte
    Dim CsU As Byte
    Dim i As Byte
    Dim col As Collection
    Set col = New Collection
    Cs = Split(input_string, ",")
    CsL = LBound(Cs)
    CsU = UBound(Cs)
    Dim msg As String

    For i = CsL To CsU
        ReDim arr(1 To CsU)
        col.Add Cs(i)
        msg = msg & Cs(i) & vbNewLine
        'ActiveWorkbooks.Sheets("Sheet2").Range("A" & i).Value = Cs(i)
    Next
    splittext = msg
End Function

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Вот ваш макрос с рефакторингом, дающий описанные вами результаты без зацикливания.

Function splittext(input_string As String) As String
    Dim Cs As Variant

    Cs = Split(input_string, ",")
    splittext = Join(Cs, vbNewLine)

    ' Put results into workbook
    With ActiveWorkbook.Sheets("Sheet2")
        Range(.[A1], .Cells(UBound(Cs) + 1, 1)).Value = Application.Transpose(Cs)
    End With
End Function

Обратите внимание, что для копирования массива в диапазон требуется двумерный массив, строки x столбцов.Transpose - удобная функция для преобразования массива 1 dim в массив 2 dim

EDIT

Обратите внимание, что если вы вызываете это как пользовательскую функцию (UDF)из ячейки (как в примере файла) произойдет сбой (если он вызывается из Sub VBA, он будет работать).Это связано с тем, что UDF не может ничего изменить в Excel, он может только вернуться к вызывающей ячейке (существует довольно сложный обходной путь, см. этот ответ .) Если вы удалите раздел With, он будет работать какUDF.

Если вы пытаетесь вернуть список в несколько ячеек, рассмотрите возможность использования функции массива.

0 голосов
/ 02 апреля 2012

Вы должны использовать его следующим образом:

ActiveWorkbook.Sheets("Sheet2").Range("A" & i+1).Value = Cs(i)

Вы пытаетесь записать в ячейку «A0», потому что «i» находится в нулевом цикле первого цикла.И это не работает, потому что нет ячейки "A0".И у вас были "s" от ActiveWorkbook.

Moosli

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