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
如何将vba中为一个单元格编写的函数应用于excel中的其他单元格?_Excel_Vba - Fatal编程技术网

如何将vba中为一个单元格编写的函数应用于excel中的其他单元格?

如何将vba中为一个单元格编写的函数应用于excel中的其他单元格?,excel,vba,Excel,Vba,我有一个宏,它在一个单元格中执行计算,我想将其应用于工作表中的一系列单元格 Dim standard As Variant standard = Range("G19") 'Retrieve the standard of the part' If standard = "medium" Or standard = "heavy" Then Range("H19").Formula = "

我有一个宏,它在一个单元格中执行计算,我想将其应用于工作表中的一系列单元格

Dim standard As Variant
    standard = Range("G19") 'Retrieve the standard of the part'

If standard = "medium" Or standard = "heavy" Then
    Range("H19").Formula = "=-85*PI()*(D19/1000)^2+ 724.88*(D19/1000)"
ElseIf standard = "600/3" Then
    Range("H19").Formula = "=-85*PI()*(D19/1000)^2+ 724.88*(D19/1000)+0.98*(2*PI()*D19*C19 + 2*PI()*D19^2)"

如果要在一系列单元格上执行任务,请使用循环

   `

    Sub LoopThroughCells()
    Dim standard As Variant, RowNo As Long, ColumnNo As Long
    'Assuming you want to apply formula in range G19:G35
 ColumnNo = 7  'Since G is 7th column
    For RowNo = 19 To 35 'Since Row range is 19 to 35
         
                standard = Cells(RowNo, ColumnNo) 'Retrieve the standard of the part'
                    If standard = "medium" Or standard = "heavy" Then
                        Cells(RowNo, ColumnNo).Offset(, 1).FormulaR1C1 = "=-85*PI()*(RC[-4]/1000)^2+ 724.88*(RC[-4]/1000)" 'RC[-4] is Column D
                    ElseIf standard = "600/3" Then
                        Cells(RowNo, ColumnNo).Offset(, 1).FormulaR1C1 = "=-85*PI()*(RC[-4]/1000)^2+ 724.88*(RC[-4]/1000)+0.98*(2*PI()*RC[-4]*RC[-5] + 2*PI()*RC[-4]^2)" 'RC[-5] is Column C
                    End If


Next RowNo
End Sub

 `

如果我们有准确的数据集或更多的任务说明,这段代码也可以改进。

这里的关键是掌握Excel对象模型以及单元格如何组合在一起。每个细胞相对于其周围的细胞存在

实际上,您可以将公式直接应用于某个范围(示例中为H2:H40)。相对引用将允许每个单元格中的公式不同。编写公式,使其适用于范围内的第一个单元格

Range("H2:H40").Formula = "=IF(OR(G2=""medium"",G2=""heavy"",G2=""600/3""),-85*PI()*(D2/1000)^2+ 724.88*(D2/1000)+IF(OR(G2=""medium"",G2=""heavy""),0,0.98*(2*PI()*D2*C2 + 2*PI()*D2^2)),"""")"
由于您的公式非常相似,并且目标是有效地将公式应用于某个范围,因此我还将您的if语句合并到公式中,如下所示:

If(<heavy, medium, 600/3>, <main formula> + If(<heavy, medium>, 0, <extra formula>), <empty cell>)
If(,+If(,0,),)

我建议您通过将工作表对象放在其前面来明确限定您的范围。

作为中间选项,我建议使用一个用户定义的函数,该函数包含三个值:

Function PartCalc(standard As String, _
                    Val1 As Double, Val2 As Double) As Double
' describe here what this function is calculating
Const pi As Double = 3.14159265358979
If standard = "medium" Or standard = "heavy" Then
    PartCalc = -85 * pi * (Val1 / 1000) ^ 2 + 724.88 * (Val1 / 1000)
ElseIf standard = "600/3" Then
    PartCalc = -85 * pi * (Val1 / 1000) ^ 2 + 724.88 * (Val1 / 1000) _
                + 0.98 * (2 * pi * Val1 * Val2 + 2 * pi * Val1 ^ 2)
Else
    PartCalc = -1 ' or some other dummy value
End If
End Function
然后H19的内容将是
=PartCalc(G19,D19,C19)
(当然,复制此单元格将调整单元格,使其在所选单元格周围具有相同的相对正值)


如果您使用此函数,我建议将“Val1”和“Val2”重命名为更具描述性的名称,最好使用单位,例如
Flop\u mm
Slop\u mm
,也可能重命名
PartCalc
本身。注意,函数名在例程中的使用是函数返回值的方式,因此,
PartCalc
的所有4个实例都需要更新为相同的值。

是否要将此过程应用于许多单元格,并每次在右侧的下一个单元格中写入公式?我要将公式应用于下一个单元格,每次应用公式时,我要使用相关的D行值(即D19-D35)。因此,我希望我的代码使用G列值范围(即G19-G35)测试条件,然后在H列的相关行中打印公式的计算值。这没有意义;你会(潜在地)在循环的每一圈都重复覆盖同一单元格的内容。哦,是的,我错了。。忘记更正目标单元格。我希望将公式应用到下一个单元格,每次应用公式时,我希望它使用相关的D行值(即D19-D35)。因此,我希望我的代码使用一系列G列值(即G19-G35)测试条件,然后根据您的最新评论,在H列的相关行中打印公式的计算值。hello@xminx更新代码。如果您想要固定单元格C19,请使用C19-C35进行乘法运算,然后告诉我。请注意,“600/3”是字符串标识符,而不是计算。我避免直接应用公式,因为我将向现有条件添加其他条件。谢谢@Joffan!调整了。对于OP,如果您的逻辑变得太复杂,您将需要遍历单元格:
For row=2到40。。。下一行
。在公式中使用R1C1符号可能是最简单的方法。但是要小心那些不必要的复杂逻辑,应该简化。将逻辑置于公式中是完全依赖于周围单元格进行计算的理想方法。它减少了VBA,在一个范围内标准化了单元格,减少了电子表格用户的混淆,更易于维护,并迫使您能够清楚地陈述您的逻辑。