【问题标题】:Variable number of terms in an Excel VBA Formula?Excel VBA公式中的可变项数?
【发布时间】:2015-12-03 00:03:19
【问题描述】:

是否可以在 VBA 中为 excel 编写一个公式,使得公式中有“n”个术语,术语的数量随着“n”的值而变化?

例如,假设您想将单元格 a1 编码为 a2 和 a3 的总和。然后,您希望 b1 是 b2、b3、b4、b5 等的总和,这样一列单元格的每列 1 行 1 单元格是其下方“n”单元格的总和,其中“n”从列到柱子。假设您要使用的所有单元格地址都是已知的并存储在一个数组中。

这里有一些代码可以更好地解释我的要求:

For i = 0 to n
   Range(arr1(i)).formula = "=" & range(arr2(i)).value & "-(" _
   & Range(arrk(i)).value & "+" & Range(arrk+1(i)).value & "+" _
   & Range(arrk+2(i)).value & "+" & ... & ")"
Next i

所以我正在寻找的是一段 VBA 代码,它可以使单元格公式包含动态数量的术语。上面的代码将使单元格 a1 的值 = a-(b+c+d+...),其中括号中的项数是可变的,具体取决于公式应用于哪个单元格。

这里的图片显示了我想要做的一个例子。我想要一些代码,它可能需要“年收入”并从中减去可变数量的“费用”,其中费用的数量每年都在变化(但该数字在当年保持不变)。代码需要使用公式,以便用户可以修改费用条目。

【问题讨论】:

  • 对。我想我应该让这个例子更棘手!如果中间有我想忽略的非空白单元格怎么办?我将更改图像以显示我的意思
  • 每一列的“垃圾”是否总是在同一行中?
  • 在 B12 中仍然是 =B2-SUM(B3:B4,B6,B8:B9,B11) 并复制到右侧...根本不需要 vba...
  • SUMIFS 可能也是一种可行的方法......=SUMIFS(B3:B11,B3:B11,"<>JUNK") ... add more conditions if there are different types of "JUNK"

标签: vba excel


【解决方案1】:

你试过数组公式吗? :

数组公式: Excel 数组公式对一组或多组值(“数组参数”)执行多次计算并返回一个或多个结果。

详情:http://www.excelfunctions.net/Excel-Array-Formulas.html

【讨论】:

    【解决方案2】:

    感谢大家的建议,我今天找到了一个解决方案(不是特别有效,但仍然是一个解决方案)。

    首先,我创建了一个数组,它使用垃圾单元的“模式”来列出要包含的每个单元地址。

    使用这个数组,我使用 for 循环通过application.index 命令创建了一系列临时数组。对于每个临时数组,我使用Join 命令将单元格列表转换为单个字符串,然后将其输入到单元格公式中。感谢 @thepiyush13 的 array.formula 方法启发了这一点。

    这里有一些示例代码来展示我所做的:

    ' hypothetical array containing two sets of cells to use
    Dim array1(0 To 1, 0 To 1) As Variant
    Dim vartemp As Variant
    Dim vartemptransposed As Variant
    
    ' col 1 will be used to add I10 and I13, col2 I11 and I14
    array1(0, 0) = "$I$10"
    array1(1, 0) = "$I$13"
    array1(0, 1) = "$I$11"
    array1(1, 1) = "$I$14"
    
    For i = 1 to 2
    
    'application.index(arr,row#,col#) to create a new array 
    vartemp = Application.Index(array1, 0, i)
    'error if not transposed
    vartemptransposed = Application.Transpose(vartemp)
    
    randomstring = Join(vartemptransposed, ",")
    totalvalue = 100
    
    'example formula: a1 = totalvalue - sum(I10,I13). a2 = totalvalue - sum(I11,I14)
        Cells(1,i).formula = "=" & totalvalue & "-SUM(" & randomstring & ")"
    Next i
    

    我需要代码在动态生成但始终保持“垃圾单元”所在位置的相同模式的大型列表上运行多次。未包含在代码中,但我还使用了另一个数组作为放置公式的单元格地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多