Архив

Публикации с меткой ‘Диапазоны’

«Обратить выделение» — выделить все ячейки, кроме выделенных

 

Согласен, название статьи звучит страшно и не совсем понятно. Поэтому явно надо разъяснить поподробнее. Начну с предыстории. На одном форуме форумчанин задал вопрос — «Как инвертировать Selection?«(к слову ник форумчанина — Alex_ST). Т.е. если у Вас на листе выделена ячейка А1, то после работы кода будут выделены все ячейки на листе, кроме этой ячейки. Были предложены варианты, но…Каждый из них имел недостаток: либо для корректной работы требовалось создавать новую книгу или лист, либо не со всеми условиями работал корректно(например, выделение несмежных диапазонов), либо работал так долго, что можно было кофе сварить и выпить пока он работал. И вот на днях выдались пара свободных минут и решил я «добить» ту тему и создать-таки код, который будет работать без создания лишних листов и книг и довольно быстро. Сразу скажу, что довольно быстро понятие относительное. Все зависит от того, где и как выделен диапазон. Если изначально диапазон выделен как один неразрывный или как несколько несвязанных, но расположенных рядом друг с другом, то код отработает так же почти мгновенно. А вот если выделенная область расположена в конце листа(для Excel 2003 — 65536, Excel 2007 — 1048576) и в начале(первые строки и столбцы), то код может работать довольно долго. Но что-то я сомневаюсь, что многие будут выделять одновременно последнюю и первую ячейку на листе.

Option Explicit
 
Dim alArrBegRows(), alArrEndRows(), alArrBegCols(), alArrEndCols()
Dim lMinRow As Long, lMaxRow As Long, lMinCol As Long, lMaxCol As Long
Sub Invert_Selection()
    Dim rArea As Range, rInvertRange As Range, rTmpRng As Range, rRng As Range
    Dim lr As Long, lc As Long, li As Long
    Dim lEndRow As Long, lEndCol As Long
    Dim bEqualRows As Boolean, bEqualCols As Boolean
 
    If TypeName(Selection) <> "Range" Then Exit Sub
    For Each rArea In Selection.Areas
        ReDim Preserve alArrBegRows(li), alArrEndRows(li), alArrBegCols(li), alArrEndCols(li)
        alArrBegRows(li) = rArea.Row: alArrEndRows(li) = rArea.Row + rArea.Rows.Count - 1
        alArrBegCols(li) = rArea.Column: alArrEndCols(li) = rArea.Column + rArea.Columns.Count - 1
        li = li + 1
    Next rArea
    lMinRow = alArrBegRows(0): lMaxRow = 0: lMinCol = alArrBegCols(0): lMaxCol = 0
    For li = 0 To UBound(alArrBegRows)
        If alArrBegRows(li) < lMinRow Then lMinRow = alArrBegRows(li)
        If alArrEndRows(li) > lMaxRow Then lMaxRow = alArrEndRows(li)
        If alArrBegCols(li) < lMinCol Then lMinCol = alArrBegCols(li)
        If alArrEndCols(li) > lMaxCol Then lMaxCol = alArrEndCols(li)
    Next li
    lEndRow = ActiveSheet.Rows.Count
    lEndCol = ActiveSheet.Columns.Count
    'максимальные пороги
    If lMaxRow <> lEndRow Then
        Set rInvertRange = Rows(lMaxRow + 1 & ":" & lEndRow)
    End If
    If lMaxCol <> lEndCol Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Range(Cells(1, lMaxCol + 1), Cells(1, lEndCol)).EntireColumn)
        Else
            Set rInvertRange = Range(Cells(1, lMaxCol + 1), Cells(1, lEndCol)).EntireColumn
        End If
    End If
    'минимальные пороги
    If lMinRow <> 1 Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Rows(1 & ":" & lMinRow - 1))
        Else
            Set rInvertRange = Rows(1 & ":" & lMinRow - 1)
        End If
    End If
    If lMinCol <> 1 Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Range(Cells(1, 1), Cells(1, lMinCol - 1)).EntireColumn)
        Else
            Set rInvertRange = Range(Cells(1, 1), Cells(1, lMinCol - 1)).EntireColumn
        End If
    End If
 
    For li = 0 To UBound(alArrBegRows)
        'Если выделен целый столбец/столбцы
        If alArrEndRows(li) = lEndRow And alArrBegRows(li) = 1 Then
            bEqualRows = 1
        Else
            bEqualRows = 0
        End If
        'Если выделена целая строка/строки
        If alArrEndCols(li) = lEndCol And alArrBegCols(li) = 1 Then
            bEqualCols = 1
        Else
            bEqualCols = 0
        End If
    Next li
    'Если выделены даже несвязанные строки/столбцы целиком
    If bEqualRows Then lMinRow = lMaxRow
    If bEqualCols Then lMinCol = lMaxCol
    'ячейки "внутри"
    For lr = lMinRow To lMaxRow
        For lc = lMinCol To lMaxCol
            If Intersect_Nums(lr, lc) = False Then
                If rRng Is Nothing Then
                    If lMinRow = lMaxRow Then
                        Set rRng = Cells(lr, lc).EntireColumn
                    Else
                        If lMinCol = lMaxCol Then
                            Set rRng = Cells(lr, lc).EntireRow
                        Else
                            Set rRng = Cells(lr, lc)
                        End If
                    End If
                Else
                    If lMinRow = lMaxRow Then
                        Set rRng = Union(rRng, Cells(lr, lc).EntireColumn)
                    Else
                        If lMinCol = lMaxCol Then
                            Set rRng = Union(rRng, Cells(lr, lc).EntireRow)
                        Else
                            Set rRng = Union(rRng, Cells(lr, lc))
                        End If
                    End If
                End If
            End If
        Next lc
    Next lr
    If Not rInvertRange Is Nothing Then
        If Not rRng Is Nothing Then
            Set rInvertRange = Union(rRng, rInvertRange)
        End If
    Else
        If Not rRng Is Nothing Then
            Set rInvertRange = rRng
        End If
    End If
 
    'Действия над инвертированным диапазоном
    If Not rInvertRange Is Nothing Then
        rInvertRange.Select
    End If
