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
این ماکرو چند چیز را فرض می کند. ابتدا، فرض میکند که جدول دادههای اصلی Bobs در Sheet1 است که از سلول A1 شروع میشود. دوم، فرض میکند که جدول "کسی با چه کسی ملاقات نکرده" باید در Sheet2 باشد که از سلول A1 شروع میشود. اگر این مفروضات درست باشند، وقتی ماکرو را اجرا میکنید، جدول ایجاد شده در Sheet2 نامها را در سمت چپ و نامها را در بالای صفحه نشان میدهد. سلول های متقاطع شامل هیچ چیز نیستند (به این معنی که افراد ملاقات کرده اند) یا X بزرگ (به این معنی که ملاقات نکرده اند).