vba 合并单元格的 Excel 过滤

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/49816515/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 10:57:18  来源:igfitidea点击:

Excel filtering for merged cells

excelexcel-vbaexcel-formulavba

提问by Andreea Dana Enache

I'm trying to make a calculation of hours worked for each employee on each project that he worked on. But i don't know how to select because the cells that are containing the name of the employee are merged like in the picture. And if i want to see on project no. 3 which are the employees that worked on, the Excel Filtering can't take the name "John" which corresponds only to project no.1. To be more clear, I need to know how the filtering will be made for cells A3 and A4. If i will unmerge the cells, John will be only on cell A2, and in fact he worked also on projects 2 & 3.

我正在尝试计算每个员工参与的每个项目的工作时间。但我不知道如何选择,因为包含员工姓名的单元格已合并,如图所示。如果我想在项目号上看到。3是工作的员工,Excel过滤不能取名字“约翰”,它只对应于1号项目。为了更清楚,我需要知道如何对单元格 A3 和 A4 进行过滤。如果我将取消合并单元格,约翰将只在单元格 A2 上,实际上他也在项目 2 和 3 上工作。

Thanks!

谢谢!

Excel screenshot

Excel截图

回答by Chronocidal

If you have a Merged Cell, and you attempt to Filter for it, you will only get the first row:
Rows with Merged Cells
Filtered Merged Cells only shows first row

如果您有一个合并单元格,并且您尝试对其进行过滤,您将只会得到第一行:
合并单元格的行
过滤后的合并单元格仅显示第一行

To fix this, you first need to start by creating your Merged Cells somewhere else, unmerge your filter-cells, and fill the values into all cells:
Table cells unmerged, merged cells on right

要解决此问题,您首先需要在其他地方创建合并单元格,取消合并过滤器单元格,然后将值填充到所有单元格中:
表格单元格未合并,右侧合并单元格

Then, you can Copy the merged cells, and Paste Special > Formats over the cells you wantto merge:
Copying the Merged Cells and using Paste Special to put format in data table
The Merged Cell formatting pasted in place

然后,您可以复制合并单元格,并粘贴>格式在你的细胞合并:
Copying the Merged Cells and using Paste Special to put format in data table
The Merged Cell formatting pasted in place

You can now delete your temporary merged cells, and when you filter you will get allrows for the merged cell:
enter image description here

您现在可以删除临时合并单元格,当您过滤时,您将获得合并单元格的所有行:
enter image description here

 
{EDIT}Here is a macro that will automatically apply the changes above to a specified range:

 
{EDIT}这是一个宏,它会自动将上述更改应用于指定范围:

Public Sub FilterableMergedCells()
    Dim WorkingRange As Range
SelectRange:
    Set WorkingRange = Nothing
    On Error Resume Next
    Set WorkingRange = Application.InputBox("Select a range", "Get Range", Type:=8)
    On Error GoTo 0
    'If you click Cancel
    If WorkingRange Is Nothing Then Exit Sub
    'If you select multiple Ranges
    If WorkingRange.Areas.Count > 1 Then
        MsgBox "Please select 1 continuous range only", vbCritical
        GoTo SelectRange
    End If

    Dim ScreenUpdating As Boolean, DisplayAlerts As Boolean, Calculation As XlCalculation
    ScreenUpdating = Application.ScreenUpdating
    DisplayAlerts = Application.DisplayAlerts
    Calculation = Application.Calculation

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual

    Dim WorkingCell As Range, MergeCell As Range, MergeRange As Range, OffsetX As Long, OffsetY As Long
    OffsetX = WorkingRange.Cells(1, 1).Column - 1
    OffsetY = WorkingRange.Cells(1, 1).Row - 1
    'Create temporary sheet to work with
    With Worksheets.Add
        WorkingRange.Copy .Cells(1, 1)
        'Loop through cells in Range
        For Each WorkingCell In WorkingRange.Cells
            'If is a merged cell
            If WorkingCell.MergeCells Then
                'If is the top/left merged cell in a range
                If Not Intersect(WorkingCell, WorkingCell.MergeArea.Cells(1, 1)) Is Nothing Then
                    Set MergeRange = WorkingCell.MergeArea
                    'Unmerge cells
                    MergeRange.MergeCells = False
                    'Replicate value to all cells in formerly merged area
                    For Each MergeCell In MergeRange.Cells
                        If WorkingCell.FormulaArray = vbNull Then
                            MergeCell.Formula = WorkingCell.Formula
                        Else
                            MergeCell.FormulaArray = WorkingCell.FormulaArray
                        End If
                    Next MergeCell
                    'Copy merge-formatting over old Merged area
                    .Cells(WorkingCell.Row - OffsetY, WorkingCell.Column - OffsetX).MergeArea.Copy
                    WorkingCell.PasteSpecial xlPasteFormats
                End If
            End If
        Next WorkingCell
        .Delete
    End With

    Set MergeRange = Nothing
    Set WorkingRange = Nothing

    Application.ScreenUpdating = ScreenUpdating
    Application.DisplayAlerts = DisplayAlerts
    Application.Calculation = Calculation
End Sub

回答by Vityata

Use Filter. It is smart enough to deal with the merged cells. E.g., if you have a filter like this:

使用Filter. 它足够聪明来处理合并的单元格。例如,如果您有这样的过滤器:

enter image description here

enter image description here

and you filter projects 2, 3 and 4 then you get this:

并过滤项目 2、3 和 4,然后您会得到:

enter image description here

enter image description here

which is quite ok.

这很好。