End Sub
'---------------------------------------------------------------------------------------
' Procedure : Intersect_Nums
' Purpose   : Функция определения вхождения в диапазон
'---------------------------------------------------------------------------------------
Function Intersect_Nums(lr As Long, lc As Long) As Boolean
    Dim lCntR As Long, lCntC As Long, li As Long
    For li = LBound(alArrBegRows) To UBound(alArrBegRows)
        For lCntR = alArrBegRows(li) To alArrEndRows(li)
            For lCntC = alArrBegCols(li) To alArrEndCols(li)
                If lr = lCntR Then
                    If lc = lCntC Then Intersect_Nums = True: Exit Function
                End If
            Next lCntC
        Next lCntR
    Next li
End Function
Option Explicit

Dim alArrBegRows(), alArrEndRows(), alArrBegCols(), alArrEndCols()
Dim lMinRow As Long, lMaxRow As Long, lMinCol As Long, lMaxCol As Long
Sub Invert_Selection()
    Dim rArea As Range, rInvertRange As Range, rTmpRng As Range, rRng As Range
    Dim lr As Long, lc As Long, li As Long
    Dim lEndRow As Long, lEndCol As Long
    Dim bEqualRows As Boolean, bEqualCols As Boolean

    If TypeName(Selection) <> "Range" Then Exit Sub
    For Each rArea In Selection.Areas
        ReDim Preserve alArrBegRows(li), alArrEndRows(li), alArrBegCols(li), alArrEndCols(li)
        alArrBegRows(li) = rArea.Row: alArrEndRows(li) = rArea.Row + rArea.Rows.Count - 1
        alArrBegCols(li) = rArea.Column: alArrEndCols(li) = rArea.Column + rArea.Columns.Count - 1
        li = li + 1
    Next rArea
    lMinRow = alArrBegRows(0): lMaxRow = 0: lMinCol = alArrBegCols(0): lMaxCol = 0
    For li = 0 To UBound(alArrBegRows)
        If alArrBegRows(li) < lMinRow Then lMinRow = alArrBegRows(li)
        If alArrEndRows(li) > lMaxRow Then lMaxRow = alArrEndRows(li)
        If alArrBegCols(li) < lMinCol Then lMinCol = alArrBegCols(li)
        If alArrEndCols(li) > lMaxCol Then lMaxCol = alArrEndCols(li)
    Next li
    lEndRow = ActiveSheet.Rows.Count
    lEndCol = ActiveSheet.Columns.Count
    'максимальные пороги
    If lMaxRow <> lEndRow Then
        Set rInvertRange = Rows(lMaxRow + 1 & ":" & lEndRow)
    End If
    If lMaxCol <> lEndCol Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Range(Cells(1, lMaxCol + 1), Cells(1, lEndCol)).EntireColumn)
        Else
            Set rInvertRange = Range(Cells(1, lMaxCol + 1), Cells(1, lEndCol)).EntireColumn
        End If
    End If
    'минимальные пороги
    If lMinRow <> 1 Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Rows(1 & ":" & lMinRow - 1))
        Else
            Set rInvertRange = Rows(1 & ":" & lMinRow - 1)
        End If
    End If
    If lMinCol <> 1 Then
        If Not rInvertRange Is Nothing Then
            Set rInvertRange = Union(rInvertRange, Range(Cells(1, 1), Cells(1, lMinCol - 1)).EntireColumn)
        Else
            Set rInvertRange = Range(Cells(1, 1), Cells(1, lMinCol - 1)).EntireColumn
        End If
    End If

    For li = 0 To UBound(alArrBegRows)
        'Если выделен целый столбец/столбцы
        If alArrEndRows(li) = lEndRow And alArrBegRows(li) = 1 Then
            bEqualRows = 1
        Else
            bEqualRows = 0
        End If
        'Если выделена целая строка/строки
        If alArrEndCols(li) = lEndCol And alArrBegCols(li) = 1 Then
            bEqualCols = 1
        Else
            bEqualCols = 0
        End If
    Next li
    'Если выделены даже несвязанные строки/столбцы целиком
    If bEqualRows Then lMinRow = lMaxRow
    If bEqualCols Then lMinCol = lMaxCol
    'ячейки "внутри"
    For lr = lMinRow To lMaxRow
        For lc = lMinCol To lMaxCol
            If Intersect_Nums(lr, lc) = False Then
                If rRng Is Nothing Then
                    If lMinRow = lMaxRow Then
                        Set rRng = Cells(lr, lc).EntireColumn
                    Else
                        If lMinCol = lMaxCol Then
                            Set rRng = Cells(lr, lc).EntireRow
                        Else
                            Set rRng = Cells(lr, lc)
                        End If
                    End If
                Else
                    If lMinRow = lMaxRow Then
                        Set rRng = Union(rRng, Cells(lr, lc).EntireColumn)
                    Else
                        If lMinCol = lMaxCol Then
                            Set rRng = Union(rRng, Cells(lr, lc).EntireRow)
                        Else
                            Set rRng = Union(rRng, Cells(lr, lc))
                        End If
                    End If
                End If
            End If
        Next lc
    Next lr
    If Not rInvertRange Is Nothing Then
        If Not rRng Is Nothing Then
            Set rInvertRange = Union(rRng, rInvertRange)
        End If
    Else
        If Not rRng Is Nothing Then
            Set rInvertRange = rRng
        End If
    End If

    'Действия над инвертированным диапазоном
    If Not rInvertRange Is Nothing Then
        rInvertRange.Select
    End If
