繁体   English   中英

动态引用变量名?

[英]Dynamically refer to variable names?

我知道VBA不能在下面的代码中动态引用变量名,例如bi ,并按此处所述对其进行解释以获取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。 因此,使用数组绝对是正确的方法。

对于您的具体示例,可能会有更灵活的方法。 您的b1b2 ,..., 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM