将目标限制到一系列不连续的单元格

我已经格式化了一个工作表,可以让我:

  • 双击一个空白单元格,背景颜色变成红色,并给它一个“Not Recvd”的值。
  • 再次双击它,并用“Partial”值变成橙色。
  • 再次双击它,并以“Recvd”值变绿。
  • 再次双击它,它会变成蓝色并带有“NA”值。
  • 再次双击它,它会回到空白。

我能够在教程和在线search的帮助下完成此任务。 我想向电子表格中添加更多function,但是无法find/计算出这些function。 需要插入到现有代码中的function是:

  1. 指定一个特定的单元格/范围(而不是工作表中的每个单元格)通过双击来更改颜色/值的能力,如上所述。 我需要指定120个单元格。
  2. 假设没有任何一个单元格是空白的,我需要插入一个方程式来计算不是蓝色/“NA”的120个单元的百分比是红色的/“Not Recvd”; 是橙色/“部分”; 绿色/“Recvd”。 这些百分比将位于同一张工作表上,我想知道如何指定特定的单元格/范围。

我希望看起来像这样:

Not Recvd 15% Partial 20% Recvd 65% 

以下是我目前使用的代码:

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) If Target.Interior.ColorIndex = xlNone Then Target.Value = " " Target.Interior.ColorIndex = 3 Target.Value = "Not Recvd" ElseIf Target.Interior.ColorIndex = 3 Then Target.Interior.ColorIndex = 45 Target.Value = "Partial" ElseIf Target.Interior.ColorIndex = 45 Then Target.Interior.ColorIndex = 4 Target.Value = "Recvd" ElseIf Target.Interior.ColorIndex = 4 Then Target.Interior.ColorIndex = 41 Target.Value = "N/A" ElseIf Target.Interior.ColorIndex = 41 Then Target.Interior.ColorIndex = xlNone Target.Value = " " End If Cancel = True End Sub 

我正在使用Windows XP和Excel 2003。

我不得不修复你的单元格区域中的一些拼写错误,但是我确定了它的重复模式,并将其分解为两个引用行和列的string。 我把它作为私有常量string放在声明区域(工作表代码表的顶部)。

 Private Const pcISECcols As String = "H:H,K:K,N:N,Q:Q,T:T,W:W" Private Const pcISECrows As String = "6:7,10:12,15:17,20:24,27:27,30:30,33:33,36:36,39:39,42:42,45:45,48:48,51:51,54:54,57:57" 

这些将用于定义Intersect ( Intersect方法 )调用中的范围对象,以查看是否应包含双击单元格。 当我跑Intersect(Range(pcISECcols), Range(pcISECrows)).Interior.ColorIndex = 10我想出了这个。

相交(目标,行,列)

虽然实际上是以144个单元格而不是120个单元格的forms出现的,但是从我们提供的内容来看,这是我最好的猜测,所以需要完成的任务是将双击单元格添加到相交函数中,以实现直stream滤波响应。

虽然我发现你的描述中“百分比位于AA22,AA23,AA24”有一些含糊不清的地方,但是我认为这些百分比是用AA22:AA24表示的, Z24。

 Option Explicit Private Const pcISECcols As String = "H:H,K:K,N:N,Q:Q,T:T,W:W" Private Const pcISECrows As String = "6:7,10:12,15:17,20:24,27:27,30:30,33:33,36:36,39:39,42:42,45:45,48:48,51:51,54:54,57:57" Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range(pcISECcols), Range(pcISECrows)) Is Nothing Then On Error GoTo Fìn Cancel = True Application.EnableEvents = False Dim iCNT As Long, rPCT As Range 'Debug.Print Intersect(Range(pcISECcols), Range(pcISECrows)).Count 'Debug.Print Intersect(Range(pcISECcols), Range(pcISECrows)).Address Select Case Target.Interior.ColorIndex Case xlNone Target.Interior.ColorIndex = 3 Target.Value = "Not Recvd" Case 3 Target.Interior.ColorIndex = 45 Target.Value = "Partial" Case 45 Target.Interior.ColorIndex = 4 Target.Value = "Recvd" Case 4 Target.Interior.ColorIndex = 41 Target.Value = "N/A" Case 41 Target.Interior.ColorIndex = xlNone Target.Value = vbNullString Case Else Target.Interior.Pattern = xlNone Target.Value = vbNullString End Select Range("AA22:AA24") = 0 With Intersect(Range(pcISECcols), Range(pcISECrows)) iCNT = .Count Debug.Print iCNT For Each rPCT In .Cells Select Case rPCT.Interior.ColorIndex Case 3 Range("AA22") = Range("AA22").Value2 + 1 Case 45 Range("AA23") = Range("AA23").Value2 + 1 Case 4 Range("AA24") = Range("AA24").Value2 + 1 Case 41 iCNT = iCNT - 1 Case Else 'do nothing End Select Next rPCT Debug.Print iCNT Range("AA22") = Range("AA22").Value2 / iCNT Range("AA23") = Range("AA23").Value2 / iCNT Range("AA24") = Range("AA24").Value2 / iCNT End With End If Fìn: Application.EnableEvents = True End Sub 

这应该是全部。 对于每个蓝色单元,不连续范围内的单元的计数递减,并且使用该计数来检索百分比,而不是所有单元。

如果您希望使用实际的工作表函数实现更广泛的百分比,则可以在整个非连续范围内实际使用创buildCOUNTIF公式。 对COUNTIF使用不连续的范围是困难的,但并非不可能。 AA2的公式是,

  =SUM(COUNTIF(INDIRECT({"H6:H7","H10:H12","H15:H17","H20:H24","H27","H30","H33","H36","H39","H42","H45","H48","H51","H54","H57","K6:K7","K10:K12","K15:K17","K20:K24","K27","K30","K33","K36","K39","K42","K45","K48","K51","K54","K57","Q6:Q7","Q10:Q12","Q15:Q17","Q20:Q24","Q27","Q30","Q33","Q36","Q39","Q42","Q45","Q48","Q51","Q54","Q57","N6:N7","N10:N12","N15:N17","N20:N24","N27","N30","N33","N36","N39","N42","N45","N48","N51","N54","N57","T6:T7","T10:T12","T15:T17","T20:T24","T27","T30","T33","T36","T39","T42","T45","T48","T51","T54","T57","W6:W7","W10:W12","W15:W17","W20:W24","W27","W30","W33","W36","W39","W42","W45","W48","W51","W54","W57"}), Z22))/144 

格式化为百分比,并填入AA24。