• 締切済み

どのような関数を使えばいいか分かりません(訂正版)。

以前、スレ立てたのですが質問の内容に間違いがあったので訂正して再度質問させていただきます。 Excelでちょっとした計算をしたいのですが、どのような関数を使えばいいか分かりません。 例) 2,490 31,520 40,890 20,930 75,660 11,320 44,160 例えば上記のような数値が各セルにあるとします。 で、この数値のうちどれかの「和」が 63,770 になるはずですが、どの行の数値がその対象になっているか調べるにはどうしたら良いのでしょう? 「なるはずと」と書きましたが、ならない場合もあるかもしれません。 場合によっては何通りも抽出できるので関数を使うだけではダメなのでしょうか?

みんなの回答

noname#95859
noname#95859
回答No.6

A No2で書き込みをしたものです。 もう少し考えて、改良しました。 答えは1つの組合せに対し複数行でてくることはないです。 従って、No5のマクロは不要です。 (つまり、処理時間も大幅に改善されています) 100行のデータに対し、No5は、約70秒、今回のロジックでは約9秒でした。 ---------------------------- Sub Macro1() Target = 63770 Count = 0 Worksheets("Sheet2").Cells.ClearContents E_rowpos = Worksheets("Sheet1").Cells(65536, 1).End(xlUp).Row hani = "A1:A" & E_rowpos myArray = Worksheets("Sheet1").Range(hani).Value For i = 1 To E_rowpos If myArray(i, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) End If If myArray(i, 1) < Target Then '-------------------------------------------------------------2つの場合 For j = i + 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) End If If myArray(i, 1) + myArray(j, 1) < Target Then '----------------------------------3つの場合 For k = j + 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) Worksheets("Sheet2").Cells(Count, 3).Value = myArray(k, 1) End If If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) < Target Then '-------4つの場合 For l = k + 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) + myArray(l, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) Worksheets("Sheet2").Cells(Count, 3).Value = myArray(k, 1) Worksheets("Sheet2").Cells(Count, 4).Value = myArray(l, 1) End If Next l End If Next k End If Next j End If Next i End Sub ------------------- 本問題は、再帰プログラムを考えるのに適していると思います。 ハノイの塔は、典型的な「再帰プログラム」の例ですが、 本件にも適用できるのではないかと、推測します。

全文を見る
すると、全ての回答が全文表示されます。
noname#95859
noname#95859
回答No.5

A No.2 で書き込みをした者です。 3つの和のケースが差し当たり、今回の回答であるとして、 VBAのチェック結果が、多数出てきてしまった対策です。 前回のマクロ Macro1を走らせた後で、以下に記述する Macro2を走らせてください。 結果は、ユニークなものだけとなります。 但し、大前提は、4つの数字の「和」までです。 -------------------------------------------- Sub Macro2() With Worksheets("Sheet2") E_rowpos = .Cells(65536, 1).End(xlUp).Row For i = 1 To E_rowpos '--------------横方向で並び替え hani = Range(.Cells(i, 1), .Cells(i, 1).End(xlToRight)).Address .Range(hani).Sort Key1:=.Rows(i), Order1:=xlAscending, Orientation:=xlLeftToRight Next '-----------------------------------------------横方向で並び替え .Cells.Sort _ Key1:=Columns("B"), Order1:=xlAscending, _ Key2:=Columns("C"), Order2:=xlAscending, _ Key3:=Columns("D"), Order3:=xlAscending, _ Orientation:=xlTopToBottom .Cells.Sort _ Key1:=Columns("A"), Order1:=xlAscending, _ Key2:=Columns("B"), Order2:=xlAscending, _ Key3:=Columns("C"), Order3:=xlAscending, _ Orientation:=xlTopToBottom For i = E_rowpos To 2 Step -1 myArrayL = Range(.Cells(i, 1), .Cells(i, 1).End(xlToRight)).Value myCountL = Range(.Cells(i, 1), .Cells(i, 1).End(xlToRight)).Count myArrayU = Range(.Cells(i - 1, 1), .Cells(i - 1, 1).End(xlToRight)).Value myCountU = Range(.Cells(i - 1, 1), .Cells(i - 1, 1).End(xlToRight)).Count If myCountL = myCountU Then flag = 0 For j = 1 To myCountL If myArrayL(1, j) <> myArrayU(1, j) Then flag = 1 Next If flag = 0 Then .Cells(i, 1).EntireRow.Delete End If Next End With End Sub

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

