这是我写的剧本。我在一张大约610行的工作表上运行它,它需要花费很多时间才能给我输出,而且,每次我更改此范围内的a值内容后,我必须等待大约10-15秒。
Function csvRangeNew(myRange As Range)
Dim csvRangeOutput
Dim entry As Variant
For Each entry In myRange
If Not IsEmpty(entry.Value) Then
If entry.Value = "New" Then
If Not IsEmpty(Worksheets("wholelist").Range("A" & entry.Row)) Then
csvRangeOutput = csvRangeOutput & Worksheets("wholelist").Range("A" & entry.Row).Value & ","
End If
End If
End If
Next
csvRangeNew = Left(csvRangeOutput, Len(csvRangeOutput) - 1)
End Function
基本上,我要做的是,当我在Column" B"中设置单元格值时到" New",它会将它添加到以逗号分隔的列表中。
答案 0 :(得分:1)
在评论中说明Doug Coats,您正在处理列中的每个单元格。解决方案:将NSManagedObject
作为第一行放在函数中。
set myRange = intersect(myRange , myRange.parent.usedrange)
Intersect命令会将myRange截断为工作表的已用部分。
答案 1 :(得分:0)
我无法解决您的代码所做的事情(特别是为什么您说要跟踪B列中的更改但代码引用A列)或B列更改时如何触发它。看起来你似乎正试图将单元格区域放在“#34; new"已添加并将该范围添加到以逗号分隔的列表中,但范围是对象,因此您无法将它们添加到字符串中。
这是一种假设您尝试将其值已更改为" new"的单元格的地址添加的方法。以逗号分隔的列表。将此代码放在整个列表工作表模块中。逗号分隔列表将在公共变量csvRangeNew中提供。
请注意,这仅适用于在进行更改时保留正在运行的列表。在关闭工作簿之前需要保存csvRangeNew值,或者在打开工作簿时重新计算并重置它以保留现有值。
Option Explicit
Public csvRangeNew As String
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Address = "$B:$B") Then 'clearing or deleting column B
GetCsvRangeNew bClearRange:=True
ElseIf (Target.Column = 2) Then
If UCase(Target.Value) = "NEW" Then
csvRangeNew = GetCsvRangeNew(myRangeAddress:=Target.Address)
End If
End If
Debug.Print csvRangeNew
End Sub
Function GetCsvRangeNew(Optional myRangeAddress As String, _
Optional bClearRange As Boolean) As String
Static csvRangeOutput As String
If bClearRange Then csvRangeOutput = "": Exit Function
If (csvRangeOutput = "") Then
csvRangeOutput = myRangeAddress
Else
csvRangeOutput = csvRangeOutput & "," & myRangeAddress
End If
GetCsvRangeNew = csvRangeOutput
End Function