[[20220112120555]] 『複数の数字の合計が、指定した範囲に収まるような』(生徒A) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数の数字の合計が、指定した範囲に収まるような組み合わせを全て求める』(生徒A)

質問失礼いたします。

A列に
10
20
30
40
50

とあります。
ここからいくつか選び、それらを足した数(Nとする)が、0≦N≦100であるとします。

この場合、出力されるものとして、
(10)
(20)
(10,20)
(20,20)



(50,50)
と、このようにパターンを書き出したいです。

そのようなVBAの作り方を教えていただければと思います。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


それらの要素のすべての組み合わせをつくる
↑から条件に合わないものを除外する
(参考) 2022/01/12(水) 12:36

重複を許すので、
数字1個を取り出すとき   5パターン
数字2個を取り出すとき  15パターン
数字3個を取り出すとき  35パターン
数字4個を取り出すとき  70パターン
数字5個を取り出すとき 126パターン
                  合計 251パターン
の場合について、100以下であるか否かをチェックして書き出す

このエクセルの学校の全文検索すると、組み合わせを書き出すVBAはでてくるとおもいます。
(Comb で検索) 2022/01/12(水) 13:15


Sub main()
'A列に上から数字を列挙、結果をB列に書き出し
Dim i As Long, j As Long, x As Long, y As Long, k As Long, tot As Long, z As String, comm As String, dt As Variant
Range("B:B").ClearContents
Range("B:B").NumberFormatLocal = "@"
x = WorksheetFunction.CountA(Range("A:A"))
ReDim dt(x)
dt = Range("A:A").SpecialCells(2)
j = 2 ^ x
For i = 1 To j - 1
    comm = ""
    y = i
    Do While y > 1
        comm = y - Int(y / 2) * 2 & comm
        y = Int(y / 2)
        DoEvents
    Loop
    z = Format("1" & comm, String(x, "0"))
    comm = ""
    tot = 0
    For k = 1 To x
        If Mid(z, k, 1) = 1 Then comm = comm & "," & dt(k, 1): tot = tot + dt(k, 1)
    Next k
    If tot >= 0 And tot <= 100 Then Range("B" & WorksheetFunction.CountA(Range("B:B")) + 1).Value = "(" & Mid(comm, 2) & ")"
Next i
End Sub
(mm) 2022/01/12(水) 14:20

ありがとうございます。
組み合わせを書き出すVBAについても検索してみます。
(生徒A) 2022/01/12(水) 15:25

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.