会议成员组合(Microsoft Excel)
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培训的来源。
本技巧(2304)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: