Excel фильтр инвертировать выделение

Я задаю вопрос, на который я планирую ответить, чтобы я мог документировать эту проблему в долгосрочной перспективе. Более чем рад за других, чтобы внести другие предложения / исправления.

У меня часто возникает проблема в Excel, когда я использую фильтры, а затем хочу инвертировать выделение, т.е. снять все выбранные элементы и выбрать все элементы, которые в настоящее время не выбраны. Например, см. Скриншоты ниже:

Нет простого способа сделать это (о чем я знаю!), Кроме как щелкнуть по списку, который трудоемок и подвержен ошибкам. Как мы можем автоматизировать эту функцию в Excel?

До:

Начальный выбор

После:

Перевернутый выбор

2018-01-24 13:29

5

ответов

Я написал немного VBA, которая расширяет Excel и обеспечивает эту функциональность. Он добавляет новое контекстное меню (контекстное меню) из подменю «Фильтр» (см. Скриншот).

Вам нужно позвонить AddToCellMenu подпрограмма для отображения пункта меню. Если вы хотите использовать этот параметр для всех сеансов Excel, вам нужно поместить этот код в личную рабочую книгу или надстройку, которую вы используете, а затем вызвать AddToCellMenu на Workbook_Open событие или что-то подобное.

В любом случае вот код:

Option Explicit

Public Sub AddToCellMenu(dummy As Byte)

Dim FilterMenu As CommandBarControl

    ' Delete the controls first to avoid duplicates
    Call DeleteFromCellMenu

    ' Set ContextMenu to the Cell context menu
    ' 31402 is the filter sub-menu of the cell context menu
    Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)

    ' Add one custom button to the Cell context menu
    With FilterMenu.Controls.Add(Type:=msoControlButton, before:=3)
        .OnAction = "'" & ThisWorkbook.name & "'!" & "InvertFilter"
        .FaceId = 1807
        .Caption = "Invert Filter Selection"
        .Tag = "My_Cell_Control_Tag"
    End With

End Sub

Private Sub DeleteFromCellMenu()

Dim FilterMenu As CommandBarControl
Dim ctrl As CommandBarControl

    ' Set ContextMenu to the Cell context menu
    ' 31402 is the filter sub-menu of the cell context menu
    Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)

    ' Delete the custom controls with the Tag : My_Cell_Control_Tag
    For Each ctrl In FilterMenu.Controls
        If ctrl.Tag = "My_Cell_Control_Tag" Then
            ctrl.Delete
        End If
    Next ctrl

End Sub

Public Sub InvertFilter()

Dim cell As Range
Dim af As AutoFilter
Dim f As Filter
Dim i As Integer

Dim arrCur As Variant
Dim arrNew As Variant
Dim rngCol As Range
Dim c As Range
Dim txt As String
Dim bBlank As Boolean

    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' INITAL CHECKS
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Set cell = ActiveCell

    If cell.parent.AutoFilterMode = False Then
        MsgBox "No filters on current sheet"
        Exit Sub
    End If

    Set af = cell.parent.AutoFilter

    If Application.Intersect(cell, af.Range) Is Nothing Then
        MsgBox "Current cell not part of filter range"
        Exit Sub
    End If

    i = cell.Column - af.Range.cells(1, 1).Column + 1
    Set f = af.Filters(i)

    If f.On = False Then
        MsgBox "Current column not being filtered. Nothing to invert"
        Exit Sub
    End If

    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' GET CURRENT FILTER DATA
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ' Single value criteria
    If f.Operator = 0 Then
        If f.Criteria1 = "<>" Then ArrayAdd arrNew, "="
        If f.Criteria1 = "=" Then ArrayAdd arrNew, "<>"
        ArrayAdd arrCur, f.Criteria1
    ' Pair of values used as criteria
    ElseIf f.Operator = xlOr Then
        ArrayAdd arrCur, f.Criteria1
        ArrayAdd arrCur, f.Criteria2
    ' Multi list criteria
    ElseIf f.Operator = xlFilterValues Then
        arrCur = f.Criteria1
    Else
        MsgBox "Current filter is not selecting values. Cannot process inversion"
        Exit Sub
    End If

    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' COMPUTE INVERTED FILTER DATA
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ' Only process if new list is empty
    ' Being non-empty implies we're just toggling blank state and new list is already determined for that
    If IsEmpty(arrNew) Then

        ' Get column of data, ignoring header row
        Set rngCol = af.Range.Resize(af.Range.Rows.Count - 1, 1).Offset(1, i - 1)
        bBlank = False

        For Each c In rngCol

            ' Ignore blanks for now; they get special processing at the end
            If c.Text <> "" Then

                ' If the cell text is in neither the current filter list ...
                txt = "=" & c.Text
                If Not ArrayContains(arrCur, txt) Then

                    ' ... nor the new proposed list then add it to the new proposed list
                    If Not ArrayContains(arrNew, txt) Then ArrayAdd arrNew, txt

                End If

            Else
                ' Record that we have blank cells
                bBlank = True
            End If

        Next c

        ' Process blank options
        ' If we're not currently selecting for blanks ...
        ' ... and there are blanks ...
        ' ... then filter for blanks in new selection
        If (Not arrCur(UBound(arrCur)) = "=" And bBlank) Then ArrayAdd arrNew, "="

    End If

    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' APPLY NEW FILTER
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Select Case UBound(arrNew)
        Case 0:
            MsgBox "Didn't find any values to invert"
            Exit Sub
        Case 1:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew(1)
        Case 2:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew(1), _
                Criteria2:=arrNew(2), _
                Operator:=xlOr
        Case Else:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew, _
                Operator:=xlFilterValues
    End Select

End Sub

Private Sub ArrayAdd(ByRef a As Variant, item As Variant)

Dim i As Integer

    If IsEmpty(a) Then
        i = 1
        ReDim a(1 To i)
    Else
        i = UBound(a) + 1
        ReDim Preserve a(1 To i)
    End If

    a(i) = item

End Sub

Private Function ArrayContains(a As Variant, item As Variant) As Boolean

Dim i As Integer

    If IsEmpty(a) Then
        ArrayContains = False
        Exit Function
    End If

    For i = LBound(a) To UBound(a)
        If a(i) = item Then
            ArrayContains = True
            Exit Function
        End If
    Next i

    ArrayContains = False

End Function

' Used to find the menu IDs
Private Sub ListMenuInfo()

Dim row As Integer
Dim Menu As CommandBarControl
Dim MenuItem As CommandBarControl
Dim SubMenuItem As CommandBarControl

    row = 1
    On Error Resume Next
    For Each Menu In CommandBars("cell").Controls
        For Each MenuItem In Menu.Controls
            For Each SubMenuItem In MenuItem.Controls
                cells(row, 1) = Menu.Caption
                cells(row, 2) = Menu.ID
                cells(row, 3) = MenuItem.Caption
                cells(row, 4) = MenuItem.ID
                cells(row, 5) = SubMenuItem.Caption
                cells(row, 6) = SubMenuItem.ID
                row = row + 1
            Next SubMenuItem
        Next MenuItem
    Next Menu

End Sub

2018-01-24 13:29

Я пытался решить эту проблему в течение некоторого времени и думаю, что только что обнаружил довольно простой способ инвертировать фильтр. Просто выделите текущие ячейки и снимите фильтр. Теперь снова отфильтруйте все, что не выделено, и готово. Надеюсь, что это поможет, это определенно сработало для того, что мне было нужно.

2019-07-17 20:01

Я отключил обновление экрана, чтобы ускорить это. Также удалил избыточный аргумент из AddToCellMenu, так как он вызывал ошибки при вызове из моего Personal.xlsb.

Быстрая полная инструкция для постоянного добавления опции обратного фильтра в ваш Excel:

  1. Читайте о том, как создать свой Personal.xlsb
  2. Вставьте этот код в объект ThisWorkbook вашего Personal (Разработчик -> Visual Basic -> дважды щелкните ThisWorkbook):

    Private Sub Workbook_Open()
        Windows("Personal.xlsb").Visible = False
        Call AddToCellMenu
    End Sub
    
  3. Вставьте обновленный код Джеймса в новый модуль внутри вашего Personal.xlsb:

    Option Explicit
    
    Public Sub AddToCellMenu()
    
    Dim FilterMenu As CommandBarControl
    
        ' Delete the controls first to avoid duplicates
        Call DeleteFromCellMenu
    
        ' Set ContextMenu to the Cell context menu
        ' 31402 is the filter sub-menu of the cell context menu
        Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)
    
        ' Add one custom button to the Cell context menu
        With FilterMenu.Controls.Add(Type:=msoControlButton, before:=3)
            .OnAction = "'" & ThisWorkbook.name & "'!" & "InvertFilter"
            .FaceId = 1807
            .Caption = "Invert Filter Selection"
            .Tag = "My_Cell_Control_Tag"
        End With
    
    End Sub
    
    Private Sub DeleteFromCellMenu()
    
    Dim FilterMenu As CommandBarControl
    Dim ctrl As CommandBarControl
    
        ' Set ContextMenu to the Cell context menu
        ' 31402 is the filter sub-menu of the cell context menu
        Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)
    
        ' Delete the custom controls with the Tag : My_Cell_Control_Tag
        For Each ctrl In FilterMenu.Controls
            If ctrl.Tag = "My_Cell_Control_Tag" Then
                ctrl.Delete
            End If
        Next ctrl
    
    End Sub
    
    Public Sub InvertFilter()
    
    Application.ScreenUpdating = False
    
    Dim cell As Range
    Dim af As AutoFilter
    Dim f As Filter
    Dim i As Integer
    
    Dim arrCur As Variant
    Dim arrNew As Variant
    Dim rngCol As Range
    Dim c As Range
    Dim txt As String
    Dim bBlank As Boolean
    
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ' INITAL CHECKS
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        Set cell = ActiveCell
    
        If cell.parent.AutoFilterMode = False Then
            MsgBox "No filters on current sheet"
            Exit Sub
        End If
    
        Set af = cell.parent.AutoFilter
    
        If Application.Intersect(cell, af.Range) Is Nothing Then
            MsgBox "Current cell not part of filter range"
            Exit Sub
        End If
    
        i = cell.Column - af.Range.cells(1, 1).Column + 1
        Set f = af.Filters(i)
    
        If f.On = False Then
            MsgBox "Current column not being filtered. Nothing to invert"
            Exit Sub
        End If
    
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ' GET CURRENT FILTER DATA
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        ' Single value criteria
        If f.Operator = 0 Then
            If f.Criteria1 = "<>" Then ArrayAdd arrNew, "="
            If f.Criteria1 = "=" Then ArrayAdd arrNew, "<>"
            ArrayAdd arrCur, f.Criteria1
        ' Pair of values used as criteria
        ElseIf f.Operator = xlOr Then
            ArrayAdd arrCur, f.Criteria1
            ArrayAdd arrCur, f.Criteria2
        ' Multi list criteria
        ElseIf f.Operator = xlFilterValues Then
            arrCur = f.Criteria1
        Else
            MsgBox "Current filter is not selecting values. Cannot process inversion"
            Exit Sub
        End If
    
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ' COMPUTE INVERTED FILTER DATA
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        ' Only process if new list is empty
        ' Being non-empty implies we're just toggling blank state and new list is already determined for that
        If IsEmpty(arrNew) Then
    
            ' Get column of data, ignoring header row
            Set rngCol = af.Range.Resize(af.Range.Rows.Count - 1, 1).Offset(1, i - 1)
            bBlank = False
    
            For Each c In rngCol
    
                ' Ignore blanks for now; they get special processing at the end
                If c.Text <> "" Then
    
                    ' If the cell text is in neither the current filter list ...
                    txt = "=" & c.Text
                    If Not ArrayContains(arrCur, txt) Then
    
                        ' ... nor the new proposed list then add it to the new proposed list
                        If Not ArrayContains(arrNew, txt) Then ArrayAdd arrNew, txt
    
                    End If
    
                Else
                    ' Record that we have blank cells
                    bBlank = True
                End If
    
            Next c
    
            ' Process blank options
            ' If we're not currently selecting for blanks ...
            ' ... and there are blanks ...
            ' ... then filter for blanks in new selection
            If (Not arrCur(UBound(arrCur)) = "=" And bBlank) Then ArrayAdd arrNew, "="
    
        End If
    
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ' APPLY NEW FILTER
        ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        Select Case UBound(arrNew)
            Case 0:
                MsgBox "Didn't find any values to invert"
                Exit Sub
            Case 1:
                af.Range.AutoFilter _
                    Field:=i, _
                    Criteria1:=arrNew(1)
            Case 2:
                af.Range.AutoFilter _
                    Field:=i, _
                    Criteria1:=arrNew(1), _
                    Criteria2:=arrNew(2), _
                    Operator:=xlOr
            Case Else:
                af.Range.AutoFilter _
                    Field:=i, _
                    Criteria1:=arrNew, _
                    Operator:=xlFilterValues
        End Select
    
    Application.ScreenUpdating = True
    
    End Sub
    
    Private Sub ArrayAdd(ByRef a As Variant, item As Variant)
    
    Dim i As Integer
    
        If IsEmpty(a) Then
            i = 1
            ReDim a(1 To i)
        Else
            i = UBound(a) + 1
            ReDim Preserve a(1 To i)
        End If
    
        a(i) = item
    
    End Sub
    
    Private Function ArrayContains(a As Variant, item As Variant) As Boolean
    
    Dim i As Integer
    
        If IsEmpty(a) Then
            ArrayContains = False
            Exit Function
        End If
    
        For i = LBound(a) To UBound(a)
            If a(i) = item Then
                ArrayContains = True
                Exit Function
            End If
        Next i
    
        ArrayContains = False
    
    End Function
    
    ' Used to find the menu IDs
    Private Sub ListMenuInfo()
    
    Dim row As Integer
    Dim Menu As CommandBarControl
    Dim MenuItem As CommandBarControl
    Dim SubMenuItem As CommandBarControl
    
        row = 1
        On Error Resume Next
        For Each Menu In CommandBars("cell").Controls
            For Each MenuItem In Menu.Controls
                For Each SubMenuItem In MenuItem.Controls
                    cells(row, 1) = Menu.Caption
                    cells(row, 2) = Menu.ID
                    cells(row, 3) = MenuItem.Caption
                    cells(row, 4) = MenuItem.ID
                    cells(row, 5) = SubMenuItem.Caption
                    cells(row, 6) = SubMenuItem.ID
                    row = row + 1
                Next SubMenuItem
            Next MenuItem
        Next Menu
    
    End Sub
    
  4. Все еще в вашем Personal.xslb, перейдите на вкладку View, затем нажмите «hide», и это больше не будет вас беспокоить, никогда.:)

Сохраните файл и перезапустите ваш Excel. Параметр обратного фильтра будет добавляться автоматически каждый раз, когда вы открываете любой файл Excel.

2018-10-25 13:50

Ошибка времени выполнения’-2147467259 (80004005)’: сбой метода’ Удалить ‘объектов’ _CommandBarButton’

И после того, как я нажму кнопку завершения, он работает 😃😃

2021-07-06 11:35

Я выполнил «Быструю полную инструкцию, чтобы навсегда добавить опцию обратного фильтра в ваш Excel:», но это, похоже, не работает.

для отфильтрованных таблиц появляется опция правой кнопки мыши, но затем появляется всплывающее сообщение «Нет фильтров на текущем листе»

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

Появление опции щелчка правой кнопкой мыши, я полагаю, означает, что я правильно выполнил шаги. макросы также были включены (просто чтобы убедиться, что это не проблема).


18 июн ’21 в 06:14
2021-06-18 06:14

2021-06-18 06:14

I’ve written a bit of VBA that extends Excel and provides this functionality. It adds a new context menu (right-click menu) option off the Filter sub-menu (see screenshot).

You need to call the AddToCellMenu subroutine to make the menu item appear. If you want to make that permament for all your Excel sessions, you’ll need to put this code in a personal workbook or add-in you have running and then call AddToCellMenu on the Workbook_Open event, or something similar.

enter image description here

Anyway here’s the code:

Option Explicit

Public Sub AddToCellMenu(dummy As Byte)

Dim FilterMenu As CommandBarControl

    ' Delete the controls first to avoid duplicates
    Call DeleteFromCellMenu

    ' Set ContextMenu to the Cell context menu
    ' 31402 is the filter sub-menu of the cell context menu
    Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)

    ' Add one custom button to the Cell context menu
    With FilterMenu.Controls.Add(Type:=msoControlButton, before:=3)
        .OnAction = "'" & ThisWorkbook.name & "'!" & "InvertFilter"
        .FaceId = 1807
        .Caption = "Invert Filter Selection"
        .Tag = "My_Cell_Control_Tag"
    End With

End Sub

Private Sub DeleteFromCellMenu()

Dim FilterMenu As CommandBarControl
Dim ctrl As CommandBarControl

    ' Set ContextMenu to the Cell context menu
    ' 31402 is the filter sub-menu of the cell context menu
    Set FilterMenu = Application.CommandBars("Cell").FindControl(ID:=31402)

    ' Delete the custom controls with the Tag : My_Cell_Control_Tag
    For Each ctrl In FilterMenu.Controls
        If ctrl.Tag = "My_Cell_Control_Tag" Then
            ctrl.Delete
        End If
    Next ctrl

End Sub

Public Sub InvertFilter()

Dim cell As Range
Dim af As AutoFilter
Dim f As Filter
Dim i As Integer

Dim arrCur As Variant
Dim arrNew As Variant
Dim rngCol As Range
Dim c As Range
Dim txt As String
Dim bBlank As Boolean

    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' INITAL CHECKS
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Set cell = ActiveCell
    
    Set af = cell.parent.AutoFilter

    If af Is Nothing Then
        MsgBox "No filters on current sheet"
        Exit Sub
    End If
    
    If Application.Intersect(cell, af.Range) Is Nothing Then
        MsgBox "Current cell not part of filter range"
        Exit Sub
    End If
    
    i = cell.Column - af.Range.cells(1, 1).Column + 1
    Set f = af.Filters(i)
    
    If f.On = False Then
        MsgBox "Current column not being filtered. Nothing to invert"
        Exit Sub
    End If
    
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' GET CURRENT FILTER DATA
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    ' Single value criteria
    If f.Operator = 0 Then
        If f.Criteria1 = "<>" Then ArrayAdd arrNew, "="
        If f.Criteria1 = "=" Then ArrayAdd arrNew, "<>"
        ArrayAdd arrCur, f.Criteria1
    ' Pair of values used as criteria
    ElseIf f.Operator = xlOr Then
        ArrayAdd arrCur, f.Criteria1
        ArrayAdd arrCur, f.Criteria2
    ' Multi list criteria
    ElseIf f.Operator = xlFilterValues Then
        arrCur = f.Criteria1
    Else
        MsgBox "Current filter is not selecting values. Cannot process inversion"
        Exit Sub
    End If
    
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' COMPUTE INVERTED FILTER DATA
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    ' Only process if new list is empty
    ' Being non-empty implies we're just toggling blank state and new list is already determined for that
    If IsEmpty(arrNew) Then
    
        ' Get column of data, ignoring header row
        Set rngCol = af.Range.Resize(af.Range.Rows.Count - 1, 1).Offset(1, i - 1)
        bBlank = False
        
        For Each c In rngCol
            
            ' Ignore blanks for now; they get special processing at the end
            If c.Text <> "" Then
                
                ' If the cell text is in neither the current filter list ...
                txt = "=" & c.Text
                If Not ArrayContains(arrCur, txt) Then
                
                    ' ... nor the new proposed list then add it to the new proposed list
                    If Not ArrayContains(arrNew, txt) Then ArrayAdd arrNew, txt
                
                End If
            
            Else
                ' Record that we have blank cells
                bBlank = True
            End If
            
        Next c
        
        ' Process blank options
        ' If we're not currently selecting for blanks ...
        ' ... and there are blanks ...
        ' ... then filter for blanks in new selection
        If (Not arrCur(UBound(arrCur)) = "=" And bBlank) Then ArrayAdd arrNew, "="
    
    End If
    
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' APPLY NEW FILTER
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Select Case UBound(arrNew)
        Case 0:
            MsgBox "Didn't find any values to invert"
            Exit Sub
        Case 1:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew(1)
        Case 2:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew(1), _
                Criteria2:=arrNew(2), _
                Operator:=xlOr
        Case Else:
            af.Range.AutoFilter _
                Field:=i, _
                Criteria1:=arrNew, _
                Operator:=xlFilterValues
    End Select

