Bob有一个工作表,其成员名称在左侧的左侧,而一年中的月份则在顶部。在网格的每个单元格中,他输入成员参加会议的日期。鲍勃(Bob)正在寻找一种方法,以一目了然地告诉谁尚未与谁见面。

有几种方法可以解决此问题。如果表设计灵活,则可以通过更改表的布局方式来“简化”事情。您不必将月份放在各个列上,只需将每个列作为会议日期即可。

然后,每个单元格可以包含某种指示符(数字或字符),以指示该人在该特定日期参加了会议。找出谁没有遇到谁是一个相对容易的过程:

。选择要检查的关键成员,然后将其移动到数据表的顶部。

。在关键成员行上水平对数据表进行排序,因此关键成员参加的所有会议都在最左侧的列中。

。在前三个会议日期对除主要成员以外的所有人进行垂直排序。现在,在这三个会议中与主要成员会面的每个人都位于数据表的顶部,在主要成员的正下方。

。向下移动数据表,选择尚未与主要成员会面的所有人,然后在接下来的三个会议日期进行排序。

。重复步骤3和4,直到所有会议日期都已排序。

。数据表底部剩下的每个人(在步骤3和4中未选择的人)都从未遇到关键成员。

如果您不能更改表的格式,则需要一个宏解决方案。宏中可以使用许多方法,但是以下方法可能是最直接的:

Sub PeopleNotMet()

Dim rTable As Range     Dim rOutput As Range     Dim iCols As Integer     Dim iCol As Integer     Dim iRows As Integer     Dim iRow As Integer     Dim iCompRow As Integer     Dim sNotMet As String     Dim sMet As String

Set rTable = Worksheets("Sheet1").Range("A1").CurrentRegion     Set rOutput = Worksheets("Sheet2").Range("a1")

sNotMet = "X"

sMet = ""



Application.ScreenUpdating = False     With rTable         iRows = .Rows.Count         iCols = .Columns.Count                  .Columns(1).Copy         With rOutput             .PasteSpecial             .PasteSpecial Transpose:=True             Application.CutCopyMode = False             Range(.Offset(1, 1), .Offset(iRows - 1, _               iRows - 1)).Value = sNotMet             Range(.Offset(1, 1), .Offset(iRows - 1, _               iRows - 1)).HorizontalAlignment = xlCenter         End With     End With     With rTable.Cells(1)

For iRow = 1 To iRows - 1             For iCol = 1 To iCols - 1                 For iCompRow = 1 To iRows - 1                     If Not (IsEmpty(.Offset(iRow, iCol))) Then                         If Not (IsEmpty(.Offset(iCompRow, iCol))) Then                             If .Offset(iRow, iCol).Value = _                               .Offset(iCompRow, iCol).Value Then _                               rOutput.Offset(iRow, iCompRow).Value = sMet                         End If                     End If                 Next             Next         Next     End With

Set rTable = Nothing     Set rOutput = Nothing     Application.ScreenUpdating = True End Sub

这个宏假设了几件事。首先,假设Bob的原始数据表在Sheet1上,从单元格A1开始。第二,假定“谁没有与谁见面”表应该在Sheet2上,从单元格A1开始。如果这些假设是正确的,则在运行宏时,在Sheet2上创建的表在左侧下方显示名称,在顶部上方显示名称。相交的单元将不包含任何内容(表示人们已经见面)或大写X(表示他们尚未见面)。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(248)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本: