每次切换时,基于动态范围的公式结果都会发生变化 sheet Excel VBA
Dynamic range based formula results' change every time I switch sheet Excel VBA
我编写了一个函数,该函数应该获取特定列的特定部分,然后通过将列的每个条目与留给它的单元格的值进行比较,计算特定条件出现的次数遇见了。
一切正常,除了一个问题..如果我在 "Sheet1" 上使用函数,得到一个结果,然后切换到 "Sheet2" 并在 sheet 上使用函数,它会改变结果"Sheet1" 出于某种原因。
Function countStable(rangeObj As Range) 'rangeObj that being passed is a namedRange(Synamic Range)
Application.Volatile
ActiveSheet.Select
Dim entry, preEntryVal, entryVal As Variant
Dim counters(1 To 5, 1 To 1) As Integer
Dim cStable, cIncreased, cDecreased, cAdded, cLost
cStable = 0
cIncreased = 0
cDecreased = 0
cAdded = 0
cLost = 0
Set rangeObj = Intersect(rangeObj, rangeObj.Parent.UsedRange)
For Each entry In rangeObj
If Not IsEmpty(entry.Value) And Not IsEmpty(ActiveSheet.Range("A" & entry.Row)) Then
entryVal = entry.Value
preEntryVal = ActiveSheet.Cells(entry.Row, entry.Column - 1).Value
If entryVal = preEntryVal Then
cStable = cStable + 1
ElseIf InStr(entryVal, "-") And Not (InStr(preEntryVal, "-")) Then
cLost = cLost + 1
ElseIf Not InStr(entryVal, "-") And InStr(preEntryVal, "-") Then
cAdded = cAdded + 1
ElseIf preEntryVal < entryVal Then
cDecreased = cDecreased + 1
ElseIf preEntryVal > entryVal Then
cIncreased = cIncreased + 1
End If
End If
counters(1, 1) = cStable
counters(2, 1) = cIncreased
counters(3, 1) = cDecreased
counters(4, 1) = cAdded
counters(5, 1) = cLost
Next
countStable = counters
End Function
如代码中所述,作为参数传递的 rangeObj 是在名称管理器中定义的,它基于 Offset 公式。
我知道它会因为动态范围而改变两个 sheet 上的值,但不确定为什么……我不想改变它。
请帮忙?
在几个地方,代码引用了 ActiveSheet。无论函数出现在何处,它都会反映任何 sheet 处于活动状态的值。您需要改用提供的范围对象的父对象。
Dim currentSheet as Worksheet
Set currentSheet = rangeObj.Parent
然后,在方法中搜索ActiveSheet并替换为currentSheet。
我编写了一个函数,该函数应该获取特定列的特定部分,然后通过将列的每个条目与留给它的单元格的值进行比较,计算特定条件出现的次数遇见了。 一切正常,除了一个问题..如果我在 "Sheet1" 上使用函数,得到一个结果,然后切换到 "Sheet2" 并在 sheet 上使用函数,它会改变结果"Sheet1" 出于某种原因。
Function countStable(rangeObj As Range) 'rangeObj that being passed is a namedRange(Synamic Range)
Application.Volatile
ActiveSheet.Select
Dim entry, preEntryVal, entryVal As Variant
Dim counters(1 To 5, 1 To 1) As Integer
Dim cStable, cIncreased, cDecreased, cAdded, cLost
cStable = 0
cIncreased = 0
cDecreased = 0
cAdded = 0
cLost = 0
Set rangeObj = Intersect(rangeObj, rangeObj.Parent.UsedRange)
For Each entry In rangeObj
If Not IsEmpty(entry.Value) And Not IsEmpty(ActiveSheet.Range("A" & entry.Row)) Then
entryVal = entry.Value
preEntryVal = ActiveSheet.Cells(entry.Row, entry.Column - 1).Value
If entryVal = preEntryVal Then
cStable = cStable + 1
ElseIf InStr(entryVal, "-") And Not (InStr(preEntryVal, "-")) Then
cLost = cLost + 1
ElseIf Not InStr(entryVal, "-") And InStr(preEntryVal, "-") Then
cAdded = cAdded + 1
ElseIf preEntryVal < entryVal Then
cDecreased = cDecreased + 1
ElseIf preEntryVal > entryVal Then
cIncreased = cIncreased + 1
End If
End If
counters(1, 1) = cStable
counters(2, 1) = cIncreased
counters(3, 1) = cDecreased
counters(4, 1) = cAdded
counters(5, 1) = cLost
Next
countStable = counters
End Function
如代码中所述,作为参数传递的 rangeObj 是在名称管理器中定义的,它基于 Offset 公式。 我知道它会因为动态范围而改变两个 sheet 上的值,但不确定为什么……我不想改变它。
请帮忙?
在几个地方,代码引用了 ActiveSheet。无论函数出现在何处,它都会反映任何 sheet 处于活动状态的值。您需要改用提供的范围对象的父对象。
Dim currentSheet as Worksheet
Set currentSheet = rangeObj.Parent
然后,在方法中搜索ActiveSheet并替换为currentSheet。