Описание
Выделяет дубликаты в выбранной области разными цветами для быстрого распознавания повторяющихся значений.
```javascript
(function ()
{
// Цвет фона ячеек с неповторяющимися значениями
var whiteFill = Api.CreateColorFromRGB(255, 255, 255);
// Текущий индекс диапазона цветов
var uniqueColorIndex = 0;
// Диапазон цветов для выделения повторяющихся значений
var uniqueColors = [Api.CreateColorFromRGB(255, 255, 0),
Api.CreateColorFromRGB(204, 204, 255),
Api.CreateColorFromRGB(0, 255, 0),
Api.CreateColorFromRGB(0, 128, 128),
Api.CreateColorFromRGB(192, 192, 192),
Api.CreateColorFromRGB(255, 204, 0)];
// Функция для получения цвета для дубликатов
function getColor() {
// Если все уникальные цвета выбраны, начинаем сначала
if (uniqueColorIndex === uniqueColors.length) {
uniqueColorIndex = 0;
}
return uniqueColors[uniqueColorIndex++];
}
// Получаем активный лист
var activeSheet = Api.GetActiveSheet();
// Получаем выделение на активном листе
var selection = activeSheet.GetSelection();
// Карта значений в ячейках с количеством дубликатов
var mapValues = {};
// Диапазон всех ячеек
var arrRanges = [];
// Проходим по выделению
selection.ForEach(function (range) {
// Получаем значение из ячейки
var value = range.GetValue();
if (!mapValues.hasOwnProperty(value)) {
mapValues[value] = 0;
}
mapValues[value] += 1;
arrRanges.push(range);
});
var value;
var mapColors = {};
// Проходим по всем ячейкам выделения и устанавливаем выделение, если это значение повторяется более 1 раза
for (var i = 0; i < arrRanges.length; ++i) {
value = arrRanges[i].GetValue();
if (mapValues[value] > 1) {
if (!mapColors.hasOwnProperty(value)) {
mapColors[value] = getColor();
}
arrRanges[i].SetFillColor(mapColors[value]);
} else {
arrRanges[i].SetFillColor(whiteFill);
}
}
})();
```
Используемые методы: CreateColorFromRGB, GetActiveSheet, GetSelection, ForEach, GetValue, SetFillColor
Ссылка на базовый код макроса Microsoft VBA:
```vb
Sub example()
Dim xRg As Range
Dim xTxt As String
Dim xCell As Range
Dim xChar As String
Dim xCellPre As Range
Dim xCIndex As Long
Dim xCol As Collection
Dim I As Long
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("please select the data range:", "Kutools for Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
xCIndex = 2
Set xCol = New Collection
For Each xCell In xRg
On Error Resume Next
xCol.Add xCell, xCell.Text
If Err.Number = 457 Then
xCIndex = xCIndex + 1
Set xCellPre = xCol(xCell.Text)
If xCellPre.Interior.ColorIndex = xlNone Then xCellPre.Interior.ColorIndex = xCIndex
xCell.Interior.ColorIndex = xCellPre.Interior.ColorIndex
ElseIf Err.Number = 9 Then
MsgBox "Too many duplicate companies!", vbCritical, "Kutools for Excel"
Exit Sub
End If
On Error GoTo 0
Next
End Sub
```