Excel Format дубликаты значений - изменить текст в ячейке

Ячейки с дублированными значениями очень легко отформатировать (например, задать для них определенный фон или другой стиль), используя "Условное форматирование", но как я могу изменить их текст?

Например:

A1 2332

A2 2333

A3 2334

A4 2334

становиться:

A1 2332

A2 2333

A3 2334 (1)

A4 2334 (2)

1 ответ

Решение

Один из способов сделать это - просто добавить второй столбец рядом с исходными данными, заполнив следующую формулу:

=IF(COUNTIF($A$1:$A$5000,A1)>1,A1& " (" & COUNTIF(A$1:A1,A1) & ")",A1)

где ваши исходные данные в A1:A5000. Остерегайтесь этого COUNTIF Это довольно неэффективно, поэтому если у вас много данных, это может занять некоторое время, чтобы рассчитать и повлиять на производительность вашей книги.

Для большой книги я бы хотел использовать событие VBA Worksheet_Change для редактирования значений на месте. Этот код должен быть вставлен в соответствующий модуль рабочего листа. На 5000 тестовых записей у него было отставание в пару секунд.

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)

Dim dataRng As Range
Dim dataArr() As Variant, output() As String
Dim y As Long, i As Long, j As Long, tmpcount As Long

'Change "A1" to address of start of column you want to index.
Set dataRng = Range("A1").Resize(Me.UsedRange.Rows.Count, 1)
If Not Intersect(Target, dataRng) Is Nothing Then
    dataArr = dataRng.Value
    ReDim output(1 To UBound(dataArr, 1), 1 To 1)
    'Strip old counts from data once in array.
    For y = 1 To UBound(dataArr, 1)
        If Right(dataArr(y, 1), 1) = ")" Then
            dataArr(y, 1) = Left(dataArr(y, 1), InStr(dataArr(y, 1), " (") - 1)
        End If
    Next y

    For i = 1 To UBound(dataArr, 1)
        tmpcount = 0
        output(i, 1) = dataArr(i, 1)
        For j = 1 To UBound(dataArr, 1)
            If dataArr(i, 1) = dataArr(j, 1) Then
                tmpcount = tmpcount + 1
                If j = i And tmpcount > 1 Then
                    output(i, 1) = dataArr(i, 1) & " (" & tmpcount & ")"
                    Exit For
                End If
                If j > i And tmpcount > 1 Then
                    output(i, 1) = dataArr(i, 1) & " (" & tmpcount - 1 & ")"
                    Exit For
                End If
            End If
        Next j
    Next i
    Call printoutput(output, dataRng)
End If

End Sub


Private Sub printoutput(what As Variant, where As Range)
Application.EnableEvents = False
where.Value = what
Application.EnableEvents = True
End Sub

Осторожно, я сделал пару больших предположений:

  1. Я предположил, что столбец, который вы хотите проиндексировать, начинается с A1. Если он находится в другом столбце, вам нужно настроить строку 7 кода.
  2. Я предположил, что ваши данные никогда не будут заканчиваться на ")", если они не были ранее проиндексированы. Если это не так, держитесь подальше от этого кода!
Другие вопросы по тегам