Согласен, название статьи звучит страшно и не совсем понятно. Поэтому явно надо разъяснить поподробнее. Начну с предыстории. На одном форуме форумчанин задал вопрос — «Как инвертировать 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), при помощи которой можно выбрать действие с инвертированным диапазоном: Выделить, Очистит все, Очистить форматы, Очистить значения. Немного поменяв код Вы сможете легко добавить другие действия над диапазоном.
Я задаю вопрос, на который я планирую ответить, чтобы я мог документировать эту проблему в долгосрочной перспективе. Более чем рад за других, чтобы внести другие предложения / исправления.
У меня часто возникает проблема в 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:
- Читайте о том, как создать свой Personal.xlsb
-
Вставьте этот код в объект ThisWorkbook вашего Personal (Разработчик -> Visual Basic -> дважды щелкните ThisWorkbook):
Private Sub Workbook_Open() Windows("Personal.xlsb").Visible = False Call AddToCellMenu End Sub
-
Вставьте обновленный код Джеймса в новый модуль внутри вашего 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
-
Все еще в вашем 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
Содержание
- 1 Процедура транспонирования
- 1.1 Способ 1: специальная вставка
- 2 Способ 2: применение функции
- 2.1 Помогла ли вам эта статья?
- 3 Инверсия цвета
- 4 Как инвертировать выделение?
- 5 POST SCRIPTUM
Иногда встречаются ситуации, когда требуется перевернуть таблицу, то есть, поменять строки и столбцы местами. Конечно, можно полностью перебить все данные, как вам нужно, но это может занять значительное количество времени. Далеко не всем пользователям Excel известно о том, что в данном табличном процессоре имеется функция, которая поможет автоматизировать эту процедуру. Давайте изучим подробно, как строки сделать столбцами в Excel.
Процедура транспонирования
Смена местами столбцов и строчек в Экселе называется транспонированием. Выполнить данную процедуру можно двумя способами: через специальную вставку и с применением функции.
Способ 1: специальная вставка
Выясним, как транспонировать таблицу в Excel. Транспонирование с помощью специальной вставки является самым простым и популярным видом переворота табличного массива у пользователей.
- Выделяем всю таблицу курсором мышки. Кликаем по ней правой кнопкой. В появившемся меню выбираем пункт «Копировать» или просто жмем на клавиатуре сочетание Ctrl+C.
- Становимся на том же или на другом листе на пустую ячейку, которая должна будет стать верхней левой ячейкой новой копируемой таблицы. Кликаем по ней правой кнопкой мыши. В контекстном меню переходим по пункту «Специальная вставка…». В появившемся дополнительном меню выбираем пункт с таким же наименованием.
- Открывается окно настройки специальной вставки. Устанавливаем галочку напротив значения «Транспонировать». Жмем на кнопку «OK».
Как видим, после этих действий исходная таблица была скопирована в новое место, но уже с перевернутыми ячейками.
Затем, можно будет удалить первоначальную таблицу, выделив её, кликнув курсором, и в появившемся меню выбрав пункт «Удалить…». Но можно этого и не делать, если она не будет вам мешать на листе.
Способ 2: применение функции
Второй способ переворачивания в Экселе предполагает применения специализированной функции ТРАНСП.
- Выделяем область на листе, равную по вертикальному и горизонтальному диапазону ячеек исходной таблице. Кликаем по значку «Вставить функцию», размещенному слева от строки формул.
- Открывается Мастер функций. В списке представленных инструментов ищем наименование «ТРАНСП». После того, как нашли, выделяем и жмем на кнопку «OK».
- Открывается окно аргументов. У данной функции только один аргумент – «Массив». Ставим курсор в его поле. Вслед за этим, выделяем всю таблицу, которую хотим транспонировать. После того, как адрес выделенного диапазона записан в поле, жмем на кнопку «OK».
- Ставим курсор в конец строки формул. На клавиатуре набираем сочетание клавиш Ctrl+Shift+Enter. Это действие нужно для того, чтобы данные корректно были преобразованы, так как мы имеем дело не с одной ячейкой, а с целым массивом.
- После этого программа выполняет процедуру транспонирования, то есть меняет в таблице столбцы и строки местами. Но перенос был сделан без учета форматирования.
- Форматируем таблицу так, чтобы она имела приемлемый вид.
Особенностью данного способа транспонирования, в отличие от предыдущего, является то, что изначальные данные удалять нельзя, так как это приведет к удалению транспонированного диапазона. Более того, любые изменения первичных данных приведут к такому же изменению их в новой таблице. Поэтому, этот способ особенно хорош для работы со связанными таблицами. В то же время, он существенно сложнее первого варианта. Кроме того, при использовании данного способа необходимо сохранять исходник, что не всегда является оптимальным решением.
Мы выяснили, как поменять местами столбцы и строки в Excel. Существует два основных способа перевернуть таблицу. Каким из них воспользоваться зависит от того, планируете ли вы применение связанных данных или нет. Если таких планов не имеется, то рекомендуется использовать первый вариант решения поставленной задачи, как более простой.
Мы рады, что смогли помочь Вам в решении проблемы.
Задайте свой вопрос в комментариях, подробно расписав суть проблемы. Наши специалисты постараются ответить максимально быстро.
Помогла ли вам эта статья?
Да Нет
Доброго всем субботнего денечка, мои дорогие друзья, товарищи и читатели. Вспомнилось мне тут, когда я только изучал фотошоп, то первое время ковырялся там самостоятельно. И наткнулся я на инструмент «Волшебная палочка», с помощью которого можно было круто выделять объекты.
Да только у меня с этим выделением ничего не получалось и я не понимал, что я делаю не так. Я выделял ей участки фона, а потом пытался перенести нужный мне объект на другую вкладку. Ага, как же. Вместо этого у меня двигалась фоновая часть, а мой объект стоял как вкопанный. Тогда я просто не знал, что такое инверсия в фотошопе, и то, что с помощью нее можно упростить некоторые моменты.
Что такое инверсия по сути? Это изменение какого-либо свойства в совершенно противоположную сторону. например, если мы сделаем инверсию цветов на фотографии, то получим негатив. А если мы выделим объект и инвертируем выделение, то выделено будет всё, кроме объекта. Суть ясна? Хотя давайте лучше рассмотрим на живом примере, как сделать инверсию в фотошопе…
Инверсия цвета
Под этим определением понимается замена цвета и яркости на противоположные значения. Был белый цвет, а станет черным, и т.д. Мы уже с вами применяли это свойство, когда я рассказывал вам, как сделать рисунок из фото в фотошопе, так что можете посмотреть как пример использования. В одном моменте там нужно было инвертировать цвета, но сейчас мы освежим нашу память и вспомним как это делается, благодаря этому милому ежику.
Тут никаких премудростей нет. Вам всего лишь надо будет выбрать в верхнем меню пункт «Изображение» — «Коррекция» — «Инверсия». Либо вы просто можете нажать комбинацию клавиш Ctrl+I. Это даже проще и я вам действительно рекомендую пользоваться горячими клавишами.
Смотрим, во что превратилась наша фотка. Клёво, да? Белый фон стал черным, а сам наш колючий друг стал негативным (ну в смысле не злым, а…ну вы поняли).
Как инвертировать выделение?
Ну а уж этой функцией приходится пользоваться просто постоянно, особенно при выделении объектов с помощью быстрой маски или волшебной палочки. Это может нам понадобиться, когда мы захотим перенести какой-то элемент на другое изображение, либо же сменить фон для этого элемента, и еще куча всего разного.
- Давайте выберем какой-нибудь изображение и выделим его, например с помощью режима быстрой маски. Выберите этот режим, затем кисть, после чего начинайте закрашивать нашего ежика.
- Так, теперь давайте уберем маску. Что мы здесь видим? А видим мы то, что выделился не еж, а фон вокруг него, и если мы попытаемся переместить колючую животинку куда-нибудь, то выйдет у нас ай-ай-ай как нехорошо. На нас ругнутся, что мы не то пытаемся перетащить, так как выделилась область, а не объект. Вот эту область только и можно будет двигать.
- А теперь то нам и нужно инвертировать выделение, чтобы перекинуть его не на область вокруг животного, а на самого ежа. Сделать это просто. В меню нужно выбрать «Выделение» — «Инверсия», либо же нажать комбинацию клавиш SHIFT+CTRL+I.
- Опа. Теперь что мы видим? То, что пунктир поменялся и теперь он бегает вокруг ёжика. Ну а дальше мы уже можем взять инструмент «Перемещение» и двигать этот объект как хотим. Задача выполнена.
Если у вас после данной статьи остались какие-то непонятки, то я записал подробный видеоурок на эту тему.
Надеюсь, что тема для вас была более, чем понятна. Ну а если вы хотите за короткий срок изучить фотошоп, то я вам рекомендую смотреть именно этот курс. Здесь всё разложено по полочкам от простого к сложному, а главное, что всё понятно и доступно.
POST SCRIPTUM
Дорогие друзья. У меня для вас небольшое объявление. Я думаю, что вы помните как я рассказывал о том, как я собираюсь пойти на тренинг по социальным проектам от Дмитрия Сидаша и Александра Борисова? Так вот если вы вы еще думаете, то торопитесь, так как с 11.07.2016 года, т.е. послезавтра цена на оба тренинга повышается.
Если сейчас «Мастер контентных проектов» стоит 16990 рублей до результата, то послезавтра стоимость поднимается до 33980 рублей! «Мастер социальных проектов» также поднимается с 12990 рублей до 25980 рублей. Так что думаем. Кроме того, если вы решитесь, то у меня для вас есть небольшие бонусы, в том числе и скидка на обучение.
Ну а я с вами на сегодня прощаюсь. Не забывайте подписываться на обновления моего блога и делиться с друзьями статьей в социальных сетях. Удачи вам, увидимся в других статьях. Пока-пока.
С уважением, Дмитрий Костин.
Доброго времени суток, Планетяне!
Хотелось бы оживить парочку родственных архивных тем:
Как расформатировать весь лист кроме выделенного диапазона?
и
Как без цикла инвертировать выделение?
— обе от Alex_ST.
Как я понял, без цикла можно обойтись только создавая лист, как
тут
показал Игорь — быстро, просто и надёжно.
В том числе, я остановил своё внимание на ещё 2х решениях: сбор диапазонов в Union циклом, как
тут
и
решение
от Дмитрия «The_Prist» Щербакова через массивы (в комментариях есть вариант от того же Alex_ST с созданием листа).
Собственно, задача сводиться к простому условию:
есть область rngBig, в которой есть область или области rngSmall
Вопрос:
как быстро и эффективно получить диапазон rngNew, состоящий из одной или более областей, rngBig исключая при этом входящие в него rngSmall? Может у кого-то есть новые свежие решения, способы или методы…
ВАЖНО!
Пример с цветами просто для наглядности. Считаем, что мы передаём в макрос rngBig и rngSmall (известные диапазоны) и они усечены до UsedRange листа, т.к. рассматривать выделение ВСЕГО листа (rngBig=Cells) за исключением rngSmall проще и быстрее реализовать созданием нового листа.
Интересны именно новые методы, отличные от описанных в шапке
Пока я лично для себя остановился на сборе циклом в Union…
Изменено: Jack Famous — 22.03.2018 12:38:37
Обратить выделение…
English (us) ⁄ Nederlands ⁄ Deutsch ⁄ Español ⁄ Français ⁄ Português do Brasil ⁄ Italiano ⁄ Русский ⁄ 中文(简体) ⁄ 日本語
С помощью этой утилиты вы можете обратить выделение.
Для этого необходимо выбрать диапазон и убрать текущее выделение. В результате вы получите выделенный фрагмент с новыми ячейками, но без первоначального выделенного фрагмента.
Это может быть полезно, например, когда вы хотите выделить большое количество ячеек за исключением нескольких. Эта утилита противоположна утилите «Отменить выделение ячеек…».
Additional keywords for this tool:
Обмен, снять флажок, отменить выбор
7 / 7 / 6 Регистрация: 02.04.2012 Сообщений: 321 |
|
1 |
|
Как выделить противоположные ячейки30.03.2017, 17:21. Показов 11582. Ответов 10
Добрый день! Напишите пожалуйста инструкцию, как в excel выделить противоположные ячейки уже выделенным ячейкам? Пример: У меня заполнены ячейки в диапазоне от: B1 до B36; Как это можно сделать, с помощью функционала excel?
0 |
5942 / 3154 / 698 Регистрация: 23.11.2010 Сообщений: 10,524 |
|
30.03.2017, 18:18 |
2 |
А почему они «противоположные», я так понимаю, что надо выделить оставшиеся ячейки?
0 |
7 / 7 / 6 Регистрация: 02.04.2012 Сообщений: 321 |
|
30.03.2017, 18:22 [ТС] |
3 |
Нет. Нужно снять выделение с ячеек: B3, B7, B11, B31 А выделить ячейки: B1,B2,B4-B6,B8-B10,B12-B30 То бишь выделить противоположные ячейки
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
30.03.2017, 18:57 |
4 |
В поисковике задайте Excel обратить выделение
0 |
7 / 7 / 6 Регистрация: 02.04.2012 Сообщений: 321 |
|
30.03.2017, 19:41 [ТС] |
5 |
Нашёл макрос который обращает выделение на все другие ячейки. Нашёл кучу примеров работы с выделением. Но не могу найти тот вариант, что мне нужен. Его цель, обратить выделение на ячейки столбца B, чтобы следующим шагом удалить строки с листа. Предполагается, что на листе останутся только те строки столбца B которые я выделил изначально.
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
30.03.2017, 21:11 |
6 |
Вы бы лучше пример показали и пояснили, почему вы выделяли ячейки, по какому критерию. Возможно задача решается проще, чем вы думаете.
0 |
7 / 7 / 6 Регистрация: 02.04.2012 Сообщений: 321 |
|
30.03.2017, 22:33 [ТС] |
7 |
Пример прикрепляю во вложении. На странице «Исходник»: На странице необходимый результат:
0 |
5942 / 3154 / 698 Регистрация: 23.11.2010 Сообщений: 10,524 |
|
30.03.2017, 22:49 |
8 |
РешениеКак вариант, можно это сделать расширенным фильтром
1 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
31.03.2017, 18:18 |
9 |
РешениеЕщё вариант — автофильтр, где критерием отбора будет содержит r
1 |
7 / 7 / 6 Регистрация: 02.04.2012 Сообщений: 321 |
|
31.03.2017, 22:56 [ТС] |
10 |
Этот вариант превосходен!
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
01.04.2017, 08:30 |
11 |
Решение Согласен не содержит r , а затем просто удалить полученные строки. это позволит вообще обойтись без копирования …
1 |
What do you do if you select a cell or area by mistake? In this post, we show you how to use the new Deselect feature in Microsoft Excel.
Microsoft Excel is packed with productivity shortcuts. For instance, there are many ways to select cells, a range of cells, and even the entire spreadsheet.
But what do you do if you select a cell or area by mistake? There’s no built-in way to remove that from the selection without deselecting the entire selection and starting over.
That is, until now. In this post, we’ll show you how to start using the new Deselect feature in Microsoft Excel which solves that exact problem.
How to Deselect Cells in Microsoft Excel
Selecting too many cells or highlighting the wrong range of cells is an easy mistake to make in Excel, and it’s both frustrating and time-consuming. That’s why Microsoft Excel introduced the Deselect tool. As of this writing, this feature is only available to Office 365 subscribers.
Here’s how you can deselect cells within a range of cells that are highlighted in three quick steps.
- Hold the Ctrl key.
- Click to deselect any cell or click and drag to deselect a range of cells within a selection.
- To reselect any of those cells, hold the Ctrl key again and reselect those cells.
Note that if a worksheet is protected, then you won’t be able to select cells or their contents. Also, the way to select cells hasn’t changed.
To select a range of contiguous cells: Click the first cell in the range, and then drag to the last cell. Alternatively, hold down Shift and use the arrow keys to extend the selection.
To select a bunch of non-contiguous cells: Select the first cell or range of cells, and then hold down Ctrl while you select the other cells or ranges.
Now, thanks to the Deselect feature you don’t have to cancel the entire selection if you don’t select the right cells. Update to the latest version of Office 365 and try this feature today.
Перейти к содержанию
На чтение 2 мин Просмотров 911 Опубликовано 07.04.2022
В Excel есть огромное количество полезных функций для работы с разными объемами данных.
К примеру, вы выделили лишний элемент и нужно отменить его выделение.
Раньше нельзя было сделать это (в ранних версиях), а сейчас — можно.
Я думаю это потому, что люди писали много отзывов и разработчики отреагировали.
Содержание
- Отменяем выделение
- Отменяем выделение определенных столбиков
- Как выделить диапазон ячеек
Отменяем выделение
Допустим, у нас есть такая табличка:
Наша задача — выделить все кроме столбиков с кварталами (Q1 и Q2).
Как это сделать?
Нужно выделить все, а потом исключить эти столбики так:
- Зажимаем CTRL и выделяем столбики, которые нужно исключить, отдельно.
Тоже самое и для тех элементов, которые вы случайно выделили. Просто зажмите CTRL и нажмите на лишнее.
Если лист защищен — вы не сможете выделить что-либо.
Отменяем выделение определенных столбиков
Бывают ситуации, когда вам нужно выделить весь лист, исключая какие-нибудь столбики.
Допустим, нам нужно выделить все кроме 5 и 9 столбика. Как это сделать?
Пошаговая инструкция:
- Для начала выделим все (CTRL + A);
- А теперь зажмите CTRL и нажмите на 5 и 9 столбики.
Как выделить диапазон ячеек
- С помощью мышки и левой кнопки. Просто зажмите её на той ячейке, с которой хотите начать и ведите мышь до той, на которой хотите закончить;
- А если нужно выделить какие-то конкретные ячейки или диапазоны, которые не находятся рядом, то, после выделения первой ячейки (или диапазона), зажмите CTRL и выделите второй. Так можно выделить сколько угодно ячеек (или диапазонов).
Я рад тому, что Excel дали нам возможность исключать какие-либо элементы из выделения. Это сохраняет нам кучу времени.
Надеюсь, эта статья оказалась полезной для вас!