Добавление +1 к нескольким значениям в одной ячейке с помощью формулы Excel - PullRequest
0 голосов
/ 27 мая 2019

Я получил файл Excel с листом источника данных.Чтобы иметь возможность анализировать данные на следующем шаге, мне нужно добавить 1 к каждому значению и поместить его на новый лист.Дело в том, что в каждой ячейке есть несколько значений, каждое из которых разделено запятой, и это число не является статическим.Добавление +1 на более позднем этапе, к сожалению, не вариант, поэтому мне нужно сделать это в Excel.

  Source sheet              Prepared data sheet

| MyValues   |             | MyValues + 1 |
|------------|             |--------------|
| 0,1,2,3    |             |  1,2,3,4     |
| 3          |   ----->    |  4           |
| 2,4,6      |             |  3,5,7       |
| 1          |             |  2           |

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Вот решение на основе вспомогательных столбцов.Я предположил, что данные начинаются с ячейки A2 и формулы объединения в ячейке B2.Я рассмотрел случай 15 максимальных значений.

В ячейку C2 должна быть вставлена ​​следующая формула:

=IFERROR((TRIM(MID(SUBSTITUTE(","&$A2,",",REPT(" ",99)),COLUMNS($A$1:A1)*99,99))/1)+1,"")

Это должно быть скопировано (до столбца Q)и вниз (до последней строки ваших данных).

Затем примените формулу конкатенации, как показано ниже в ячейке B2:

=SUBSTITUTE(TRIM(CONCATENATE(C2," ",D2," ",E2," ",F2," ",G2," ",H2," ",I2," ",J2," ",K2," ",L2," ",M2," ",N2," ",O2," ",P2," ",Q2))," ",",")

будет работать для версии Excel2007 или выше.

0 голосов
/ 27 мая 2019

Вот один из способов сделать это (в Excel 2016 с TEXTJOIN()):

enter image description here

Формула в B1:

=IFERROR(TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",LEN($A1))),(COLUMN()-2)*LEN($A1)+1,LEN($A1)))+1,"")
  • Перетащите вниз и в сторону (может быть 15 столбцов, если необходимо)

Формула в G1:

=TEXTJOIN(",",TRUE,B1:E1)
  • Перетащите вниз

Вам не нужно решение VBA, но в вашем случае UDF также может быть хорошим способом сделать это, например, так:

Function AddVal(RNG As Range, VAL As Double) As String

Dim ARR1() As String, ARR2() As String, X As Double
If RNG.Cells.Count = 1 Then
    ARR = Split(RNG.Value, ",")
    For X = LBound(ARR) To UBound(ARR)
        ReDim Preserve ARR2(X)
        ARR2(X) = ARR(X) + VAL
    Next X
    If IsEmpty(ARR2) Then
        AddVal = "No hits"
    Else
        AddVal = Join(ARR2, ",")
    End If
Else
    AddVal = "No valid range"
End If

End Function

Вызов через =AddVal(A1;1)

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

0 голосов
/ 27 мая 2019

Я пытаюсь создать код VBA (я знаю, что VBA не помечен) для выполнения этой задачи.

Option Explicit

Sub test()

    Dim LastRow As Long, i As Long, Count As Long, j As Long
    Dim str As Variant, strNew As String

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = 1 To LastRow

            Count = Len(.Range("A" & i).Value) - Len(Replace(.Range("A" & i).Value, ",", ""))
            str = Split(.Range("A" & i).Value, ",")

            If Count > 0 Then

                For j = 0 To Count

                    str(j) = str(j) + 1

                    If .Range("B" & i).Value = "" Then
                        .Range("B" & i).Value = str(j)
                    Else
                        .Range("B" & i).Value = .Range("B" & i).Value & "," & str(j)
                    End If

                Next j

            Else

                .Range("B" & i).Value = .Range("A" & i).Value + 1

            End If

        Next i

    End With

End Sub

Результаты:

enter image description here

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