End Sub
'---------------------------------------------------------------------------------------
' Procedure : Intersect_Nums
' Purpose   : Функция определения вхождения в диапазон
'---------------------------------------------------------------------------------------
Function Intersect_Nums(lr As Long, lc As Long) As Boolean
    Dim lCntR As Long, lCntC As Long, li As Long
    For li = LBound(alArrBegRows) To UBound(alArrBegRows)
        For lCntR = alArrBegRows(li) To alArrEndRows(li)
            For lCntC = alArrBegCols(li) To alArrEndCols(li)
                If lr = lCntR Then
                    If lc = lCntC Then Intersect_Nums = True: Exit Function
                End If
            Next lCntC
        Next lCntR
    Next li
End Function

В приложенном файле примере код усложнен пользовательской формой(UserForm), при помощи которой можно выбрать действие с инвертированным диапазоном: Выделить, Очистит все, Очистить форматы, Очистить значения. Немного поменяв код Вы сможете легко добавить другие действия над диапазоном.

Скачать пример »

  Tips_Macro_Invert_Selection.xls (93,0 KiB, 464 скачиваний)

Categories: Tags:

Как определить первую заполненную ячейку на листе?

 

Раз уж мы научились определять последнюю заполненную ячейку на листе, то теперь неплохо бы научиться определять и первую :-) Хотя бы так, для общего образования. Для чего это может понадобиться? Да хотя бы для поиска заоголовка таблицы, если таблица «плавающая». Т.е. таблица может менять свое положение на листе, а нам крайне необходимо найти, где она начинается.

