Vba 算数

Vba 算数,vba,excel,Vba,Excel,我想做的是建立一个模型,取一个大于1的单元格,然后用一个圆锥形将面积之和取到第一行,例如单元格D4,求C3:C5+B2:B6+A1:A7的面积之和 目前我有这个,但它显然不起作用 Dim I As Double Dim J As Double Dim Size As Integer Dim x As Integer Dim y As Integer Dim z As Integer 'Dim Range As Integer Dim

我想做的是建立一个模型,取一个大于1的单元格,然后用一个圆锥形将面积之和取到第一行,例如单元格D4,求C3:C5+B2:B6+A1:A7的面积之和

目前我有这个,但它显然不起作用

    Dim I As Double
    Dim J As Double
    Dim Size As Integer
    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
    'Dim Range As Integer
    Dim PV1 As Integer





    'MCArray = Worksheets("Data")
    I = WorksheetFunction.CountA(Worksheets("Data").Rows(1))
    J = WorksheetFunction.CountA(Worksheets("Data").Columns(1))


    'Loop to Move down the rows
    For x = 1 To J
        'Loop to move acoss the columns
        For y = 1 To I
            'IfElse to determine if cell value is greater or equal to zero
            If Cells(J, I).Value >= 0 Then
                'Loop to sum the cells above
                For z = 1 To J
                    PV1 = (ActiveCell.Value) + Worksheet.Sum(Range([J - z], [I-z:I+z]))
                    'IfElse to determine if final sum is greater than zero
                    If PV1 > 0 Then
                        Worksheets("MC").Range("B4").Value = PV1
                        Range([J - z], [I-z:I+z]).Interior.ColourIndex = 1

                    End If
                Next z
            End If
        Next y
    Next x

这里有一个函数,您可以作为UDF使用,也可以从另一个例程使用。只需将要从其开始的单个单元格(示例中为D4)传递给它,此函数将按您所述计算圆锥体的和

Public Function SUMCONE(r As Range) As Double
    Application.Volatile
    SUMCONE = Application.Sum(r, r(-0, -0).Resize(, 3), r(-1, -1).Resize(, 5), r(-2, -2).Resize(, 7))
End Function
以下是如何从VBA例程中使用上述函数的示例:

Public Sub Demo()
    Dim j&
    For j = 5 To 10
        If Cells(5, j) > 0 Then
            Debug.Print SUMCONE(Cells(5, j))
        End If
    Next
End Sub
更新

根据您的反馈,我已经更新了函数和演示例程,以从初始单元格形成一个向上的圆锥求和

更新#2

上面是一个向上延伸的固定尺寸圆锥体,可以从工作表中的任何单元格启动

但是,如果您希望圆锥始终延伸到第1行,而不管它来自哪个单元格,那么下面是您要了解的内容:

Public Sub Demo()
    Dim i&, j&
    For j = 1 To Application.CountA(Worksheets("Data").Rows(1))
        For i = 1 To Application.CountA(Worksheets("Data").Columns(1))
            If Cells(i, j) > 0 Then
                Debug.Print Cells(i, j).Address, SumAndColorCone(Cells(i, j))
            End If
        Next
    Next
End Sub

Public Function SumAndColorCone(r As Range) As Double
    Dim i&, k&, c As Range
    Set c = r
    For i = r.Row - 1 To 1 Step -1
        Set c = Union(c, r(-k, -k).Resize(, (k + 1) * 2 + 1))
        k = k + 1
    Next
    c.Interior.Color = vbRed
    SumAndColorCone = Application.Sum(c)
End Function
更新#3

正如我所怀疑的,如果圆锥体太靠近工作表的左边缘,则会出现问题。我现在添加了代码来处理这个问题。另外,访问大型矩阵的方法(我在演示例程中使用过)也不能正常工作。我也解决了这个问题:

Public Sub Demo()
    Dim i&, j&
    For j = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
        For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
            If Val(Cells(i, j)) > 0 Then
                Debug.Print Cells(i, j).Address, SumAndColorCone(Cells(i, j))
            End If
        Next
    Next
End Sub

Public Function SumAndColorCone(r As Range) As Double
    Dim i&, k&, c As Range
    Set c = r
    For i = r.Row - 1 To 1 Step -1
        If r.Column - k < 2 Then Exit For
        Set c = Union(c, r(-k, -k).Resize(, (k + 1) * 2 + 1))
        k = k + 1
    Next
    c.Interior.Color = vbRed
    SumAndColorCone = Application.Sum(c)
End Function
公共子演示()
Dim i&j&
对于j=1到单元格(1,Columns.Count).End(xlToLeft).Column
对于i=1到单元格(Rows.Count,“A”).End(xlUp).Row
如果Val(单元格(i,j))>0,则
打印单元格(i,j).地址,SumAndColorCone(单元格(i,j))
如果结束
下一个
下一个
端接头
公共函数SUMANDCORCONE(r为范围)为双色
尺寸i&,k&,c作为范围
设置c=r
对于i=r,第1行到第1步-1
如果r.列-k<2,则退出
设置c=并集(c,r(-k,-k)。调整大小(,(k+1)*2+1))
k=k+1
下一个
c、 内饰。颜色=vbRed
SumAndColorCone=Application.Sum(c)
端函数

