Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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 - Fatal编程技术网

Excel VBA检查迷你图中的数据点数量

Excel VBA检查迷你图中的数据点数量,excel,vba,Excel,Vba,我有一个VBA宏,它在两个文件之间运行比较,并创建一个验证文件,其中列出两个文件之间的数字是否匹配。 我想知道VBA是否可以计算出一个迷你图中的数据点数量? 我的迷你图应该总是有12个数据点,它们存在于另一个选项卡上 我没有任何代码示例,因为我甚至不知道从哪里开始。 如果需要的话,我可以提供更多的细节。现在我明白你所说的Sparkine是什么意思了。我误解了,因为我需要把它翻译成德语,我不是英语母语,所以我以为你说的是一个普通的图表对象 现在来看看真正的火花 不可能直接计算数据点。您唯一能做的就

我有一个VBA宏,它在两个文件之间运行比较,并创建一个验证文件,其中列出两个文件之间的数字是否匹配。 我想知道VBA是否可以计算出一个迷你图中的数据点数量? 我的迷你图应该总是有12个数据点,它们存在于另一个选项卡上

我没有任何代码示例,因为我甚至不知道从哪里开始。
如果需要的话,我可以提供更多的细节。

现在我明白你所说的Sparkine是什么意思了。我误解了,因为我需要把它翻译成德语,我不是英语母语,所以我以为你说的是一个普通的图表对象

现在来看看真正的火花 不可能直接计算数据点。您唯一能做的就是验证数据源,看看它有多大,有多少个单元格:

Public Sub CountSparklineDataPoints()
    Dim oSparkGroup As SparklineGroup

    With Worksheets("Sheet1")
        For Each oSparkGroup In ActiveSheet.Columns("A").SparklineGroups 'all sparklines in column A are processed
            .Range(oSparkGroup.Item(1).Location.Address).Offset(0, 4) = .Range(oSparkGroup.Item(1).SourceData).Cells.Count
            'write 4 columns right of the sparkline                   = the count of the cells in sourcedata
        Next oSparkGroup
    End With
End Sub
注意,这也会对SourceData中包含的空单元格进行计数。因此,这是SourceData大小是否正确的证明

对于外部地址,这将更加广泛:

Public Sub CountSparklineDataPoints()
    Dim oSparkGroup As SparklineGroup

    With Worksheets("Sheet1")
        For Each oSparkGroup In ActiveSheet.Columns("E").SparklineGroups 'all sparklines in column A are processed
            .Range(oSparkGroup.Item(1).Location.Address).Offset(0, 4) = RangeFromAddress(oSparkGroup.Item(1).SourceData).Cells.Count
            'write 4 columns right of the sparkline                   = the count of the cells in sourcedata
        Next oSparkGroup
    End With
End Sub


'================================
' VBA Get Range from address string
'
' http://www.exceltoolset.com
'================================
Function RangeFromAddress( _
 ByRef Address As String, _
 Optional obj As Object) As Range
    Dim Wb As Workbook, FallbackWb As Workbook
    Dim sh As Worksheet, FallbackSh As Worksheet
    Dim w, s, a As String
    Dim i As Long, j As Long
    Dim n As Name

    On Error Resume Next

    Set n = Names(Address)
    If Not (n Is Nothing) Then
        Set RangeFromAddress = n.RefersToRange
        Exit Function
    End If

    If Not (obj Is Nothing) Then
        Set FallbackWb = GetObjectParentWorkbook(obj)
        Set FallbackSh = GetObjectParentSheet(obj)
    Else
        Set FallbackWb = ActiveWorkbook
        Set FallbackSh = ActiveSheet
    End If

    i = InStr(Address, "!")
    If i = 0 Then
        Set RangeFromAddress = FallbackSh.Range(Address)
    Else
        s = Left$(Address, i - 1)
        a = Mid$(Address, i + 1)
        If InStr(s, "'") = 1 Then
            s = Mid$(s, 2, Len(s) - 2)
        End If

        i = 1
        Do Until i > Len(s)
            If Mid$(s, i, 2) = "''" Then
                s = Left$(s, i - 1) & Mid$(s, i + 1)
            End If
            i = i + 1
        Loop

        i = InStr(s, "]")
        If i = 0 Then
            Set sh = FallbackWb.Sheets(s)
        Else
            w = Left$(s, i - 1)
            j = InStr(w, "[")
            If j <> 0 Then w = Left$(w, j - 1) & Mid$(w, j + 1)
            s = Mid$(s, i + 1)

            Set Wb = Workbooks(w)
            If Wb Is Nothing Then
                Application.DisplayAlerts = False
                Set Wb = Workbooks.Open(Filename:=w, Notify:=True)
                Application.DisplayAlerts = True
            End If
            Set sh = Wb.Sheets(s)
        End If
        Set RangeFromAddress = sh.Range(a)
    End If
