我希望创建一个 Excel 表格,它表示最多 20 个位置的二进制序列,即 2^20。我研究过使用 Excel 公式 dec2bin,不幸的是它只能生成最多 10 个位置的二进制序列,即 2^10。我需要生成一个更大的二进制序列。
我曾尝试用 vba 对其进行编码,但在尝试小规模解决问题时遇到了一些问题。首先,我的代码产生了很多重复项。例如,当我将表设置为 3 个位置时,我会生成 28 个结果,而我应该只得到 8 个结果。其次,我的代码非常慢。
任何关于如何以更快的速度制作更强大的表格的提示或技巧将不胜感激!这是我一直在小规模使用的代码...
Sub BinarySequence()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim x As Integer
Dim Length As Integer
Application.ScreenUpdating = False
'Define 1st scenario
x = 1
Range("Start").Value = x 'where "Start" is defined as cell A1
'set default range
Length = Range("Sizei") 'where "Sizei" is defined as 3'
For i = 1 To Length
Range("start").Offset(0, i).Value = 1
Next
'code to generate first level binary sequence (i loop)
For i = 1 To Length
'code to generate second level binary sequence (j loop)
For j = 1 To Length
'code to generate third level binary sequence (k loop)
For k = 1 To Length
x = x + 1
Range("Start").Offset(0, i).Value = 0
Range("Start").Offset(0, j).Value = 0
Range("Start").Offset(0, k).Value = 0
'copy and paste scenario number
Range("Start").Offset(x - 1, 0).Value = x
'copy and paste result
Range("Result").Select 'where result is defined as row 1
Selection.Copy
Range("Result").Offset(x - 1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'reset scenario select for next loop
Range("start").Offset(0, k).Value = 1
Next k
'reset scenario select for next loop
Range("start").Offset(0, j).Value = 1
Next j
'reset scenario select for next loop
Range("Start").Offset(0, i).Value = 1
Next i
Application.ScreenUpdating = True
End Sub
最佳答案
引用这篇文章了解 VBA DecToBin 函数 - https://groups.google.com/d/msg/comp.lang.visual.basic/KK_-zdrKmLQ/Y36tj5FenJcJ 。如果我正确理解了这个问题,您可以使用 Dec2Bin 函数和以下逻辑来生成表(尽管完成所有 20 个位置需要一段时间):
Sub BinaryTable()
Size = 12
StartingRow = 1
RowIndex = StartingRow
Application.ScreenUpdating = False
For i = 0 To (2 ^ Size - 1)
Cells(RowIndex, "A") = Dec2Bin(i, 20)
RowIndex = RowIndex + 1
Next
Application.ScreenUpdating = True
End Sub
此外,了解 Excel's precision limits 也很重要如果你的数字足够大。
关于vba - 如何使用vba创建二进制序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292323/