こんにちは。 前のスレッドで回答を書き込んだものです。 前の回答を少し変更すれば和にも対応出来ますよ。 =SUMIF($A:$A,63770-A1) 先の回答と同じ様に、相手がいない場合は0、相手方の数値があれば B列に表示されます。 0を表示させない時は =IF(=SUMIF($A:$A,63770-A1)=0,"",=SUMIF($A:$A,63770-A1)) としてください。

sttf
質問者

お礼

たびたびご回答ありがとうございます。 質問が説明不足で申し訳ありません。 「例)」の場合ですと31520、 20930、 11320の3つが答えになるように、何通りの答えが出るかは分からない場合でした。 僕もいろいろ考えましたが関数を使っても記述が果てしなく長くなりそうではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

仮にA1からA7に数値がならんでいるとしたら B1に =MATCH(63770-A1,$A$1:$A$7,0) と入れて、B7まで式をオートフィルでコピーしてください。 該当があればその行番号を、なければ#N/Aを返します。

sttf
質問者

補足

回答ありがとうございます。 質問が曖昧だったので申し訳ありません。 例)の場合ですと、7つの数値の内2つ以上の数値の「和」が63,770になるときの、その2つ以上の数値に該当するものと言う意味でした。

全文を見る
すると、全ての回答が全文表示されます。
noname#95859
noname#95859
回答No.2

「和」ということで、力ずくでやってみました(総当たり法のVBA) 結果は、31520、 20930、 11320 ------------------------------------- 前提 4つの「和」までチェックする Sheet1のA1から下方に向かって数値が入っているものとします Sheet2が存在すること(結果が入ります) ------------------------------------- Sub Macro1() Target = 63770 Count = 0 E_rowpos = Worksheets("Sheet1").Cells(65536, 1).End(xlUp).Row hani = "A1:A" & E_rowpos myArray = Worksheets("Sheet1").Range(hani).Value For i = 1 To E_rowpos If myArray(i, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) End If If myArray(i, 1) < Target Then '---------------------------------------2つの場合 For j = 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) End If If myArray(i, 1) + myArray(j, 1) < Target Then '------------------3つの場合 For k = 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) Worksheets("Sheet2").Cells(Count, 3).Value = myArray(k, 1) End If If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) < Target Then '-------4つの場合 For l = 1 To E_rowpos If myArray(i, 1) + myArray(j, 1) + myArray(k, 1) + myArray(l, 1) = Target Then Count = Count + 1 Worksheets("Sheet2").Cells(Count, 1).Value = myArray(i, 1) Worksheets("Sheet2").Cells(Count, 2).Value = myArray(j, 1) Worksheets("Sheet2").Cells(Count, 3).Value = myArray(k, 1) Worksheets("Sheet2").Cells(Count, 4).Value = myArray(l, 1) End If Next l End If Next k End If Next j End If Next i End Sub やってみれば、わかりますが、Sheet2には、6行にわたって、出てきてしまいました。3つの順列=6通りです。 判っていたのですが、やっていません。 もし、結果が[3つの数字の和]で10種類もあるとするともうそれだけで、120行出てきてしまいます。対策用のVBAを考えなければいけませんが・・・

sttf
質問者

お礼

