【问题标题】:VBA assign numbered variables in loopVBA在循环中分配编号的变量
【发布时间】:2018-04-13 21:46:56
【问题描述】:

我正在尝试创建编号变量(即 suminterest_X,其中“X”从 1 变为 20 并生成 20 个不同的变量,循环中的每个进程一个)。

我的代码目前是:

suminterest_& CStr(i) = Excel.WorksheetFunction.Sum(Range(Worksheets("Bond_" & CStr(i)).Cells(8, 5), Worksheets("Bond_" & CStr(i)).Cells(7 + wam1, 5)))

但是,在编写此行时,我遇到了语法错误。

语法在写行时起作用:

Worksheets("Bond_" & CStr(i)).Cells(7 + j, 3) = j

在之前的一段代码中使用过。

谁能帮我正确编码?

编辑:

这是我的整个循环:

create the variables and tables For i = 1 To 20 'assingment of variables Let wac1 = Cells(3 + i, 2) Let wam1 = Cells(3 + i, 3) Let prince1 = Cells(3 + i, 4) Let annualdef1 = Cells(3 + i, 5) Let annualprepay1 = Cells(3 + i, 6) Let loss1 = Cells(3 + i, 7)

'creation of tables
For j = 1 To wam1
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 3) = j
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 4) = prince1
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 5) = ipayment(prince1, wac1)
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 7) = preprince(prince1, annualprepay1, j, wam1)
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 8) = defprince(prince1, annualdef1)
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 6) = schedpay(prince1, Worksheets("Bond_" & CStr(i)).Cells(7 + j, 8), j, wam1)
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 9) = recovprince(Worksheets("Bond_" & CStr(i)).Cells(7 + j, 8), loss1)
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 10) = totprincepaid(Worksheets("Bond_" & CStr(i)).Cells(7 + j, 6), Worksheets("Bond_" & CStr(i)).Cells(7 + j, 7), Worksheets("Bond_" & CStr(i)).Cells(7 + j, 8), recov1(loss1))
    Worksheets("Bond_" & CStr(i)).Cells(7 + j, 11) = balance1(Worksheets("Bond_" & CStr(i)).Cells(7 + j, 4), Worksheets("Bond_" & CStr(i)).Cells(7 + j, 6), Worksheets("Bond_" & CStr(i)).Cells(7 + j, 7), Worksheets("Bond_" & CStr(i)).Cells(7 + j, 8))
    prince1 = Worksheets("Bond_" & CStr(i)).Cells(7 + j, 11)
Next j
    suminterest = Excel.WorksheetFunction.Sum(Range(Worksheets("Bond_" & CStr(i)).Cells(8, 5), Worksheets("Bond_" & CStr(i)).Cells(7 + wam1, 5)))

Next i Range("M1") = suminterest

我希望能够将 20 个 suminterest 中的每一个存储为自己的变量并键入 range("M1") = suminterest_X 以获取相应的变量。

【问题讨论】:

  • “我正在尝试创建编号变量” - 为什么需要它?
  • 我有一个循环创建 20 个选项卡,每个选项卡都有不同的表。我希望能够对 20 个选项卡中的每一个中的一列求和,并将它们保存为变量“suminterest_X”,其中“suminterest_1”对应于表 1 中列的总和,依此类推。
  • 一般来说,字典或一些原始的 OOP 就可以满足您的需求。
  • 你试过了吗:Application.WorksheetFunction.Sum(Worksheets("Bond_" & CStr(i)).Range("E8:E" & 7 + wam1))
  • 我编辑了我的问题,希望它能把它放在更多的上下文中。

标签: vba excel loops


【解决方案1】:

Worksheets("Bond_" & CStr(i)).Cells(7 + j, 3) = j 中,您将字符串分配给"Bond_",而不是变量。


如果您想在数组中包含一些 String 值,通过循环分配,如下所示:

那么你可以通过下面的代码来实现:

Sub TestMe()

    Dim myArr   As Variant
    Dim cnt     As Long

    ReDim myArr(5)
    For cnt = 0 To 5
        myArr(cnt) = "suminterest_" & cnt
    Next

End Sub

【讨论】:

    【解决方案2】:

    您希望将数字存储在一个数组中(变量)。
    使用数组可以返回suminterest(i) 而不是suminterest_& CStr(i)

    Public Sub Test()
    
        Dim SumInterest(1 To 20) As Double
        Dim i As Long
    
        For i = 1 To 20
            SumInterest(i) = i * 2
        Next i
    
        Dim ReturnFrom As Long
    
        ReturnFrom = InputBox("Enter number between 1 and 20.")
    
        MsgBox "The value at position " & ReturnFrom & " is:  " & SumInterest(ReturnFrom)
    
    End Sub
    
    • 默认情况下,数组将从 0 开始,因此 Dim SumInterest(20) 将 给你 21 个值 (0 - 20)。
    • 您可以使用Dim SumInterest(1 To 20) 指定数组的边界
    • 您可以使用REDIM 调整数组的大小。
    • 您可以使用LBOUND(SumInterest) 找到数组的下限(在我的示例中返回1)。
    • 您可以使用UBOUND(SumInterest) 找到数组的上限
    • 然后是多维数组、集合、字典......

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多