Sub Get_First_Cell()
    Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range
    'проверяем, есть ли данные в первой ячейке диапазона данных
    If ActiveSheet.UsedRange.Cells(1, 1) <> "" Then
        lFirstRow = ActiveSheet.UsedRange.Row
        lFirstCol = ActiveSheet.UsedRange.Column
    Else
        'ищем ячейку с любым значение(так же с формулой)
        Set rFndRng = ActiveSheet.UsedRange.Find("*", , xlFormulas, xlWhole)
        If rFndRng Is Nothing Then
            MsgBox "Лист не содержит данных", vbInformation, "Информация": Exit Sub
        End If
        lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column
    End If
    MsgBox "Номер строки первой заполненной ячейки: " & lFirstRow & vbNewLine & _
           "Номер столбца первой заполненной ячейки: " & lFirstCol
End Sub
Sub Get_First_Cell()
    Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range
    'проверяем, есть ли данные в первой ячейке диапазона данных
    If ActiveSheet.UsedRange.Cells(1, 1) <> "" Then
        lFirstRow = ActiveSheet.UsedRange.Row
        lFirstCol = ActiveSheet.UsedRange.Column
    Else
        'ищем ячейку с любым значение(так же с формулой)
        Set rFndRng = ActiveSheet.UsedRange.Find("*", , xlFormulas, xlWhole)
        If rFndRng Is Nothing Then
            MsgBox "Лист не содержит данных", vbInformation, "Информация": Exit Sub
        End If
        lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column
    End If
    MsgBox "Номер строки первой заполненной ячейки: " & lFirstRow & vbNewLine & _
           "Номер столбца первой заполненной ячейки: " & lFirstCol
End Sub

Как видите — все очень просто. Никаких особых заморочек и трудностей.

Так же см.:
Как определить последнюю ячейку на листе через VBA?

Работа с дубликатами

 

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

Работа с дубликатами

Диапазон либо столбец со значениями —  указывается либо столбец со значениями для обработки, либо полностью вся таблица. Зависит от выполняемой задачи.

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

Выбрать из списка только дубликаты — из выделенного диапазона будут выбраны только те значения, количество которых в диапазоне более одного.

Выводить количество повторений в последний столбец — напротив каждого значения в последнем столбце созданного списка будет записано количество повторений. Опция доступна только при выборе пункта - Выбрать из списка только дубликаты.

Обрабатывать только первый столбец — независимо от количества столбцов в выделенном диапазоне будет создан список только из одного первого столбца.