这是一个函数,您可以将其用作自定义项,也可以从其他例程使用。只需将要从其开始的单个单元格(示例中为D4)传递给它,此函数将按您所述计算圆锥体的和

Public Function SUMCONE(r As Range) As Double
    Application.Volatile
    SUMCONE = Application.Sum(r, r(-0, -0).Resize(, 3), r(-1, -1).Resize(, 5), r(-2, -2).Resize(, 7))
End Function
以下是如何从VBA例程中使用上述函数的示例:

Public Sub Demo()
    Dim j&
    For j = 5 To 10
        If Cells(5, j) > 0 Then
            Debug.Print SUMCONE(Cells(5, j))
        End If
    Next
End Sub
更新

根据您的反馈,我已经更新了函数和演示例程,以从初始单元格形成一个向上的圆锥求和

更新#2

上面是一个向上延伸的固定尺寸圆锥体,可以从工作表中的任何单元格启动

但是,如果您希望圆锥始终延伸到第1行,而不管它来自哪个单元格,那么下面是您要了解的内容:

Public Sub Demo()
    Dim i&, j&
    For j = 1 To Application.CountA(Worksheets("Data").Rows(1))
        For i = 1 To Application.CountA(Worksheets("Data").Columns(1))
            If Cells(i, j) > 0 Then
                Debug.Print Cells(i, j).Address, SumAndColorCone(Cells(i, j))
            End If
        Next
    Next
End Sub

Public Function SumAndColorCone(r As Range) As Double
    Dim i&, k&, c As Range
    Set c = r
    For i = r.Row - 1 To 1 Step -1
        Set c = Union(c, r(-k, -k).Resize(, (k + 1) * 2 + 1))
        k = k + 1
    Next
    c.Interior.Color = vbRed
    SumAndColorCone = Application.Sum(c)
End Function
更新#3

正如我所怀疑的,如果圆锥体太靠近工作表的左边缘,则会出现问题。我现在添加了代码来处理这个问题。另外,访问大型矩阵的方法(我在演示例程中使用过)也不能正常工作。我也解决了这个问题:

Public Sub Demo()
    Dim i&, j&
    For j = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
        For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
            If Val(Cells(i, j)) > 0 Then
                Debug.Print Cells(i, j).Address, SumAndColorCone(Cells(i, j))
            End If
        Next
    Next
End Sub

Public Function SumAndColorCone(r As Range) As Double
    Dim i&, k&, c As Range
    Set c = r
    For i = r.Row - 1 To 1 Step -1
        If r.Column - k < 2 Then Exit For
        Set c = Union(c, r(-k, -k).Resize(, (k + 1) * 2 + 1))
        k = k + 1
    Next
    c.Interior.Color = vbRed
    SumAndColorCone = Application.Sum(c)
End Function
公共子演示()
Dim i&j&
对于j=1到单元格(1,Columns.Count).End(xlToLeft).Column
对于i=1到单元格(Rows.Count,“A”).End(xlUp).Row
如果Val(单元格(i,j))>0,则
打印单元格(i,j).地址,SumAndColorCone(单元格(i,j))
如果结束
下一个
下一个
端接头
公共函数SUMANDCORCONE(r为范围)为双色
尺寸i&,k&,c作为范围
设置c=r
对于i=r,第1行到第1步-1
如果r.列-k<2,则退出
设置c=并集(c,r(-k,-k)。调整大小(,(k+1)*2+1))
k=k+1
下一个
c、 内饰。颜色=vbRed
SumAndColorCone=Application.Sum(c)
端函数

PV1=(ActiveCell.Value)+sheet.Sum(范围([J-z],[I-z:I+z])调出对象失败的错误消息范围PV1=(ActiveCell.Value)+sheet.Sum(范围([J-z],[I-z:I+z])调出object FailedTanks的错误消息范围,我希望能够对矩阵中任何值大于0的单元格执行此操作。是否可以在循环或类似情况下使用此函数?只需调用此函数,传递单元格(从矩阵中选择的任何单元格)此函数将计算从该单元格向左延伸的圆锥体的总和。PV1=SUMCONE(范围(“D5”))例如,如果将函数带到AZ行,它会工作吗?或者我必须设置resize和r以适应每一行的这些限制吗?您也说过这是向左求和。我想向上求和到一行。您感到困惑。在Excel中,行是编号的,列是用字母标记的。因此D5表示第四列和第二列相交的单元格第五行。你在这个问题中的描述显然是针对一个向左的圆锥体。是的,它可以在表格上的任何地方使用,只要初始单元格离顶部和左侧足够远,这样就有足够的单元格来形成圆锥体。我可以调整它的方向,使圆锥体向上……你想让我这样做吗?谢谢,我想这样做要对矩阵中值大于0的任何单元格执行此操作,是否可以在循环或类似情况下使用此函数?只需调用此函数,传递单元格(从矩阵中选择的任何单元格),此函数将计算从该单元格向左延伸的圆锥体的和。PV1=SUMCONE(范围(“D5”))例如,如果将函数带到AZ行,它会工作吗?或者我必须设置resize和r以适应每一行的这些限制吗?您也说过这是向左求和。我想向上求和到一行。您感到困惑。在Excel中,行是编号的,列是用字母标记的。因此D5表示第四列和第二列相交的单元格第五行。因此,你在这个问题中的描述显然是针对左锥体的。是的,它可以在表格上的任何地方使用,只要初始单元格距离