「力ずく」で、ありがとうございました(^_^; あまりVBの知識がないのですが、考え方としては理想通りです。 しかし、100以上のデータで実行しようとしてましたので結局は果てしない計算の繰り返しが必要なんで、結果的にシート1枚に収まらないかもしれません(^_^; No5のご回答も参考にさせていただきました。

全文を見る
すると、全ての回答が全文表示されます。
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

どれか2つの数の和の問題でしたら、       2,490 31,520 40,890 20,930 75,660 11,320 44,160 2,490 31,520 40,890 20,930 75,660 11,320 44,160 の表でそれぞれの組み合わせの和が網羅できます。 =IF($A2+B$1=63770,"○","") とかの式で検出できるでしょう。 -- 複数の数値を選択する場合ですと、解析的に解くのは困難で、線形計画法などの手法が必要になります。 ちなみに、その問題は、そういう分野でよく取り扱われる「ナップザック問題」です。 ナップザック問題をExcelで解く http://www.geocities.co.jp/SiliconValley-Oakland/8139/ のサイトに方法やVBAのプログラムが紹介されています。 簡潔ですが、実用的な内容になっていますね。 質問のデータ件数であれば、 | 1.手当たり次第法 で十分でしょう。 データ数が100とか以上になる場合、 | 2.総当たり法 | 3.動的計画法 で解くのが現実的です。

sttf
質問者

お礼

回答ありがとうございます。 「ナップザック問題」と言う言葉は始めて聞きましたが、まさにこのような問題です。 実はデータが100以上になるので、普通に考えれば答えが複数発生してしまうのであまり意味ないですね。 一応、上記のVBAを試してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • どのような関数を使えばいいかわかりません。

    Excelでちょっとした計算をしたいのですが、どのような関数を使えばいいか分かりません。 例) 2,490 31,520 40,890 20,930 75,660 11,320 44,160 例えば上記のような数値が各セルにあるとします。 で、この数値のうちどれかの積が 63,770 になるはずですが、どの列の数値がその対象になっているか調べるにはどうしたら良いのでしょう? 「なるはずと」と書きましたが、ならない場合もあるかもしれません。 場合によっては何通りも抽出できるので関数を使うだけではダメなのでしょうか?

  • エクセル 関数 別シートへの抽出

    エクセル関数について質問します。 「数値の入ったセルだけを、その行ごと丸々別シートに抽出する方法」 について教えてください。 例、C列に空白セルと1、2や3など、数値の入ったセルがあります。空白セル以外の数値の入ったセルを、その行ごと別シートに抽出したい。 C3とC5に数値が入ってる→3行目と5行目を別シートに抽出する。 このようなことは関数でできるのでしょうか? マクロでないと無理でしょうか? お力をお貸しください。 よろしくお願いします。

  • エクセル関数の書き方、入力方法

    エクセル関数の初心者です。関数の書き方で下記の内容について教えて下さい。 例えば、1行のセルA1~P16の表に入力された数値(1~3桁)で、少ない数値を5個を自動的に抽出し、その平均値を出す関数の書き方が分かりません。 但し、表中に同じ少ない数値が複数有る場合、その複数を含め5個抽出する式としたいのですが、どのような関数とすればよいでしょうか。

  • エクセル関数 イレギュラーな表示への対応

    関数でSUMやMAX他、様々関数を使う場合に、計算対象のセルの中身が ・何もない ・スペース ・文字 だった場合にどのように処理するか、例えばゼロとして扱うとか、除外するとか、エラー表示になるとか、事前に分るのでしょうか?実際に試せば分りますが、法則があるなら知っておいた方が簡単だと思うので。 自分でもハッキリ問題抽出出来てませんが、「数値を扱う関数で、数値でないセルがあったらどうなるか?」です。

  • エクセル 種類の個数をカウントする関数はありますか

    エクセル2002を使用しています。 重複データはひとつの種類として、範囲内のデータの種類数を計算したいのですが、どのようにすべきでしょうか? この範囲内には、ところどころ空白セルがあります。 例 B列 3行  10 4行  11 5行  12 6行 7行  15 8行 9行  15 10行  18 これで、B3からB10の範囲の種類別のデータの数は5です。 これを関数で計算したいのです。 本当は対象データが多いので、とりあえず、ピボットテーブルをかけて、抽出されたデータの一覧から使用した行数を数えて正解の数はわかりましたが、こんな方法はエクセルらしくないですよね。 また、データが数値でなかった場合も、関数で求められるでしょうか? 例 B列 3行  鈴木 4行  鈴木 5行  佐藤 6行 7行  高橋 8行 9行  高橋 10行  野口 この場合は、鈴木・佐藤・高橋・野口 で、データの種類の個数は4です。 これを関数で求めたいのです。 よろしくお願いします。

  • Excelの関数?で困っています。

    Excelの関数?で困っています。 こんにちは。Excel2007を使用しています。 セルの中にある特定の文字が含まれている場合は、ある文字の後ろの数値を抽出するということはできますか? 例えば、セルA1に『AA-11 $100.00』、A2に『BB $ 95.00』と入力されている場合、『AAという文字が含まれている場合はB1に$マークの後ろの数値を抽出、BBという文字が含まれている場合はC1に$マークの後ろの数値を抽出する』というものを関数などを使用して作ることはできるのでしょうか? もしできるのであれば、ぜひご教示ください。 宜しくお願いします。

  • エクセル関数で条件が二つの時の数値抽出

       列方向のそれぞれ三つのセルに数値が入った78行  (75行から152行)のテーブルがあります。       今,これらと異なる列方向の三つのセルの内の左側二  つに,テーブル内の任意の行の数値をそれぞれ選択した  時,残るセルにテーブル内の残された行の数値を抽出し  たいと思いますがうまくいきません。      何方かエクセル関数で出来る方法を教えていただけま  せんか。   なお,選択行は4行だけとしており,これらを連続させず  に一行毎に設け,各行毎の抽出セルにDSUMで計算式を  作成すると数値の抽出ができますが,この方法は避けた  いと思います。     (数値選択列)(抽出列)   (テーブル)   73行 X  ,Y   ,Z      , AA  ,AB  ,AC   74行開始 終了 期間     開始 終了 期間   75行,0005 ,0011 ,0010 (空欄),0004 ,0012 ,0010   76行,0007 ,0009 ,0010 (空欄),0005 ,0011 ,0010   77行,0004 ,0011 ,0009 (空欄),0006 ,0010 ,0010 (空78行,0008 ,0003 ,0004 (空欄),0007 ,0009 ,0010  --------------------(空欄),0004 ,0011 ,0009 (空79行(空            欄),0005 ,0010 ,0009 (空80行(空            欄),0006 ,0009 ,0009 (空                 欄),0007 ,0005 ,0006 (空152行(空           欄),0008 ,0003 ,0003    以上で,(空,あるいは(空欄)乃至は数字で00を含む4  桁としているのは,文字化けを避けるために便宜上入れた  もので,数値そのものは2桁の範囲です。                   何度もトライしておりますができません。どうかよろしくお  願いします。なお,エクセルVBAによる方法もお教えいただ  ければ有難いです。

  • エクセル関数:他と異なる値が入っている行の抽出

    エクセル関数:他と異なる値が入っている行の抽出 商品の注文データがありまして、 同じ商品でも違う価格が入っている場合の注文があります。 この注文について抽出して、セルにフラグを付けたいのですが・・・ 詳しい方がいましたら計算式を教えて頂けないでしょうか? 添付画像のように、 同じネクタイでも、価格が違う(少数派)の行について、 フラグを立てて抽出したいです。 何卒、よろしくお願いしいます。

  • エクセル関数について

    エクセル関数について質問です。 簡単に説明すると特定のセルに特定の数値を入力するとその行の別のセルの数値を別のセルに表示させたい。 たとえば     A      B       C 1  100            2  200      1      100 3  300      1      300 4  400 5  合計            400 上記の様になっていた場合 A列は定数で固定です。B列のセルに1と入力(1でなくてもよい)した行のA列の数値を Cに表示したいのですが、 C列にどの様な関数を使ったらいいんでしょうか?宜しくお願い致します。

  • エクセル関数について

    現在エクセル関数を勉強しだしたところですが、 一つのセルに条件付の計算式をいれたい場合に どうすればよいか困っています。 たとえば、A,B,Cという数値が1行に並んでおり、 A、B、Cの数をカウントして、合計のセルに (Aの数×5)+(Bの数×4)+(Cの数×3) という答えを関数で出したい場合はどうすれば よいのでしょうか? 本やヘルプで調べてもいまいちわかりません。 IF関数を使う? 初心者なので詳しく教えていただけたらと 思います。

専門家に質問してみよう