计数器脚本导致未对齐的值

时间:2017-11-22 22:31:36

标签: excel vba excel-vba

我目前无法通过VBA脚本对齐结果集。

Sheet2是输入/修改数据的位置。 Sheet1只是界面并从Sheet2抓取数据并显示计数。 Sheet2 Worksheet_Change事件处理程序是脚本更新Sheet1!B:B中的计数的地方,其中Sheet2!A:A中的值已更改。

目前,当Sheet1!A:A中的公式复制Sheet2!A:A的相应行中的值时,脚本可以正常运行:

Sheet1 A Sheet2 ASheet1 B Sheet2 B

第一组图像显示首次输入某些值Sheet2后的初始状态。第二组显示更改Sheet2!A2Sheet2!A5后的结果。

这是剧本:

Option Explicit

Private Sub Worksheet_Change _
            ( _
                       ByVal Target As Range _
            )

  Const s_CheckColumn As String = "A:A"
  Const s_CountColumn As String = "B:B"

  If Intersect(Target, Range(s_CheckColumn)) Is Nothing Then Exit Sub

  Dim rngCell As Range
  For Each rngCell In Intersect(Target, Range(s_CheckColumn))
    With Worksheets("Sheet1").Range(s_CountColumn).Cells(rngCell.Row)
      .Value2 = IIf(.Value2 <> vbNullString, .Value2 + 1, IIf(rngCell.Value2 <> vbNullString, 0, vbNullString))
    End With
  Next rngCell

End Sub


但是,现在,我想使用Sheet2中的索引匹配公式从Sheet1!A:A获取值。这会导致跳过某些行。不幸的是,这导致一些计数错位:

Sheet1 C Sheet2 CSheet1 D Sheet2 D

如您所见,更改Sheet2!A5时,Sheet1!B5中的计数会更新,而不是Sheet1!B3中的计数。

如何使用Sheet1中的值正确排列脚本?

1 个答案:

答案 0 :(得分:1)

修改现有代码以使其符合新要求(即public class MainActivity extends AppCompatActivity { @BindView(R.id.username) private EditText username; @BindView(R.id.password) private EditText password; @BindView(R.id.login) private Button login; @BindView(R.id.reset) private Button reset; @BindView(R.id.exit) private Button exit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("Login App"); setContentView(R.layout.activity_main); } } 中的行不再需要与Sheet1中的相同编号行对应)的最简单方法是使用额外的Sheet2中的列,比如列Sheet1,其公式是C列中MATCH公式的INDEX-MATCH部分。

对于您提供的示例,这两张纸最初将如下所示:

Sheet1 Initial Sheet2 Initial

然后可以使用A中的行号来查找与Sheet1!C:C中已更改的单元格对应的Sheet1中的行(通过在行号中查找已更改的单元格的行) 。增加 行的Sheet2!A:A列会使计数正确对齐:

B


注意:
如果'============================================================================================ ' Module : <The appropriate sheet module> ' Version : 1.0.2 ' Part : 1 of 1 ' References : N/A ' Source : https://stackoverflow.com/a/47447013/1961728 '============================================================================================ Option Explicit Private Enum e_MatchType GreaterThan = -1 ExactMatch LessThan End Enum Private Sub Worksheet_Change _ ( _ ByVal Target As Range _ ) Const s_LogSheetName As String = "Sheet1" Const s_CheckColumn As String = "A:A" Const s_CountColumn As String = "B:B" Const s_MatchColumn As String = "C:C" Const s_InputColumn As String = "A:A" Const l_Error As String = "Error" If Intersect(Target, Range(s_InputColumn)) Is Nothing Then Exit Sub With Worksheets(s_LogSheetName) Dim rngCell As Range For Each rngCell In Intersect(Target, Range(s_InputColumn)) Dim varMatchingLogRow As Variant varMatchingLogRow = Application.Match(rngCell.Row, .Range(s_MatchColumn), e_MatchType.ExactMatch) If TypeName(varMatchingLogRow) <> l_Error Then If .Range(s_MatchColumn).Cells(varMatchingLogRow) = rngCell.Row Then With .Range(s_CountColumn).Cells(varMatchingLogRow) .Value2 = IIf(.Value2 <> vbNullString, .Value2 + 1, IIf(rngCell.Value2 <> vbNullString, 0, vbNullString)) End With End If End If Next rngCell End With End Sub 中的值 保证 是唯一的,或者在 Sheet2!A:A值更改是可以接受的>第一个 匹配Sheet2!A:A行,然后 可以在不使用Sheet1!A:A中的额外列的情况下离开。