End Sub

Private Sub ArrayAdd(ByRef a As Variant, item As Variant)

Dim i As Integer

    If IsEmpty(a) Then
        i = 1
        ReDim a(1 To i)
    Else
        i = UBound(a) + 1
        ReDim Preserve a(1 To i)
    End If
    
    a(i) = item

End Sub

Private Function ArrayContains(a As Variant, item As Variant) As Boolean

Dim i As Integer

    If IsEmpty(a) Then
        ArrayContains = False
        Exit Function
    End If
    
    For i = LBound(a) To UBound(a)
        If a(i) = item Then
            ArrayContains = True
            Exit Function
        End If
    Next i
    
    ArrayContains = False

End Function

' Used to find the menu IDs
Private Sub ListMenuInfo()

Dim row As Integer
Dim Menu As CommandBarControl
Dim MenuItem As CommandBarControl
Dim SubMenuItem As CommandBarControl

    row = 1
    On Error Resume Next
    For Each Menu In CommandBars("cell").Controls
        For Each MenuItem In Menu.Controls
            For Each SubMenuItem In MenuItem.Controls
                cells(row, 1) = Menu.Caption
                cells(row, 2) = Menu.ID
                cells(row, 3) = MenuItem.Caption
                cells(row, 4) = MenuItem.ID
                cells(row, 5) = SubMenuItem.Caption
                cells(row, 6) = SubMenuItem.ID
                row = row + 1
            Next SubMenuItem
        Next MenuItem
    Next Menu
    
End Sub

слэн,  
я вчера поковырялся с этим немного. Если условие представлено в виде criteria1, criteria2, его можно инвертировать в том же виде, например  
=a ИЛИ =b -> <>a И <>b  
>a И <=b -> <=a ИЛИ >b  

  А со списком есть тонкость. Если на таблицу наложен фильтр только в одном столбце, это действительно работает — составить коллекцию (dictionary) уникальных, исключить из нее элементы из массива Criteria1, применить фильтр с  
Criteria1:=dictionary.keys.  
Но если на таблицу наложен фильтр в других столбцах, такой метод может давать «лишние» элементы, которые скрыты другими фильтрами. И в этом случае после применения фильтра ничего не отображается. Я на этом остановился вчера.  
Видимо, после сохранения массива Criteria1 надо снимать фильтр с этого столбца и составлять коллекцию из уникальных ВИДИМЫХ элементов, потом по этой же схеме.  

  Да, еще для 2007 надо предусмотреть работу с автофильтрами в таблицах (Listobjects).  
Сейчас некогда, а задачка в общем интересная. Особенно при одновременной инверсии условия в нескольких столбцах ;)

Содержание

  1. Как сделать инверсию в excel?
  2. Процедура транспонирования
  3. Способ 1: специальная вставка
  4. Способ 2: применение функции
  5. Помогла ли вам эта статья?
  6. Инверсия цвета
  7. Как инвертировать выделение?
  8. POST SCRIPTUM
  9. Excel фильтр инвертировать выделение
  10. Как легко отменить выбор выбранных диапазонов в Excel?
  11. Обратный выбор в Excel с VBA
  12. Обратный выбор в Excel с помощью Kutools for Excel
  13. Фильтрация данных в Excel
  14. Автофильтр
  15. Варианты фильтрации данных
  16. Отмена фильтрации
  17. Срезы
  18. Создание срезов
  19. Форматирование срезов
  20. Расширенный фильтр
  21. Задание условий фильтрации

Как сделать инверсию в excel?

Иногда встречаются ситуации, когда требуется перевернуть таблицу, то есть, поменять строки и столбцы местами. Конечно, можно полностью перебить все данные, как вам нужно, но это может занять значительное количество времени. Далеко не всем пользователям Excel известно о том, что в данном табличном процессоре имеется функция, которая поможет автоматизировать эту процедуру. Давайте изучим подробно, как строки сделать столбцами в Excel.

Процедура транспонирования

Смена местами столбцов и строчек в Экселе называется транспонированием. Выполнить данную процедуру можно двумя способами: через специальную вставку и с применением функции.

Способ 1: специальная вставка

Выясним, как транспонировать таблицу в Excel. Транспонирование с помощью специальной вставки является самым простым и популярным видом переворота табличного массива у пользователей.

  1. Выделяем всю таблицу курсором мышки. Кликаем по ней правой кнопкой. В появившемся меню выбираем пункт «Копировать» или просто жмем на клавиатуре сочетание Ctrl+C.
  2. Становимся на том же или на другом листе на пустую ячейку, которая должна будет стать верхней левой ячейкой новой копируемой таблицы. Кликаем по ней правой кнопкой мыши. В контекстном меню переходим по пункту «Специальная вставка…». В появившемся дополнительном меню выбираем пункт с таким же наименованием.
  3. Открывается окно настройки специальной вставки. Устанавливаем галочку напротив значения «Транспонировать». Жмем на кнопку «OK».

Как видим, после этих действий исходная таблица была скопирована в новое место, но уже с перевернутыми ячейками.

Затем, можно будет удалить первоначальную таблицу, выделив её, кликнув курсором, и в появившемся меню выбрав пункт «Удалить…». Но можно этого и не делать, если она не будет вам мешать на листе.

Способ 2: применение функции

Второй способ переворачивания в Экселе предполагает применения специализированной функции ТРАНСП.

  1. Выделяем область на листе, равную по вертикальному и горизонтальному диапазону ячеек исходной таблице. Кликаем по значку «Вставить функцию», размещенному слева от строки формул.
  2. Открывается Мастер функций. В списке представленных инструментов ищем наименование «ТРАНСП». После того, как нашли, выделяем и жмем на кнопку «OK».
  3. Открывается окно аргументов. У данной функции только один аргумент – «Массив». Ставим курсор в его поле. Вслед за этим, выделяем всю таблицу, которую хотим транспонировать. После того, как адрес выделенного диапазона записан в поле, жмем на кнопку «OK».
  4. Ставим курсор в конец строки формул. На клавиатуре набираем сочетание клавиш Ctrl+Shift+Enter. Это действие нужно для того, чтобы данные корректно были преобразованы, так как мы имеем дело не с одной ячейкой, а с целым массивом.
  5. После этого программа выполняет процедуру транспонирования, то есть меняет в таблице столбцы и строки местами. Но перенос был сделан без учета форматирования.
  6. Форматируем таблицу так, чтобы она имела приемлемый вид.

Особенностью данного способа транспонирования, в отличие от предыдущего, является то, что изначальные данные удалять нельзя, так как это приведет к удалению транспонированного диапазона. Более того, любые изменения первичных данных приведут к такому же изменению их в новой таблице. Поэтому, этот способ особенно хорош для работы со связанными таблицами. В то же время, он существенно сложнее первого варианта. Кроме того, при использовании данного способа необходимо сохранять исходник, что не всегда является оптимальным решением.

