1Sub sample()
2 Dim ws As Worksheet
3 Set ws = Worksheets(1)
45 Dim ws2 As Worksheet
6 Set ws2 = Worksheets.Add(, ws)
7 ws2.Range("B1").Formula2 = "=1*MID(HEX2BIN(LEFT(DEC2HEX(ROW(B1:B16383),4),2),6)&HEX2BIN(RIGHT(DEC2HEX(ROW(B1:B16383),4),2),8),COLUMN(B1:O1)-1,1)"
8 ws2.UsedRange.Value = ws2.UsedRange.Value
910 Dim i, j, v, r, arr
11 With WorksheetFunction
12 For i = 1 To ws.Range("A" & ws.Rows.Count).End(xlUp).Row
13 v = ws.Range("A" & i).Value
14 ws2.Range("A1:A16383").Formula = "=SUMPRODUCT(B1:O1," & ws.Range("B" & i & ":O" & i).Address(, , , True) & ")"
15 If .CountIf(ws2.Range("A1:A16383"), v) > 0 Then
16 r = .Match(v, ws2.Range("A1:A16383"), 0)
17 For j = 2 To 14
18 If ws2.Cells(r, j) = 1 Then ws.Cells(i, j).Interior.Color = vbYellow
19 Next
20 End If
21 DoEvents
22 Next
23 End With
24 Application.DisplayAlerts = False
25 ws2.Delete
26 Application.DisplayAlerts = True
27 ws.Activate
28End Sub
1'Const MAX = 142PublicFunction Calc(ByVal sum AsLong,ByRef objRange As Range)AsLong3Dim MAX AsLong4 MAX = objRange.Columns.Count
5ReDim Values(1To MAX)AsLong'B列からO列の値を格納する6Dim i AsLong7For i =1To MAX
8 Values(i)= objRange.Cells(1, MAX +1- i)'O列をindexの1、B列を14とする9Next10 Calc = Calc2(MAX, sum, Values())11EndFunction1213'*****************************************************************************14'[引数] i:右から何番目の列かを示す15' sum:iの右隣の列から右端列までの合計をいくつにしたいかの値を示す16' Values():B列からO列の値の配列17'[戻値] B列からO列のうち計算に使用した列を14桁の2進数で示す(解が存在しない時は0とする)18'*****************************************************************************19PrivateFunction Calc2(ByVal i AsLong,ByVal sum AsLong,ByRef Values()AsLong)AsLong20'マイナスの時は、解なし21If sum <=0Then22ExitFunction23EndIf2425If sum = Values(i)Then26'i列の値が、計算したい合計と等しい時は、該当列にbitを立てる27 Calc2 =2^(i -1)28'これより右の列の値は使用しないので計算を打ち切る29ExitFunction30EndIf3132'一番右端の列の時は、計算終了33If i =1Then34ExitFunction35EndIf3637Dim Result AsLong3839'i列目を使用すると仮定して右隣の列から右端の列まで解があるか試行する40 Result = Calc2(i -1, sum - Values(i), Values())41If Result <>0Then42'自らの列の位置の2進数にbitを立てる43 Calc2 = Result +2^(i -1)44ExitFunction45EndIf4647'i列目を使用すると仮定したら解がなかったので、今度は不使用と仮定して、右隣の列から右端の列まで解があるか試行する48 Result = Calc2(i -1, sum, Values())49If Result <>0Then50 Calc2 = Result
51ExitFunction52EndIf5354'解なし55EndFunction