Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每次切换工作表Excel VBA时,基于动态范围的公式结果都会发生变化_Excel_Vba_Excel Formula_Named Ranges - Fatal编程技术网

每次切换工作表Excel VBA时,基于动态范围的公式结果都会发生变化

每次切换工作表Excel VBA时,基于动态范围的公式结果都会发生变化,excel,vba,excel-formula,named-ranges,Excel,Vba,Excel Formula,Named Ranges,我编写了一个函数,该函数应该获取特定列的特定部分,然后通过将列的每个条目与留给它的单元格的值进行比较,计算满足特定条件的次数。 除了一个问题外,一切正常。。如果我使用Sheet1上的函数,得到一个结果,然后切换到Sheet2并使用此工作表上的函数,它会由于某种原因更改Sheet1上的结果 Function countStable(rangeObj As Range) 'rangeObj that being passed is a namedRange(Synamic Range) Ap

我编写了一个函数,该函数应该获取特定列的特定部分,然后通过将列的每个条目与留给它的单元格的值进行比较,计算满足特定条件的次数。 除了一个问题外,一切正常。。如果我使用Sheet1上的函数,得到一个结果,然后切换到Sheet2并使用此工作表上的函数,它会由于某种原因更改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是在名称管理器中定义的,它基于偏移量公式。 我知道由于动态范围的原因,它会更改两张图纸上的值,但不确定原因。。我不想改变它


请帮忙?

在一些地方,代码引用了活动表。无论函数出现在何处,它都将反映激活的任何工作表的值。您将希望改用提供的范围对象的父对象

Dim currentSheet as Worksheet
Set currentSheet = rangeObj.Parent

然后,在方法中搜索ActiveSheet并将其替换为currentSheet。

这确实有效!太神了一个后续问题。。我在哪里能读到这些?我应该找什么?因为我不知道如何提及这个话题……哇,这是一个很难回答的问题。我对Excel的大部分了解都是从多年的使用中学到的,也从这里和那里阅读代码片段中学到的。我记录宏并查看Excel生成的代码,以此作为了解Excel对象模型的起点。我甚至从Microsoft Excel帮助系统本身获得了帮助。不寻常,我知道。这一切都建立在四年的计算机科学学位和多年的行业经验之上。无论如何,搜索Excel对象模型并阅读。玩得高兴我喜欢卓越。