質問するログイン新規登録

回答編集履歴

5

15 -> 14

2021/11/16 13:46

投稿

takanaweb5
takanaweb5

スコア367

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  B列から順番にC列→D列...→O列まで各列の値を使用した場合と使用しなかった場合で、それぞれ解があるかを総当たりして、解があるかを算出します。
2
- この場合、B列からO列まで最大15階層のLOOPになるので、そこは再帰関数の呼び出しという手法を用いて計算します。
2
+ この場合、B列からO列まで最大14階層のLOOPになるので、そこは再帰関数の呼び出しという手法を用いて計算します。
3
3
  詳しくはCalc2()関数のコメントを参照してください。
4
4
  標準モジュールに以下のコードを入力してください。
5
5
  ```vb

4

15桁 → 14桁

2021/11/16 13:46

投稿

takanaweb5
takanaweb5

スコア367

answer CHANGED
@@ -3,14 +3,14 @@
3
3
  詳しくはCalc2()関数のコメントを参照してください。
4
4
  標準モジュールに以下のコードを入力してください。
5
5
  ```vb
6
- 'Const MAX = 15
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列を15とする
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列のうち計算に使用した列を15桁の2進数で示す(解が存在しない時は0とする)
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
- Q列にセル関数```=Calc(A1,B1:P1)```を入力して下さい
63
+ P列にセル関数```=Calc(A1,B1:O1)```を入力して下さい
64
- R列にセル関数```=DEC2HEX(Q1,4)```を入力して下さい
64
+ Q列にセル関数```=DEC2HEX(P1,4)```を入力して下さい
65
- S列にセル関数```=HEX2BIN(LEFT(R1,2),7) & HEX2BIN(RIGHT(R1,2),8)```を入力して下さい
65
+ R列にセル関数```=HEX2BIN(LEFT(Q1,2),6) & HEX2BIN(RIGHT(Q1,2),8)```を入力して下さい
66
- そうするとS列に```111100010000000```のような15桁の2進数が表示されます
66
+ そうするとR列に```11110001000000```のような14桁の2進数が表示されます
67
67
  解がない場合はALL0となります
68
68
  2進数に1のbitが立っている列が、計算対象となった列になります。
69
69
 
70
- 後はB1セルに条件付き書式を設定し、条件に```=MID($S1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
70
+ 後はB1セルに条件付き書式を設定し、条件に```=MID($R1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
71
71
 
72
72
  **ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**
73
73
 

3

微修正

2021/11/16 13:43

投稿

takanaweb5
takanaweb5

スコア367

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
- Dim Values(1 To MAX) As Long 'B列からO列の値を格納する
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

要望追加

2021/11/16 13:33

投稿

takanaweb5
takanaweb5

スコア367

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

誤植

2021/11/16 12:37

投稿

takanaweb5
takanaweb5

スコア367

answer CHANGED
@@ -65,6 +65,6 @@
65
65
  解がない場合はALL0となります
66
66
  2進数に1のbitが立っている列が、計算対象となった列になります。
67
67
 
68
- 後はB2セルに条件付き書式を設定し、条件に```=MID($S1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
68
+ 後はB1セルに条件付き書式を設定し、条件に```=MID($S1,COLUMN(A1),1)*1=1```を設定し、必要な範囲に適用します。
69
69
 
70
70
  **ロジックや計算に誤りがあるかもしれませんので、くれぐれも良く検証して確認下さい。**