End Function

Function GetObjectParentWorkbook(aObject As Object) As Workbook
    Dim o As Object

    On Error GoTo ErrorHandle

    If aObject Is Nothing Then GoTo ErrorExit
    Set o = aObject.Parent

    If TypeOf aObject Is Workbook Then
        Set GetObjectParentWorkbook = aObject
        GoTo ErrorExit
    End If

    Do Until (TypeOf o Is Workbook) Or (TypeOf o Is Application)
        Set o = o.Parent
    Loop

    If TypeOf o Is Workbook Then Set GetObjectParentWorkbook = o

ErrorExit:
    Exit Function

ErrorHandle:
    Resume ErrorExit
End Function

Function GetObjectParentSheet(aObject As Object) As Object
    Dim op As Object
    On Error Resume Next

    If aObject Is Nothing Then GoTo ErrorExit
    Set op = aObject.Parent
    If op Is Nothing Then GoTo ErrorExit

    If TypeOf op Is Workbook Then
        Set GetObjectParentSheet = aObject
        GoTo ErrorExit
    End If

    Do Until (TypeOf op Is Worksheet) Or (TypeOf op Is Application)
        Set op = op.Parent
    Loop

    If TypeOf op Is Worksheet Then Set GetObjectParentSheet = op

ErrorExit:
    Exit Function
End Function

你只需要在一张纸上数一数这个范围的数据点,而这张纸就是这个闪光点的来源,不是吗?我不太清楚你要的是什么。不,有几次数据范围是正确的,但小火花没有正确更新。我想特别计算一下sparkline中显示的点的数量如果为sparkline设置数据源范围,例如A1:B12一次,如果更改该范围内的值,它应该始终正确更新。如果没有,你应该在你的过程中找到你的错误并修复它。即使有可能,计算任何点数的变通方法也将是一种糟糕的做法。它有时不起作用,取决于数据源的更新方式。例如,剪切对删除一行有不同的效果。这不是工作,这是安全检查。目前,有人实际上手动查看了12个不同的闪屏,以确保它们已从上周正确更新。如果我可以让我的宏检查其中是否有12个数据点,那么这对我们将是有益的。我的方法是确保,例如,在源范围内,没有人可以删除/移动/插入行,而只能编辑值。或者是一个脚本,它只是为你的闪影设置了正确的源代码范围,不管它们以前是对的还是错的。这样,您不需要执行任何花哨的测试,但要确保一切都是正确的。谢谢您的帮助,我发现您的代码有一个错误。应用程序定义或对象定义错误。我的数据点位于不同的选项卡上。我需要把它写进代码吗?对于外部地址来说,获取它们的范围是相当麻烦的。请参阅更新的答案。谢谢,但我仍然无法运行。我不确定我是否正确运行了它,我是否应该将所有这些代码存储在一个模块中,然后只运行宏?当然,您需要将ActiveSheet.ColumnsE更改为闪线所在的列,或者更改为工作表中每个单元格的ActiveSheet.Cells。这段代码已经过测试并为我工作。正如您可以想象的那样,“未工作”不是有效的错误描述。这就像当你说我的车坏了,问题可能是从空汽油到坏马达或被盗车轮。因此,如果你希望得到帮助,你必须在描述中尽可能详细。至少错误信息和发生位置是必要的,越多越好。努力一点!