Мы выяснили, как поменять местами столбцы и строки в Excel. Существует два основных способа перевернуть таблицу. Каким из них воспользоваться зависит от того, планируете ли вы применение связанных данных или нет. Если таких планов не имеется, то рекомендуется использовать первый вариант решения поставленной задачи, как более простой.

Мы рады, что смогли помочь Вам в решении проблемы.

Задайте свой вопрос в комментариях, подробно расписав суть проблемы. Наши специалисты постараются ответить максимально быстро.

Помогла ли вам эта статья?

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

Да только у меня с этим выделением ничего не получалось и я не понимал, что я делаю не так. Я выделял ей участки фона, а потом пытался перенести нужный мне объект на другую вкладку. Ага, как же. Вместо этого у меня двигалась фоновая часть, а мой объект стоял как вкопанный. Тогда я просто не знал, что такое инверсия в фотошопе, и то, что с помощью нее можно упростить некоторые моменты.

Что такое инверсия по сути? Это изменение какого-либо свойства в совершенно противоположную сторону. например, если мы сделаем инверсию цветов на фотографии, то получим негатив. А если мы выделим объект и инвертируем выделение, то выделено будет всё, кроме объекта. Суть ясна? Хотя давайте лучше рассмотрим на живом примере, как сделать инверсию в фотошопе…

Инверсия цвета

Под этим определением понимается замена цвета и яркости на противоположные значения. Был белый цвет, а станет черным, и т.д. Мы уже с вами применяли это свойство, когда я рассказывал вам, как сделать рисунок из фото в фотошопе, так что можете посмотреть как пример использования. В одном моменте там нужно было инвертировать цвета, но сейчас мы освежим нашу память и вспомним как это делается, благодаря этому милому ежику.

Тут никаких премудростей нет. Вам всего лишь надо будет выбрать в верхнем меню пункт «Изображение» — «Коррекция» — «Инверсия». Либо вы просто можете нажать комбинацию клавиш Ctrl+I. Это даже проще и я вам действительно рекомендую пользоваться горячими клавишами.

Смотрим, во что превратилась наша фотка. Клёво, да? Белый фон стал черным, а сам наш колючий друг стал негативным (ну в смысле не злым, а…ну вы поняли).

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

Ну а уж этой функцией приходится пользоваться просто постоянно, особенно при выделении объектов с помощью быстрой маски или волшебной палочки. Это может нам понадобиться, когда мы захотим перенести какой-то элемент на другое изображение, либо же сменить фон для этого элемента, и еще куча всего разного.

  1. Давайте выберем какой-нибудь изображение и выделим его, например с помощью режима быстрой маски. Выберите этот режим, затем кисть, после чего начинайте закрашивать нашего ежика.
  2. Так, теперь давайте уберем маску. Что мы здесь видим? А видим мы то, что выделился не еж, а фон вокруг него, и если мы попытаемся переместить колючую животинку куда-нибудь, то выйдет у нас ай-ай-ай как нехорошо. На нас ругнутся, что мы не то пытаемся перетащить, так как выделилась область, а не объект. Вот эту область только и можно будет двигать.
  3. А теперь то нам и нужно инвертировать выделение, чтобы перекинуть его не на область вокруг животного, а на самого ежа. Сделать это просто. В меню нужно выбрать «Выделение» — «Инверсия», либо же нажать комбинацию клавиш SHIFT+CTRL+I.
  4. Опа. Теперь что мы видим? То, что пунктир поменялся и теперь он бегает вокруг ёжика. Ну а дальше мы уже можем взять инструмент «Перемещение» и двигать этот объект как хотим. Задача выполнена.

Если у вас после данной статьи остались какие-то непонятки, то я записал подробный видеоурок на эту тему.

Надеюсь, что тема для вас была более, чем понятна. Ну а если вы хотите за короткий срок изучить фотошоп, то я вам рекомендую смотреть именно этот курс. Здесь всё разложено по полочкам от простого к сложному, а главное, что всё понятно и доступно.

POST SCRIPTUM

Дорогие друзья. У меня для вас небольшое объявление. Я думаю, что вы помните как я рассказывал о том, как я собираюсь пойти на тренинг по социальным проектам от Дмитрия Сидаша и Александра Борисова? Так вот если вы вы еще думаете, то торопитесь, так как с 11.07.2016 года, т.е. послезавтра цена на оба тренинга повышается.

Если сейчас «Мастер контентных проектов» стоит 16990 рублей до результата, то послезавтра стоимость поднимается до 33980 рублей! «Мастер социальных проектов» также поднимается с 12990 рублей до 25980 рублей. Так что думаем. Кроме того, если вы решитесь, то у меня для вас есть небольшие бонусы, в том числе и скидка на обучение.

Ну а я с вами на сегодня прощаюсь. Не забывайте подписываться на обновления моего блога и делиться с друзьями статьей в социальных сетях. Удачи вам, увидимся в других статьях. Пока-пока.

Источник

Excel фильтр инвертировать выделение

Как легко отменить выбор выбранных диапазонов в Excel?

Предположим, вы выбрали некоторые определенные ячейки диапазона, и теперь вам нужно инвертировать выделение: отменить выбор выбранных ячеек и выбрать другие ячейки. См. Следующий снимок экрана:

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

Обратный выбор в Excel с VBA

Удивительный! Использование эффективных вкладок в Excel, таких как Chrome, Firefox и Safari!
Экономьте 50% своего времени и сокращайте тысячи щелчков мышью каждый день!

Использование макроса VBA упростит вам работу по отмене выбора в рабочей области активного листа.

Step1: Выберите ячейки, которые вы хотите перевернуть.

Step2: Удерживайте другой + F11 ключи в Excel, и он открывает Microsoft Visual Basic для приложений окно.

Step3: Нажмите Вставить > Модулии вставьте следующий макрос в окно модуля.

VBA для инвертирования выделений

Step4: Нажмите F5 ключ для запуска этого макроса. Затем отображается диалоговое окно, в котором вы можете выбрать некоторые ячейки, которые вам не нужно выбирать в результате. Смотрите скриншот:

Шаг 5: Нажмите OK, и выберите диапазон, в котором вы хотите отменить выбор, в другом всплывающем диалоговом окне. Смотрите скриншот:

Шаг 6: Нажмите OK. вы можете видеть, что выбор был отменен.

Ноты: Этот VBA также работает с пустым листом.

Обратный выбор в Excel с помощью Kutools for Excel

Вы можете быстро отменить любой выбор в Excel, Выбрать помощника по диапазону инструменты Kutools for Excel может помочь вам быстро отменить выбор в Excel. Этот трюк позволяет легко отменить любой выбор во всей книге.

Kutools for Excel включает в себя более 300 удобных инструментов Excel. Бесплатная пробная версия без ограничений в течение 30 дней. Получить сейчас.

Step1: Выберите ячейки, которые вы хотите перевернуть.

Step2: Нажмите Кутулс > Выберите Инструменты > Выбрать помощника по диапазону….

Step3В Выбрать помощника по диапазону диалоговое окно, проверьте Обратный выбор опцию.

Step4: Затем перетащите мышь, чтобы выбрать диапазон, в котором вы хотите отменить выбор. Когда вы отпустите кнопку мыши, выделенные ячейки будут отменены, а невыделенные ячейки будут сразу выбраны из диапазона.

Step5: А затем закройте Выбрать помощника по диапазону диалоговое окно.

Для получения более подробной информации о Выбрать помощника по диапазону, Пожалуйста, посетите Описание функции Select Range Helper.

Источник

Фильтрация данных в Excel

В Excel предусмотрено три типа фильтров:

  1. Автофильтр – для отбора записей по значению ячейки, по формату или в соответствии с простым критерием отбора.
  2. Срезы – интерактивные средства фильтрации данных в таблицах.
  3. Расширенный фильтр – для фильтрации данных с помощью сложного критерия отбора.

Автофильтр

  1. Выделить одну ячейку из диапазона данных.
  2. На вкладке Данные [Data] найдите группу Сортировка и фильтр [Sort&Filter].
  3. Щелкнуть по кнопке Фильтр [Filter] .

  1. В верхней строке диапазона возле каждого столбца появились кнопки со стрелочками. В столбце, содержащем ячейку, по которой будет выполняться фильтрация, щелкнуть на кнопку со стрелкой. Раскроется список возможных вариантов фильтрации.
  1. Выбрать условие фильтрации.

Варианты фильтрации данных

  • Фильтр по значению – отметить флажком нужные значения из столбца данных, которые высвечиваются внизу диалогового окна.
  • Фильтр по цвету – выбор по отформатированной ячейке: по цвету ячейки, по цвету шрифта или по значку ячейки (если установлено условное форматирование).
  • Можно воспользоваться строкой быстрого поиска
  • Для выбора числового фильтра, текстового фильтра или фильтра по дате (в зависимости от типа данных) выбрать соответствующую строку. Появится контекстное меню с более детальными возможностями фильтрации:
  1. При выборе опции Числовые фильтры появятся следующие варианты фильтрации: равно, больше, меньше, Первые 10… [Top 10…] и др.
  2. При выборе опции Текстовые фильтры в контекстном меню можно отметить вариант фильтрации содержит. , начинается с… и др.
  3. При выборе опции Фильтры по дате варианты фильтрации – завтра, на следующей неделе, в прошлом месяце и др.
  4. Во всех перечисленных выше случаях в контекстном меню содержится пункт Настраиваемый фильтр… [Custom…], используя который можно задать одновременно два условия отбора, связанные отношением И [And] – одновременное выполнение 2 условий, ИЛИ [Or] – выполнение хотя бы одного условия.

Если данные после фильтрации были изменены, фильтрация автоматически не срабатывает, поэтому необходимо запустить процедуру вновь, нажав на кнопку Повторить [Reapply] в группе Сортировка и фильтр на вкладке Данные.

Отмена фильтрации

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

Чтобы снять фильтр только с одного столбца, достаточно щелкнуть по кнопке со стрелочкой в первой строке и в контекстном меню выбрать строку: Удалить фильтр из столбца.

Чтобы быстро снять фильтрацию со всех столбцов необходимо выполнить команду Очистить на вкладке Данные

Срезы

Срезы – это те же фильтры, но вынесенные в отдельную область и имеющие удобное графическое представление. Срезы являются не частью листа с ячейками, а отдельным объектом, набором кнопок, расположенным на листе Excel. Использование срезов не заменяет автофильтр, но, благодаря удобной визуализации, облегчает фильтрацию: все примененные критерии видны одновременно. Срезы были добавлены в Excel начиная с версии 2010.

Создание срезов

В Excel 2010 срезы можно использовать для сводных таблиц, а в версии 2013 существует возможность создать срез для любой таблицы.

Для этого нужно выполнить следующие шаги:

    Выделить в таблице одну ячейку и выбрать вкладку Конструктор [Design].

  1. В диалоговом окне отметить поля, которые хотите включить в срез и нажать OK.

Форматирование срезов

  1. Выделить срез.
  2. На ленте вкладки Параметры [Options] выбрать группу Стили срезов [Slicer Styles], содержащую 14 стандартных стилей и опцию создания собственного стиля пользователя.

  1. Выбрать кнопку с подходящим стилем форматирования.

Чтобы удалить срез, нужно его выделить и нажать клавишу Delete.

Расширенный фильтр

Расширенный фильтр предоставляет дополнительные возможности. Он позволяет объединить несколько условий, расположить результат в другой части листа или на другом листе и др.

Задание условий фильтрации

  1. В диалоговом окне Расширенный фильтр выбрать вариант записи результатов: фильтровать список на месте [Filter the list, in-place] или скопировать результат в другое место [Copy to another Location].

  1. Указать Исходный диапазон [List range], выделяя исходную таблицу вместе с заголовками столбцов.
  2. Указать Диапазон условий [Criteria range], отметив курсором диапазон условий, включая ячейки с заголовками столбцов.
  3. Указать при необходимости место с результатами в поле Поместить результат в диапазон [Copy to], отметив курсором ячейку диапазона для размещения результатов фильтрации.
  4. Если нужно исключить повторяющиеся записи, поставить флажок в строке Только уникальные записи [Unique records only].

Источник

Предположим, вы выбрали некоторые определенные ячейки диапазона, и теперь вам нужно инвертировать выделение: отменить выбор выбранных ячеек и выбрать другие ячейки. См. Следующий снимок экрана:

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

Обратный выбор в Excel с VBA

Обратный выбор в Excel с помощью Kutools for Excel


стрелка синий правый пузырь Обратный выбор в Excel с VBA

Использование макроса VBA упростит вам работу по отмене выбора в рабочей области активного листа.

Step1: Выберите ячейки, которые вы хотите перевернуть.

Step2: Удерживайте другой + F11 ключи в Excel, и он открывает Microsoft Visual Basic для приложений окно.

Step3: Нажмите Вставить > Модулии вставьте следующий макрос в окно модуля.

VBA для инвертирования выделений

Sub InvertSelection()
'Updateby20140314
Dim rng As Range
Dim Rng1 As Range
Dim Rng2 As Range
Dim OutRng As Range
xTitleId = "KutoolsforExcel"
Set Rng1 = Application.Selection
Set Rng1 = Application.InputBox("Range1 :", xTitleId, Rng1.Address, Type:=8)
Set Rng2 = Application.InputBox("Range2", xTitleId, Type:=8)
For Each rng In Rng2
    If Application.Intersect(rng, Rng1) Is Nothing Then
        If OutRng Is Nothing Then
            Set OutRng = rng
        Else
            Set OutRng = Application.Union(OutRng, rng)
        End If
    End If
