[英]Dynamically refer to variable names?
我知道VBA不能在下面的代码中动态引用变量名,例如b
和i
,并按此处所述对其进行解释以获取b1
的值。
但是我想知道是否有一种更优雅的方式来完成下面的工作?
基本上,我想获得7列的所有组合。
Sub combination()
Dim w(1 To 7) As Integer
Dim b(1 To 7) As Integer
'get values
For i = 1 To 7
w(i) = Cells(6, i + 1).Value
Next i
newline = 8
total = 0
For b1 = 0 To 1
For b2 = 0 To 1
For b3 = 0 To 1
For b4 = 0 To 1
For b5 = 0 To 1
For b6 = 0 To 1
For b7 = 0 To 1
b(1) = b1
b(2) = b2
b(3) = b3
b(4) = b4
b(5) = b5
b(6) = b6
b(7) = b7
For i = 1 To 7
total = total + b(i) * w(i)
Next i
Cells(newline, 1).Value = total
For i = 1 To 7
Cells(newline, i + 1).Value = b(i)
Next i
total = 0
newline = newline + 1
Next b7
Next b6
Next b5
Next b4
Next b3
Next b2
Next b1
End Sub
如果问题是:“如何使用动态变量变量名”,那么大多数情况下的答案是使用数组。 这不仅适用于VBA,而且适用于具有“变量名”功能的语言,例如PHP。 因此,使用数组绝对是正确的方法。
对于您的具体示例,可能会有更灵活的方法。 您的b1
, b2
,..., b7
是二进制数字,然后数组b(1 to 7)
是7个单个二进制数字的数组,它们一起代表从0到127的十进制值之一(2 ^ 7-1 )。 因此,您可以有一个返回此类数组的函数,并且此函数可能更灵活,因为它可以返回可变长度的此类数组,而不固定在7位数字上。
参见示例:
Function getBinArray(ByVal vDecimal As Double, ByVal digits As Integer) As Variant
p = 1
Dim bin() As Integer
ReDim bin(1 To digits)
Do While p < digits + 1
'remainder = vdecimal Mod (2 ^ p)
remainder = vDecimal - Int(vDecimal / (2 ^ p)) * (2 ^ p)
If remainder <> 0 Then
bin(p) = 1
vDecimal = vDecimal - (2 ^ (p - 1))
Else
bin(p) = 0
End If
p = p + 1
Loop
getBinArray = bin
End Function
Sub combination()
Dim w As Variant
Dim b As Variant
lCount = 7 'count of values to compute subtotals for
With ActiveSheet
'get values
w = .Range(.Cells(6, 2), .Cells(6, 2 + lCount - 1)).Value
newline = 8
.Range(.Rows(8), .Rows(.Rows.Count)).Clear
Total = 0
For vDecimal = 0 To 2 ^ lCount - 1
b = getBinArray(vDecimal, lCount)
For i = 1 To lCount
Total = Total + b(i) * w(1, i)
Next i
.Cells(newline, 1).Value = Total
.Range(.Cells(newline, 2), .Cells(newline, 2 + lCount - 1)).Value = b
Total = 0
newline = newline + 1
Next vDecimal
End With
End Sub
我的b()
数组按以下顺序包含二进制数字b(1)
=数字2 ^ 0, b(2)
=数字2 ^ 1,... b(n)
=数字2 ^(n-1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.