我目前无法通过VBA脚本对齐结果集。
Sheet2
是输入/修改数据的位置。 Sheet1
只是界面并从Sheet2
抓取数据并显示计数。 Sheet2
Worksheet_Change
事件处理程序是脚本更新Sheet1!B:B
中的计数的地方,其中Sheet2!A:A
中的值已更改。
目前,当Sheet1!A:A
中的公式复制Sheet2!A:A
的相应行中的值时,脚本可以正常运行:
第一组图像显示首次输入某些值Sheet2
后的初始状态。第二组显示更改Sheet2!A2
和Sheet2!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
获取值。这会导致跳过某些行。不幸的是,这导致一些计数错位:
如您所见,更改Sheet2!A5
时,Sheet1!B5
中的计数会更新,而不是Sheet1!B3
中的计数。
如何使用Sheet1
中的值正确排列脚本?
答案 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
部分。
对于您提供的示例,这两张纸最初将如下所示:
然后可以使用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
中的额外列的情况下离开。