|
▼fool さん:
パターンごとの集計をSheetに列記する例を作ってみました。
予想に反し計算時間はそれほど掛かりませんがデータ個数20で
メモリ不足となります。
格納方法の工夫が必要ですね。
尚、数値→2進数、2進数→数値は
http://okwave.jp/qa5200.htmlよりお借りしています。
Sub test3()
Dim AA As Variant
Dim BB As Variant
Dim tmpStr As String
Dim lastR As Long
Dim i As Long, j As Long, k As Long, m As Long, C As Long
lastR = Range("B" & Rows.Count).End(xlUp).Row
AA = Range("B1:B" & lastR).Value
ReDim BB(lastR, 2 ^ lastR)
For j = 1 To lastR
For i = 1 To lastR + 1 - j
tmpStr = ""
For k = 0 To j - 1
tmpStr = tmpStr & AA(i + k, 1)
Next k
C = Bin2Num(tmpStr)
BB(j, C) = BB(j, C) + 1
Next i
Next j
For j = 1 To lastR
For i = 0 To 2 ^ lastR
If BB(j, i) > 0 Then
m = m + 1
Cells(m, 3).Value = "'" & Num2Bin(i, j - 1)
Cells(m, 4).Value = BB(j, i)
End If
Next i
Next j
End Sub
'数値→2進
Public Function Num2Bin(Value As Variant, n As Long) As Variant
Dim NVal As Long
Dim i As Long
If IsNumeric(Value) = False Then
Num2Bin = 0
Exit Function
End If
NVal = Val(Value)
For i = n To 0 Step -1
Num2Bin = Num2Bin & ((NVal And 2 ^ i) / (2 ^ i))
Next i
End Function
'2 進→数値
Public Function Bin2Num(Value As Variant) As Variant
Dim i As Long
Dim StrVal As String
Dim Cursor As Long
If IsNumeric(Value) = False Then
Bin2Num = 0
Exit Function
End If
StrVal = CStr(Value)
Cursor = 0
For i = Len(StrVal) To 1 Step -1
Select Case Mid$(StrVal, i, 1)
Case "0"
Bin2Num = Bin2Num + 0
Case "1"
Bin2Num = Bin2Num + (2 ^ Cursor)
Case Else
Bin2Num = 0
Exit Function
End Select
Cursor = Cursor + 1
Next i
End Function
>皆様、お忙しいところ申し訳ありません。
>
>恐れ入りますが、下記のようなパターンを調べたい場合、
>どのようにマクロを作成すれば良いかお教えいただけますでしょうか。
>
>A B
>1 1
>2 0
>3 1
>4 1
>5 0
>6 0
>7 1
>8 0
>9 1
>・ ・
>・ ・
>
>↑上記のようにB列にランダムに1と0が並んでいる場合を考えます。
>この時、"101"や"01001"など、様々な0と1の組み合わせパターンについて、
>個数を数えるVBAを作成したいと考えております。
>
>COUNTIFだと連続するセルの個数などを調べるには無力ですし、
>VBA初心者の自分には敷居が高すぎて困っております。
>お手数ですが、ご教示のほどをよろしくお願いいたします。
|
|