Next
OutRng.Select
End Sub
	

Step4: Нажмите F5 ключ для запуска этого макроса. Затем отображается диалоговое окно, в котором вы можете выбрать некоторые ячейки, которые вам не нужно выбирать в результате. Смотрите скриншот:

Шаг 5: Нажмите OK, и выберите диапазон, в котором вы хотите отменить выбор, в другом всплывающем диалоговом окне. Смотрите скриншот:

Шаг 6: Нажмите OK. вы можете видеть, что выбор был отменен.

Ноты: Этот VBA также работает с пустым листом.


стрелка синий правый пузырь Обратный выбор в Excel с помощью Kutools for Excel

Вы можете быстро отменить любой выбор в Excel, Выбрать помощника по диапазону инструменты Kutools for Excel может помочь вам быстро отменить выбор в Excel. Этот трюк позволяет легко отменить любой выбор во всей книге.

Kutools for Excel включает более 300 удобных инструментов Excel. Бесплатная пробная версия без ограничений в течение 30 дней. Получить сейчас.

Step1: Выберите ячейки, которые вы хотите перевернуть.

Step2: Нажмите Кутулс > Выберите Инструменты > Выбрать помощника по диапазону….

Step3В Выбрать помощника по диапазону диалоговое окно, проверьте Обратный выбор опцию.

Step4: Затем перетащите мышь, чтобы выбрать диапазон, в котором вы хотите отменить выбор. Когда вы отпустите кнопку мыши, выделенные ячейки будут отменены, а невыделенные ячейки будут сразу выбраны из диапазона.

Step5: А затем закройте Выбрать помощника по диапазону диалоговое окно.

Для получения более подробной информации о Выбрать помощника по диапазону, Пожалуйста, посетите Описание функции Select Range Helper.


Статьи по теме:

  • Выберите несмежные ячейки или диапазоны
  • Отменить выбор ячеек из выбранных диапазонов
  • Выбрать все ячейки с данными в выборках

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Содержание

  • 1 Процедура транспонирования
    • 1.1 Способ 1: специальная вставка
  • 2 Способ 2: применение функции
    • 2.1 Помогла ли вам эта статья?
  • 3 Инверсия цвета
  • 4 Как инвертировать выделение?
  • 5 POST SCRIPTUM

как сделать инверсию в excel

Иногда встречаются ситуации, когда требуется перевернуть таблицу, то есть, поменять строки и столбцы местами. Конечно, можно полностью перебить все данные, как вам нужно, но это может занять значительное количество времени. Далеко не всем пользователям Excel известно о том, что в данном табличном процессоре имеется функция, которая поможет автоматизировать эту процедуру. Давайте изучим подробно, как строки сделать столбцами в Excel.

Процедура транспонирования

Смена местами столбцов и строчек в Экселе называется транспонированием. Выполнить данную процедуру можно двумя способами: через специальную вставку и с применением функции.

Способ 1: специальная вставка

Выясним, как транспонировать таблицу в Excel. Транспонирование с помощью специальной вставки является самым простым и популярным видом переворота табличного массива у пользователей.

  1. Выделяем всю таблицу курсором мышки. Кликаем по ней правой кнопкой. В появившемся меню выбираем пункт «Копировать» или просто жмем на клавиатуре сочетание Ctrl+C.
  2. Становимся на том же или на другом листе на пустую ячейку, которая должна будет стать верхней левой ячейкой новой копируемой таблицы. Кликаем по ней правой кнопкой мыши. В контекстном меню переходим по пункту «Специальная вставка…». В появившемся дополнительном меню выбираем пункт с таким же наименованием.
  3. Открывается окно настройки специальной вставки. Устанавливаем галочку напротив значения «Транспонировать». Жмем на кнопку «OK».

как сделать инверсию в excel

Как видим, после этих действий исходная таблица была скопирована в новое место, но уже с перевернутыми ячейками.

как сделать инверсию в excel

Затем, можно будет удалить первоначальную таблицу, выделив её, кликнув курсором, и в появившемся меню выбрав пункт «Удалить…». Но можно этого и не делать, если она не будет вам мешать на листе.

как сделать инверсию в excel

Способ 2: применение функции

Второй способ переворачивания в Экселе предполагает применения специализированной функции ТРАНСП.

  1. Выделяем область на листе, равную по вертикальному и горизонтальному диапазону ячеек исходной таблице. Кликаем по значку «Вставить функцию», размещенному слева от строки формул.
  2. Открывается Мастер функций. В списке представленных инструментов ищем наименование «ТРАНСП». После того, как нашли, выделяем и жмем на кнопку «OK».
  3. Открывается окно аргументов. У данной функции только один аргумент – «Массив». Ставим курсор в его поле. Вслед за этим, выделяем всю таблицу, которую хотим транспонировать. После того, как адрес выделенного диапазона записан в поле, жмем на кнопку «OK».
  4. Ставим курсор в конец строки формул. На клавиатуре набираем сочетание клавиш Ctrl+Shift+Enter. Это действие нужно для того, чтобы данные корректно были преобразованы, так как мы имеем дело не с одной ячейкой, а с целым массивом.
  5. После этого программа выполняет процедуру транспонирования, то есть меняет в таблице столбцы и строки местами. Но перенос был сделан без учета форматирования.
  6. Форматируем таблицу так, чтобы она имела приемлемый вид.

как сделать инверсию в excel

Особенностью данного способа транспонирования, в отличие от предыдущего, является то, что изначальные данные удалять нельзя, так как это приведет к удалению транспонированного диапазона. Более того, любые изменения первичных данных приведут к такому же изменению их в новой таблице. Поэтому, этот способ особенно хорош для работы со связанными таблицами. В то же время, он существенно сложнее первого варианта. Кроме того, при использовании данного способа необходимо сохранять исходник, что не всегда является оптимальным решением.

Мы выяснили, как поменять местами столбцы и строки в Excel. Существует два основных способа перевернуть таблицу. Каким из них воспользоваться зависит от того, планируете ли вы применение связанных данных или нет. Если таких планов не имеется, то рекомендуется использовать первый вариант решения поставленной задачи, как более простой.

Мы рады, что смогли помочь Вам в решении проблемы.

Задайте свой вопрос в комментариях, подробно расписав суть проблемы. Наши специалисты постараются ответить максимально быстро.

Помогла ли вам эта статья?

Да Нет

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

Да только у меня с этим выделением ничего не получалось и я не понимал, что я делаю не так. Я выделял ей участки фона, а потом пытался перенести нужный мне объект на другую вкладку. Ага, как же. Вместо этого у меня двигалась фоновая часть, а мой объект стоял как вкопанный. Тогда я просто не знал, что такое инверсия в фотошопе, и то, что с помощью нее можно упростить некоторые моменты.

Что такое инверсия по сути? Это изменение какого-либо свойства в совершенно противоположную сторону. например, если мы сделаем инверсию цветов на фотографии, то получим негатив. А если мы выделим объект и инвертируем выделение, то выделено будет всё, кроме объекта. Суть ясна? Хотя давайте лучше рассмотрим на живом примере, как сделать инверсию в фотошопе…

Инверсия цвета

Под этим определением понимается замена цвета и яркости на противоположные значения. Был белый цвет, а станет черным, и т.д. Мы уже с вами применяли это свойство, когда я рассказывал вам, как сделать рисунок из фото в фотошопе, так что можете посмотреть как пример использования. В одном моменте там нужно было инвертировать цвета, но сейчас мы освежим нашу память и вспомним как это делается, благодаря этому милому ежику.

как сделать инверсию в excel

Тут никаких премудростей нет. Вам всего лишь надо будет выбрать в верхнем меню пункт «Изображение» — «Коррекция» — «Инверсия». Либо вы просто можете нажать комбинацию клавиш Ctrl+I. Это даже проще и я вам действительно рекомендую пользоваться горячими клавишами.

как сделать инверсию в excel

Смотрим, во что превратилась наша фотка. Клёво, да? Белый фон стал черным, а сам наш колючий друг стал негативным (ну в смысле не злым, а…ну вы поняли).

как сделать инверсию в excel

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

Ну а уж этой функцией приходится пользоваться просто постоянно, особенно при выделении объектов с помощью быстрой маски или волшебной палочки. Это может нам понадобиться, когда мы захотим перенести какой-то элемент на другое изображение, либо же сменить фон для этого элемента, и еще куча всего разного.

  1. Давайте выберем какой-нибудь изображение и выделим его, например с помощью режима быстрой маски. Выберите этот режим, затем кисть, после чего начинайте закрашивать нашего ежика. как сделать инверсию в excel
  2. Так, теперь давайте уберем маску. Что мы здесь видим? А видим мы то, что выделился не еж, а фон вокруг него, и если мы попытаемся переместить колючую животинку куда-нибудь, то выйдет у нас ай-ай-ай как нехорошо. На нас ругнутся, что мы не то пытаемся перетащить, так как выделилась область, а не объект. Вот эту область только и можно будет двигать.как сделать инверсию в excel
  3. А теперь то нам и нужно инвертировать выделение, чтобы перекинуть его не на область вокруг животного, а на самого ежа. Сделать это просто. В меню нужно выбрать «Выделение» — «Инверсия», либо же нажать комбинацию клавиш SHIFT+CTRL+Iкак сделать инверсию в excel
  4. Опа. Теперь что мы видим? То, что пунктир поменялся и теперь он бегает вокруг ёжика. Ну а дальше мы уже можем взять инструмент «Перемещение» и двигать этот объект как хотим. Задача выполнена. 

Если у вас после данной статьи остались какие-то непонятки, то я записал подробный видеоурок на эту тему.

Надеюсь, что тема для вас была более, чем понятна. Ну а если вы хотите за короткий срок изучить фотошоп, то я вам рекомендую смотреть именно этот курс. Здесь всё разложено по полочкам от простого к сложному, а главное, что всё понятно и доступно.

POST SCRIPTUM

Дорогие друзья. У меня для вас небольшое объявление. Я думаю, что вы помните как я рассказывал о том, как я собираюсь пойти на тренинг по социальным проектам от Дмитрия Сидаша и Александра Борисова? Так вот если вы вы еще думаете, то торопитесь, так как с 11.07.2016 года, т.е. послезавтра цена на оба тренинга повышается.

Если сейчас «Мастер контентных проектов» стоит 16990 рублей до результата, то послезавтра стоимость поднимается до 33980 рублей! «Мастер социальных проектов» также поднимается с 12990 рублей до 25980 рублей. Так что думаем. Кроме того, если вы решитесь, то у меня для вас есть небольшие бонусы, в том числе и скидка на обучение.

Ну а я с вами на сегодня прощаюсь. Не забывайте подписываться на обновления моего блога и делиться с друзьями статьей в социальных сетях. Удачи вам, увидимся в других статьях. Пока-пока.

С уважением, Дмитрий Костин.

Согласен, название статьи звучит страшно и не совсем понятно. Поэтому явно надо разъяснить поподробнее. Начну с предыстории. На одном форуме форумчанин задал вопрос — «Как инвертировать 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

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

Результатом работы данного макроса является выбор всех ячеек текущего листа, которые не были выбраны до его запуска. Т.е. другими словами макрос инвертирует выборку (Selection).
Работает со всеми ячейками листа, поддерживается выделение нескольких несмежных диапазонов.
Достаточно выбрать диапазон ячеек, информацию и форматирование которых необходимо сохранить, и запустить макрос InvertSelection.
В результате его работы выбранными окажутся все ячейки, кроме указанных (выбранных). А уж с выбранным диапазоном можно делать что угодно стандартными средствами Ёкселя: форматировать/расформатировать ячейки, стирать данные, …
Макрос очень удобен для удаления лишней информации с листа.
Часто применяется мною для обработки чужих «коряво» составленных документов, в которых встречается, например, заливка цветом или установка границ целиком у столбца или строки. Такое «форматирование» либо просто мешает зрительному восприятию, либо при выводе на печать даёт огромное количество лишних лестов. А уж если кем-то «особо одарённым» целиком по столбцу применено условное форматирование, да ещё и с вычисляемым по формуле результатом… Тогда ещё и файл «распухает», и «тормоза» появляются…
[vba]

Код

Sub InvertSelection2()
      ‘—————————————————————————————
      ‘ Procedure : InvertSelection
      ‘ Author    : :)
      ‘ URL       : http://www.planetaexcel.ru/forum.php?thread_id=14008
      ‘ DateTime  : 04.03.2010   00:17
      ‘ Purpose   : инвертировать Selection
      ‘ Notes     : Работает со всеми ячейками листа, поддерживается выделение нескольких несмежных диапазонов.
      ‘ Notes     : в процессе работы создаётся временная КНИГА, поэтому работает в том числе и при защищенной структуре книги
      ‘—————————————————————————————
      If Not TypeName(Selection) = «Range» Then Exit Sub
      With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With
      Dim selAddr As String: selAddr = Selection.Address
      With ActiveSheet
         With Workbooks.Add
            With ActiveSheet
               .Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:=»0″
               .Range(selAddr).ClearFormats
               selAddr = .Cells.SpecialCells(xlCellTypeAllFormatConditions).Address
            End With
            .Close False
         End With
         .Range(selAddr).Select
      End With
      With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With
End Sub

[/vba]

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Excel фильтр значений по датам
  • Excel фильтр выводит не все значения
  • Excel фильтр для чисел
  • Excel фильтр выбранных строк
  • Excel фильтр для повторения

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии