|
楼主 |
发表于 2024-3-17 12:02
|
显示全部楼层
我把框美化一点点,写了点注释重新贴出来,有需要的教务老师方便以后使用:- Private Sub Worksheet_SelectionChange(ByVal T As Range)
- '这是一个事件处理程序,它会在工作表中选择发生更改时触发。它接受一个参数T,表示选定的范围
- ActiveWindow.Zoom = 100 '这行代码将活动窗口的缩放设置为100%
- If T.Row > 4 Then '检查选定的单元格是否在第5行之后,前5行是标题
- If T.Count > 1 Then End '如果选定的范围包含多个单元格,则终止执行代码
- r = Cells(Rows.Count, 3).End(xlUp).Row - 14 '确定列C中最后一个非空单元格所在的行,然后减去14。是在计算数据区域的最后一行
- y = Cells(3, Columns.Count).End(xlToLeft).Column '这行代码确定行3中最后一个非空单元格所在的列,然后存储该列的列号
- x = T.Row: w = T.Column '将选定范围的行号和列号分别存储在变量x和w中
- If x > r Or w > y Then ListBox1.Visible = False: End '如果选定的范围在数据区域之外,则隐藏名为ListBox1的控件并终止执行代码
- 'MsgBox r '这行代码会显示一个消息框,其中包含变量r的值。r似乎是计算的数据区域的最后一行
-
- '嵌套的循环,用于创建一个字典对象d,其中存储了与选定单元格值不同的相邻单元格的数值数据。它在列中搜索与选定单元格相同的单元格值,并收集相邻单元格中的数值数据。
-
- If Not IsNumeric(T.Value) Or T.Value = "" Then End '***解决点击空白单元格也能弹窗的问题 '这行代码检查选定单元格的值是否为数值类型。如果不是,则立即结束代码的执行。
- Dim d As Object, dc As Object
- Set d = CreateObject("scripting.dictionary")
- Set dc = CreateObject("scripting.dictionary") '这两行代码创建了两个字典对象,分别用于存储不同的数据
- bj = Cells(3, w) '这行代码获取行3和列w处的单元格的值,并将其存储在变量bj中
-
- xq = Cells(4, w) '****xq为变量,对应点击单元格上方的星期几
-
- For j = 3 To y '这是一个循环,从列3开始,直到列y。y是列的最后一个列号
- If Cells(4, j) = xq Then '****循环中加入判断:星期那行有等于变量xq的就继续下面的代码(此段代码限定了下段代码的范围)
-
- If Cells(x, j) <> "" Then dc(Cells(x, j).Value) = "" '这行代码检查当前列中第x行是否为空。如果不为空,它将当前单元格的值作为键存储在字典对象dc中。这一步旨在收集选定行中所有非空单元格的值
-
- End If
- Next j
- For j = 3 To y '遍历所有列
- If Cells(3, j) = bj Then '检查第3行的当前列是否与之前存储在bj变量中的值相同
- For i = 6 To r '从第6行到r行。r是之前计算出来的数据区域的最后一行
- If i <> x Then
- If Cells(i, j) <> "" Then '在内部循环中,首先检查i行和当前列的单元格是否为空。如果不为空,它将检查这个单元格的值是否与选定单元格的值不同,并且这个值是否为数值类型
- If Cells(i, j) <> T.Value Then
- If IsNumeric(Cells(i, j)) Then
- If Not dc.exists(Cells(i, j).Value) Then
- d(Cells(i, j).Value) = ""
- End If
- End If
- End If
- End If
- End If
- Next i
- End If
- Next j
- If d.Count = 0 Then End
- [ar1:cp1] = "" '****清空上次记录,以便下行代码重新记录
- [ar1].Resize(1, d.Count) = d.keys
- With ListBox1
- .Width = T.Width * 1.2 '****列表框宽度
- .Height = T.Height * UBound(d.keys) * 0.95 '****列表框高度
- .Top = T.Top + 15
- .Left = T.Left + 20
- .List = d.keys
- .Visible = True
- End With
- End If
- End Sub
复制代码 |
|