回答編集履歴
5
15 -> 14
answer
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
B列から順番にC列→D列...→O列まで各列の値を使用した場合と使用しなかった場合で、それぞれ解があるかを総当たりして、解があるかを算出します。
|
|
2
|
-
この場合、B列からO列まで最大
|
|
2
|
+
この場合、B列からO列まで最大14階層のLOOPになるので、そこは再帰関数の呼び出しという手法を用いて計算します。
|
|
3
3
|
詳しくはCalc2()関数のコメントを参照してください。
|
|
4
4
|
標準モジュールに以下のコードを入力してください。
|
|
5
5
|
```vb
|
4
15桁 → 14桁
answer
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
詳しくはCalc2()関数のコメントを参照してください。
|
|
4
4
|
標準モジュールに以下のコードを入力してください。
|
|
5
5
|
```vb
|
|
6
|
-
'Const MAX =
|
|
6
|
+
'Const MAX = 14
|
|
7
7
|
Public Function Calc(ByVal sum As Long, ByRef objRange As Range) As Long
|
|
8
8
|
Dim MAX As Long
|
|
9
9
|
MAX = objRange.Columns.Count
|
|
10
10
|
ReDim Values(1 To MAX) As Long 'B列からO列の値を格納する
|
|
11
11
|
Dim i As Long
|
|
12
12
|
For i = 1 To MAX
|
|
13
|
-
Values(i) = objRange.Cells(1, MAX + 1 - i) 'O列をindexの1、B列を
|
|
13
|
+
Values(i) = objRange.Cells(1, MAX + 1 - i) 'O列をindexの1、B列を14とする
|
|
14
14
|
Next
|
|
15
15
|
Calc = Calc2(MAX, sum, Values())
|
|
16
16
|
End Function
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
'[引数] i:右から何番目の列かを示す
|
|
20
20
|
' sum:iの右隣の列から右端列までの合計をいくつにしたいかの値を示す
|
|
21
21
|
' Values():B列からO列の値の配列
|
|
22
|
-
'[戻値] B列からO列のうち計算に使用した列を
|
|
22
|
+
'[戻値] B列からO列のうち計算に使用した列を14桁の2進数で示す(解が存在しない時は0とする)
|
|
23
23
|
'*****************************************************************************
|
|
24
24
|
Private Function Calc2(ByVal i As Long, ByVal sum As Long, ByRef Values() As Long) As Long
|
|
25
25
|
'マイナスの時は、解なし
|
|
@@ -60,14 +60,14 @@
|
|
|
60
60
|
End Function
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
P列にセル関数```=Calc(A1,B1:O1)```を入力して下さい
|
|
64
|
-
|
|
64
|
+
Q列にセル関数```=DEC2HEX(P1,4)```を入力して下さい
|
|
65
|
-
|
|
65
|
+
R列にセル関数```=HEX2BIN(LEFT(Q1,2),6) & HEX2BIN(RIGHT(Q1,2),8)```を入力して下さい
|
|
66
|
-
そうすると
|
|
66
|
+
そうするとR列に```11110001000000```のような14桁の2進数が表示されます
|
|
67
67
|
解がない場合はALL0となります
|
|
68
68
|
2進数に1のbitが立っている列が、計算対象となった列になります。
|
|
69
69
|
|
|
70
|
-
後はB1セルに条件付き書式を設定し、条件に```=MID($
|
|
70
|
+
後はB1セルに条件付き書式を設定し、条件に```=MID($R1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
|
|
71
71
|
|
|
72
72
|
**ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**
|
|
73
73
|
|
3
微修正
answer
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
詳しくはCalc2()関数のコメントを参照してください。
|
|
4
4
|
標準モジュールに以下のコードを入力してください。
|
|
5
5
|
```vb
|
|
6
|
-
Const MAX = 15
|
|
6
|
+
'Const MAX = 15
|
|
7
7
|
Public Function Calc(ByVal sum As Long, ByRef objRange As Range) As Long
|
|
8
|
+
Dim MAX As Long
|
|
9
|
+
MAX = objRange.Columns.Count
|
|
8
|
-
|
|
10
|
+
ReDim Values(1 To MAX) As Long 'B列からO列の値を格納する
|
|
9
11
|
Dim i As Long
|
|
10
12
|
For i = 1 To MAX
|
|
11
13
|
Values(i) = objRange.Cells(1, MAX + 1 - i) 'O列をindexの1、B列を15とする
|
2
要望追加
answer
CHANGED
|
@@ -67,4 +67,6 @@
|
|
|
67
67
|
|
|
68
68
|
後はB1セルに条件付き書式を設定し、条件に```=MID($S1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
|
|
69
69
|
|
|
70
|
-
**ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**
|
|
70
|
+
**ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**
|
|
71
|
+
|
|
72
|
+
また、非常に処理効率に興味があるので、何行でどれほどの処理時間となったか結果をお教え願います。
|
1
誤植
answer
CHANGED
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
解がない場合はALL0となります
|
|
66
66
|
2進数に1のbitが立っている列が、計算対象となった列になります。
|
|
67
67
|
|
|
68
|
-
後は
|
|
68
|
+
後はB1セルに条件付き書式を設定し、条件に```=MID($S1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
|
|
69
69
|
|
|
70
70
|
**ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**
|