Обрабатывать всю таблицу на основе первого столбца выделенного диапазона — будет создан список с количеством столбцов равным количеству столбцов в выделенном диапазоне.

Примечание: Результат в любом случае помещается на новый лист, который создается в процессе выполнения данной команды. Отбор значений производится на основании столбца, указанного в поле Номер столбца в диапазоне с критериями(на рис. — 2). Если номер столбца не указан, то отбор производится на основании первого столбца выделенного диапазона.

Также см.:
Как получить список уникальных(не повторяющихся) значений?

Объединение ячеек без потери значений

 

Как известно, при объединении нескольких ячеек со значениями, Excel оставляет значение только верхней левой ячейки. На мой взгляд это не всегда удобно. Особенно при построении отчетов. Так вот, чтобы объединить ячейки, сохранив все их значения в созданной «одной большой», можно воспользоваться командой Объединение ячеек «Объединение ячеек без потери значений».

Объединение ячеек

Сделать перенос значений на строки —  значение каждой из объединяемых ячеек будет перенесено на новую строку(разделитель, естественно, не указывается)рис.1

Объединить в одну строку — значения объединяемых ячеек объединяются в одну строку друг за другом. При установленной галочке в пункте «Использовать в качестве разделителя«, можно указать разделитель для значений каждой ячейки — рис.2.

Объединение с переносомрис.1

Объединение с разделителемрис.2

Также см.:
Как сцепить несколько значений в одну ячейку по критерию? СцепитьЕсли
Couple_Cells - быстрое сцепление диапазона ячеек
Разбить по строкам/столбцам

Координатное выделение строки и столбца

 

Данная команда пригодится тем, кто часто работает с большими таблицами, просматривая их и сопоставляя данные в строках и столбцах. Делает она следующее: выделяет столбец и строку таблицы на пересечении выделенной ячейки, благодаря чему можно просмотреть все данные в столбце и строке активной ячейки, не сверяясь лишний раз — «А в том ли столбце я смотрю данные?«.

Координатное выделение

Метод — выбор метода подсветки строки и столбца:

После выбора метода выделения, значек Координатное выделение на панели MyAddin поменяется на значек выбранного Вами метода выделения, а подпись команды будет дополнительно информировать Вас о выбранном методе(«Выделение: Строка»,»Выделение: Столбец»,»Выделение: Строка и Столбец», «Выделение Условным форматированием: Строка», «Выделение Условным форматированием: Столбец», «Выделение Условным форматированием: Строка и Столбец»)

  • Выделение Метод выделением — строка и столбец выделяются обычным выделением. Недостаток один — сделав изменения на листе в данном режиме Вы сможете отменить только последнее сделанное изменение.
  • Условное форматирование Метод Условным Форматированием - строка и столбец выделяются через условное форматирование. Недостаток данного метода — все условные форматы, примененные к данному листу ранее, удаляются.

Весь лист — выделяются строка и столбец всего листа.

Вся таблица данных - выделяются строка и столбец только в пределах используемого диапазона данных.

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

Область применения — выбирается область листа, к которой применяется координатное выделение:

  • Только строка — выделяется только строка активной ячейки.
  • Только столбец — выделяется только столбец активной ячейки.
  • Строка и столбец - выделяется строка и столбец на пересечении активной ячейки.

Отменить Координатное выделение — отменяет примененное координатное выделение.

Примечание: координатное выделение действует во всех листах всех открытых книг до тех пор, пока Вы не отключите его через пункт — Отменить Координатное выделение.

Так же следует учесть, что при примененном координатном выделении невозможно скопировать выделенный диапазон, однако можно удалить значение активной ячейки(будет удалено только значение одной ячейки — расположенной на пересечении строки и столбца).

Пример применения

Вставить значения

 

Данная команда применяется для замены формул в ячейках на значения(результат вычисления формул). А именно: если у Вас в ячейке прописана какая-либо формула и Вы хотите зафиксировать результат вычисления этой формулы независимо от значений других ячеек.

В общем аналогична Специальной вставке(Значения) в Excel, с тем различием, что необходимо всего лишь выделить диапазон со значениями и нажать кнопку Вставить значения на панели.

Действие данной команды можно отменить, нажав Ctrl+Z или кнопку возврата значений на панели Excel.

Также см.:
Как удалить в ячейке формулу, оставив значения?

Поиск по всем книгам

 

Достаточно актуальная на мой взгляд проблема. Если у Вас одновременно открыто несколько книг и необходимо найти какое-либо значение просматривая именно ВСЕ книги. Excel, как ни странно этого делать не умеет… Возможен лишь поиск по всем листам активной книги. Я решил немного исправить такую несправедливость и сделал команду «Поиск по всем книгам«. Данная команда делает все то же самое, что и стандартный поиск, но может искать заданное значение по всем открытым книгам. И небольшая особенность — при указании пустого значения в поле «Найти:» и выполнения поиска появиться предупреждение:

Если не задан критерий поиска рис.1

Если нажать «Да», то будут выведены адреса первых пустых ячеек на листе/листах/книгах. Я еще опишу данный момент поподробнее.
Итак, Вы решили воспользоваться данной командой.

Поиск по всем книгам рис.2

Найти: - указывается значение для поиска. Может быть любой символ.

Искать:

  • на листе — поиск указанного значения осуществляется только на активном листе;
  • в книге — поиск осуществляется во всех листах активной книги(скрытые листы не просматриваются);
  • во всех книгах — поиск осуществляется по всем открытым книгам на видимых листах(скрытые листы не просматриваются).

Просматривать:

  • по строкам — поиск ведется слева-направо сверху-вниз — т.е. сначала просматривается каждая ячейка строки, а потом осуществляется переход на следующую строку;
  • по столбцам — поиск ведется сверху-вниз слева-направо — сначала просматривается каждая ячейка столбца, а потом осуществляется переход на следующий столбец.
  • Выбранный метод влияет на вывод результатов поиска(при выборе Найти все) и на переход по найденным ячейкам(Найти далее).

Область поиска:

  • формулы — поиск будет осуществляться по действительному содержимому ячейки(то, которое отображается в строке формул при активации ячейки), а не по отображаемому значению;
  • значения — поиск будет осуществляться отображаемому содержимому ячейки;
  • примечания — поиск осуществляется исключительно в тексте примечаний в ячейках.

Везде(по умолчанию) — поиск будет осуществляться по всему листу.
Только выделенный диапазон — поиск будет осуществляться по выделенному диапазону. Диапазон задается один для всех листов, исходя из выделенного на активном листе диапазона.
Найти все — результаты поиска будут выведены в поле, отображаемое после поиска. При нажатии на любое из найденных значений выбранное значение будет активировано. Если критерий поиска не задан(пустое значение), то в поле будут выведены адреса всех первых пустых ячеек на листах(зависит от выбранного метода просмотра — Просматривать).
Найти далее — будет активироваться каждое найденное значение по кругу.

Также см.:
Как заменить/удалить/найти звездочку?
Как определить последнюю ячейку на листе через VBA?
Как получить последннюю заполненную ячейку формулой?
Как найти значение в другой таблице или сила ВПР

Удаление всех пустых строк в таблице

 

Данная команда делает именно то, о чем говорится в её названии — Удаляет пустые строки в таблице.

К примеру у Вас имеется большая таблица данных. Где-то в ней имеются разрывы в виде полностью пустых строк, которые не нужны и хотелось бы их удалить. Фильтр не всегда помогает и не всегда удобен, т.к. помимо полностью пустых строк могут быть и просто пустые ячейки. Не очень интересное занятие. Так вот, воспользовавшись данной командой Вы сможете удалить все эти ненужные строки, не прибегая к танцам с бубном.

Как работает.

Вы жмете на кнопочку Удаление пустых строк, появляется предупреждение

Предупреждение

Дальше ясно: отказываетесь — ничего не происходить; соглашаетесь — удаляются все пустые строки из таблицы. Для большей ясности: пустая строка это та, во всех ячейках которой отсутствует хоть какое-то значение.

Примечание: Если после выполнения команды строки не удалились, проверьте действительно ли строки пустые или в них есть какие-либо значения. Например пробел или 0. Даже если 0 не видно визуально, возможно он там есть, просто у Вас в настройках установлено значение «Показывать нули в ячейках, которые содержат нулевые значения».

  • В Excel 2007 это значение можно поменять зайдя в: Меню-Параметры Excel-Дополнительно
  • В Excel 2003: Меню-Параметры-вкладка Вид-Нулевые значения

Сравнить диапазоны

 

Эта команда должна помочь Вам в сравнении данных в разных диапазонах и выведении списков совпадений, различий.

/img/excel-vba_ru/MyAddinForms_CompareRanges.gif

Всего можно указать к сравнению два диапазона, но как правило больше и не надо.

Диапазон1, Диапазон2 — указывается ссылка на диапазоны, между которыми надо провести сравнение. Диапазоны могут быть не равны между собой по количеству ячеек. Т.е. в одном может быть 1 столбец и 40 строк, а в другом 4 столбца и 3 строки.

Вывести список значений:

  • Уникальные для обоих диапазонов(как одного объединенного) — на новом листе будет создан список, в котором будут содержаться значения обоих диапазонов без повторений(если в одном и втором диапазоне присутствует значение «пять», то на новом листе это значение будет выведено лишь один раз).
  • Присутствующие в обоих диапазонах — на новом листе будет создан список из значений, которые встречаются в первом и втором диапазоне. Если какое-либо значение присутствует только в одном диапазоне, но отсутствует в другом — оно не попадет в результирующий список.
  • Первого диапазона, отсутствующих во втором — на новом листе будет создан список из значений, которые встречаются в первом диапазоне, но отсутствует во втором.
  • Второго диапазона, отсутствующих в первом — на новом листе будет создан список из значений, которые встречаются во втором диапазоне, но отсутствует в первом.

Выделить цветом:

  • Значения в первом диапазоне, имеющиеся во втором — заливка ячейки в первом диапазоне будет заменена выбранным цветом в том случае, если значение ячейки присутствует во втором диапазоне.
  • Значения во втором диапазоне, имеющиеся в первом — заливка ячейки во втором диапазоне будет заменена выбранным цветом в том случае, если значение ячейки присутствует в первом диапазоне.

Для выделения цветом доступно шесть вариантов цвета: Красный, Зеленый, Синий, Желтый, Розовый и Голубой.

Примечание: данная команда может изменить форматирование ячеек(цвет заливки), так что если у Вас имеется форматирование, которое необходимо сохранить, производите сравнение на копии данных.

Также см.:
Как получить список уникальных(не повторяющихся) значений?
Работа с дубликатами

Поменять диапазоны местами

 

Команда меняет значения в двух выделенных диапазонах.

Например, у Вас есть значения в диапазоне A1:A10 и в диапазоне B1:B10. Выделяете сначала A1:A10, а затем, зажав клавишу Ctrl второй диапазон — B1:B10(рис.1). Теперь просто жмете кнопку команды — /img/excel-vba_ru/MyAddinIcon_Change_Ranges.gif. Диапазоны обменяются значениями. Так же можно поменять значения в горизонтальном и вертикальном массивах(A1:A10:B1:K1)-рис.2. Главное, чтобы кол-во ячеек в обоих выделенных диапазонах было одинаковое.

/img/excel-vba_ru/MyAddin_ChangeRanges_RowToRow.gifрис.1

/img/excel-vba_ru/MyAddin_ChangeRanges_Transpose.gifрис.2

Заменяются только значения. Форматирование, формулы и форматы не заменяются.

Важно: при замене этим методом все имеющиеся в диапазонах формулы будут заменены на значения. На всякий случай действия данной команды можно откатить, нажав сочетание клавиш Ctrl+Z или соответствующую кнопку на панели.