3

Предположим, в ячейке А1 у меня есть несколько разделенных запятыми букв.

content(A1 cell) = A, W, L, F

Я хотел бы получить следующий результат:

content(A2 cell) = A
content(A3 cell) = W
content(A4 cell) = L
content(A5 cell) = F

Однако, если я наберу в ячейке A1 следующее:

content(A1 cell) = S, E, U, F, H, R, T

Я хотел бы быть результатом:

content(A2 cell) = S
content(A3 cell) = E
content(A4 cell) = U
content(A5 cell) = F
content(A6 cell) = H
content(A7 cell) = R
content(A8 cell) = T

Есть ли функция, которая будет делать эту работу? Например, я хотел бы получить формулу функции в ячейке B1, которая проверяет содержимое ячейки A1 и ее результаты будут вышеупомянутыми результатами. Любая помощь приветствуется.

2 ответа2

2

формула

=INDEX(MID(SUBSTITUTE($A$1,", ",""),ROW($A$1:INDIRECT("a"&LEN(SUBSTITUTE($A$1,", ","")))),1),ROWS($A$1:A1))
0

Разделить ячейку на ряды

Функции не работают так, как вы описали возможную функциональность в своем вопросе, но вот «похожее» решение VBA, использующее событие изменения рабочего листа.

Особенности

  • В Worksheet_Change вы можете выбрать ( указать ) адрес диапазона разделенных ячеек, содержащий разделенные данные ( cStrCell ) и разделитель разделителей ( cStrDel ).
  • При изменении данных в диапазоне разделенных ячеек решение скопирует данные с разделителями ниже диапазона разделенных ячеек в диапазон разделенных данных и удалит все данные ниже.
  • Изменение любой ячейки в диапазоне разделения данных невозможно.

Скопируйте следующий код в нужное окно кода листа, например, Лист1(Код).

Код

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Const cStrCell As String = "A1"   ' Split Cell Range Address
    Const cStrDel As String = ","     ' Split Delimiter

    Application.EnableEvents = False

    ' Check if changed cell range is contained in Split Range.
    If Not Intersect(Target, Range(cStrCell).Resize(UBound(Split( _
            Range(cStrCell), cStrDel)) + 2)) Is Nothing Then

        On Error GoTo ProcedureExit

        ' Check if changed cell range address
        ' is equal to Split Cell Range Address.
        If Target.Address = Range(cStrCell).Address Then
            ' Clear contents of data below Split Range.
            Range(Range(cStrCell).Offset(1), Cells(Rows.Count, _
                    Range(cStrCell).Column).End(xlUp)).ClearContents
        End If

        ' Fill Split Range with Split Data
        ' i.e. copy Split Data below Split Cell Range.
        SplitToRows Range(cStrCell), cStrDel

    End If

ProcedureExit:
    Application.EnableEvents = True

End Sub

Sub SplitToRows(SplitCellRange As Range, Optional Delimiter As String = ",")

    Dim vntS As Variant   ' Source Array
    Dim vntT As Variant   ' Target Array
    Dim i As Long         ' Arrays Row Counter

    ' Split first cell in SplitCellRange by Delimiter into Source Array.
    vntS = Split(SplitCellRange.Cells(1, 1), Delimiter)

    ' Resize 2D one-based Target Array.
    ReDim vntT(1 To UBound(vntS) + 1, 1 To 1)

    ' Trim and copy from Source to Target Array.
    For i = 0 To UBound(vntS)
        vntT(i + 1, 1) = Trim(vntS(i))
    Next

    ' Copy Target Array to Target Range below SplitCellRange.
    SplitCellRange.Cells(1, 1).Offset(1).Resize(UBound(vntT)) = vntT

End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .