• ベストアンサー

エクセルマクロの高速化をしたい

NNAQの回答

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.3

A列にリスト、B1セルに目標値を入力しておく。 目標値以下で最大になるような組み合わせを1つだけC列に書き出す。 (その目標値になるような組み合わせが何通りかあっても、1つだけしか出せない。) Sub BubunSyuugouWa() '部分集合和  Const n As Integer = 100 'リスト範囲=A1:An  Dim x As Long '目標値=B1セルの値  Dim Dic As Object, dicKey 'dictionary  Dim arr '配列  Dim xx As Long '途中経過  Dim i As Integer, j As Long  Set Dic = CreateObject("scripting.dictionary")  x = Range("b1").Value  arr = Range("a1").Resize(n).Value  With Dic   .Add 0, 0   i = 1 'To n   Do '計算開始    For Each dicKey In .keys     j = dicKey + arr(i, 1) 'j = 和     If j <= x And Not .exists(j) Then '和が目標値以下なら      .Add j, i '辞書に追加      If j > xx Then       xx = j       Application.StatusBar = xx '途中経過をステータスバーに表示       If j = x Then Exit Do '目標値ぴったりなら計算終了      End If     End If    Next    i = i + 1   Loop While i <= n   For i = n To 1 Step -1    If i = .Item(xx) Then     xx = xx - arr(i, 1)    Else     arr(i, 1) = ""    End If   Next i  End With 'Dic  Set Dic = Nothing  With Range("c1").Resize(n)   .Select: .Value = arr '組み合わせ出力  End With  Application.CommandBars("AutoCalculate").Controls(7).Execute  Application.StatusBar = False End Sub アルゴリズムは"動的計画法"っつーのです(多分)。 どのくらい時間かかるかは、データによるので一概に言えません。 30個位なら、あっという間に終わります。

sunusunu0
質問者

補足

レスありがとうございます。 できましたら、やはり、複数の組み合わせがでたほうがいいですね。 その合計を構成する数の組み合わせをリストから探しだすというのが もくてきですので、、、

関連するQ&A

  • エクセルのマクロでXになる組み合わせ

    エクセルのマクロで、例えばA列に1,8,3,7,5・・・といくつか数字があってXの合計になる組み合わせを表示するものを作りたいのですがなにか良い案がありましたら宜しくお願いします。 また、Xに一番近くなる合計の組み合わせもできましたらお願いします。

  • Windowsのタスク機能からExcelを開きマクロを実行しようと思っても、Excelがアクティブにならず、マクロが実行されない。

    仕事で、指定の時間にExcelで作ったマクロを実行し、帳票を作らなくてはなりません。 PCの前にいない時間に、自動的に実行される必要があります。 マクロはExcelを開くと同時に実行されるよう、「Auto_Open」を使いました。 あとは自動にこのExcelが開けばいいので、こちらで検索したところ、タスク機能を使うとExcelを指定の時間に開くことができると知り、試してみました。 http://oshiete1.goo.ne.jp/qa4146028.html しかし、Excelは開くのですが、アクティブの状態にはならず、マクロが実行されません。 タスク機能ではExcelを開いてマクロを実行することはできないのでしょうか? タスク機能は、ウィザードに従って設定してます。プロパティからは特に設定していません。 どなたか教えてください。 宜しくお願いします。

  • エクセルのマクロ初心者です

    http://okwave.jp/qa/q5955520.html こちらの回答は僕が探しているシフト表から抽出するための方法なのですが、 マクロ機能をまだ理解していないため、マクロを反映させるまでの方法を教えて頂きたいです。 もしよろしければお願いします。 このページですと出勤は○で表示されていますが、自分が作成しているのは、出勤時間(PM6時出勤なら18)という感じなので、また少し設定が変わるとは思います。    1日 山田16 井上 佐藤18 という感じで数字が書いてある作業員を抽出する感じになります。 もしよろしければ教えてください。

  • エクセルの合計値を導く数字の検索

    エクセルで、30個数字があるのですが そのうちのどれかを足した数字が、10500なんですが どの数字をたすと10500になるのかが分からないです。 30個の数字からいろんな組み合わせを想定して合計を10500に導くマクロか関数を教えていただけないでしょうか? アウトプットは、どの数字を組み合わせに選んだかがわかるようにしたいです。お願いします。

  • エクセルで組み合わせの計算式を使いたい

    エクセルで以下のような計算式を(最適な組み合わせの抽出)をしたいのですが? 表の中にある様々な単価から2以上の合計が一定額となる組み合わせを抽出したい。 もっと具体的にいうと、私が作った買いたい本のリストの中から、2以上の組み合わせで1500円となる組み合わせをエクセルから抽出したいのです。 よろしくお願いします。

  • 機種依存文字について

    携帯の入力フォームで、文字化けする場合があるので、 下記の記事を参考に、指定の文字のみを抽出しようと思っていまsすが、 どうすれば、よいでしょうか、よろしくお願いいたします。 http://oshiete1.goo.ne.jp/qa1802902.html

    • 締切済み
    • PHP
  • 再びエクセルのマクロについて

    前回、http://oshiete1.goo.ne.jp/kotaeru.php3?q=1179484で、質問させていただき、 だいぶ前に進みました。ありがとうございました。 さて、imogasiさんに誘導いただいた、 imogasiさんに、こちらのページを誘導していただき (http://okweb.jp/kotaeru.php3?q=113505) 拝見させていただきましたが、新たに疑問が出たのでまた教えてください。 例もそのまま移させてもらって実行しているつもりなのですが、(5)を自動でマクロで実行する、という部分がどうしても定義されていません。というエラーが出てしまいます。  また、印刷処理が済んだら、入力リストの欄外にでも、 ”済”印をつけるには、どのようにしたら良いのでしょうか。何度も申し訳ありませんが、よろしくお願いいたします。

  • エクセルで指定した数字以下の数字を抽出して抜き出す

    エクセルで指定した数字以下の数字を抽出して抜き出したいです 例としては A列 B列 いぬ 1 ねこ 2 うし 3 とら 1 はと 2 この表から空いているセルに任意の数字を入力して それ以下の数字を別のセルに抽出したいです たとえば2を入力したら いぬ 1 ねこ 2 とら 1 はと 2 このような結果を別のセルに抽出したいです オートフィルターとマクロは使わない方向でお願いします 似たような質問としては下のURLでしたが http://okwave.jp/qa/q3200952.html?from=recommend これでは指定した数字と同じものしか抽出出来なかったので質問させていただきました

  • エクセル:ワークシート関数、等比級数

    エクセルでの質問です。 セルA1に0から100未満の正の数が入っていて、 等比級数で、 =(1+A1/100)^0+(1+A1/100)^1+(1+A1/100)^2+(1+A1/100)^3 のような数式で、上の式では(1+A1/100)^N(例えばNがセルB1に入っていて、そこまで足す)ようなワークシート関数はないでしょうか?(もち、組み合わせで) 財務関数を転用して、できそうなきがしているのですが、うまくいきません。 他のページ:http://oshiete1.goo.ne.jp/qa1655468.htmlを、参考にすると、マクロを使うと出来るみたいなのですが、ワークシート関数の組み合わせだけでは無理なのでしょうか?

  • エクセルのマクロ読解について

    EXCEL2003を使用しています。 先日質問をした結果、見事なご回答をいただき、テスト検証では正常に動作したのですが、いざ自分が扱っているデータに置き換えた所、エラーになりましたので、マクロの読解をお願いいたします。 【先日の質問】 http://oshiete1.goo.ne.jp/qa3414824.html 【読解して欲しいマクロ】 ANo.1の方が記載されているマクロです。 【エラーの内容】 次のコードが黄色くなっています。 Range(Range("c7"), lstPJ).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=Range(Range("h7"), lstList), Unique:=False *この内容については、実際のデータを提示しないと、何処に何があるのか皆様には解らないと思いますが、念の為、記載しました。 お手数をおかけいたしますが、よろしくお願いいたします。