• ベストアンサー

エクセルで出来ますか?

エクセルを使い以下の様な事が出来ますか? AとBが物々交換する時に A:○○円X△個=a1   △○円X△個=a2   a1+a2+・・・・・=A B: ○円X△個=b1   ○○円X△個=b2   b1+b2・・・・ =B   と成った場合、A-BもしくはB-Aが限りなく0に成るように   自動的に個数を発生させるような事出来ませんか?   それぞれの品数は5品目以下位で十分です。

質問者が選んだベストアンサー

  • ベストアンサー
noname#102340
noname#102340
回答No.4

品物 5種類以下 各品物の個数 20個以下 金額の合計 数百万円以内 上のように問題を小規模なものに限定すれば単純なループ処理でも可能かと思われます。 (5種類,20個だと20^5=3200000回ループが必要) 使い方 A列1行目からAの各品物の値段を入力する B列1行目からBの各品物の値段を入力する Private Sub a_b()を実行する 以上 C,D,Eに結果が出力されます。 エラー処理はほとんどしていません。プログラムが暴走した場合はEscで中断する等ご自身で判断してください。 Option Explicit Dim acnt As Long, bcnt As Long, lmt As Long, g As Long Dim ap() As Long, bp() As Long, sumP() As Byte Dim col As New Collection Private Sub a_b() Dim i As Long, j As Long, k As Long acnt = InputBox("Aの品数を入力してください", Default:=5) bcnt = InputBox("Bの品数を入力してください", Default:=5) lmt = InputBox("品数の上限を入力してください", Default:=5) ReDim ap(acnt - 1) ReDim bp(acnt - 1) For i = 0 To acnt - 1 ap(i) = Cells(i + 1, 1) j = j + ap(i) * lmt Next i For i = 0 To bcnt - 1 bp(i) = Cells(i + 1, 2) k = k + bp(i) * lmt Next i i = j: If j < k Then i = k k = (10 ^ 6) * 5 If lmt ^ acnt > k Or lmt ^ bcnt > k Or i > k Then MsgBox "データが大きすぎるので処理を中止します", vbOKOnly: End ReDim sumP(i) Range("C1:E" & Rows.Count).ClearContents: g = 0 getab 0, ap(), 0, "", acnt, True getab 0, bp(), 0, "", bcnt, False Set col = Nothing End End Sub Private Sub getab(ix As Long, pary() As Long, p As Long, s As String, lst As Long, flga As Boolean) Dim i As Long If ix <> lst Then For i = 1 To lmt getab ix + 1, pary(), p + pary(ix) * i, s & CStr(i) & ",", lst, flga Next i Else If flga Then geta p, s If Not flga Then getb p, s End If End Sub Private Sub geta(p As Long, s As String) If sumP(p) = 0 Then sumP(p) = 1: col.Add s, CStr(p) End Sub Private Sub getb(p As Long, s As String) If sumP(p) = 1 Then g = g + 1: Cells(g, 3) = col.Item(CStr(p)): Cells(g, 4) = s: Cells(g, 5) = p End If End Sub

sugana
質問者

お礼

有難うございました。 何とか成りそうですので使わせていただきます。 御礼が遅くなり申し訳ありませんでした

その他の回答 (3)

  • warumx
  • ベストアンサー率0% (0/9)
回答No.3

Excel関数だけでは難しいかもしれません。 Excelソルバーを使うならば可能です。 線形計画法として解くと2回実行することになって面倒なので 非線形計画法として解くと1回で済みます。 データの数値をもう少し具体的に挙げてみて下さい。

sugana
質問者

お礼

有難うございます。 例をあげていただいている様な事です

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

どの項目が決っていて、どの項目を選択できるのか質問に書かないとダメでは。 品物は一定の中から選択可能か。 AグループとBグループの手持ちは、品物が決っているのだよね。1以上か? 単価はそれら品物に付随した既定条件だろう。 個数が選択できるのかな。1以上か? === 一般にこのような問題は、エクセルの問題ではない。処理ロジックとかを考えるのは、数学的素養のはず。数学の関連カテに質問すべきだ。そろばんを使うからといってそろばんの問題ではないように エクセルの問題ではないよ。線形計画とかに関連するのかな。とかく 決った式で値を計算するだけのエクセルの問題ではない。 === エクセルにも、ソルバーやゴールシークなどあるが、多分無理ではないかな。 ソルバーでの問題 http://www-cc.gakushuin.ac.jp/~e931039/solver.htm と、質問の課題は共通点があるかな。

sugana
質問者

補足

有難うございました。 データ等の補足です。 最初にAさん、Bさん共に同じデータベースを使用して交換する物を 選択します、価格は決まっており、(選択はおそらく5種類位) 単価はそれらの品物に付随している。 個数は整数で1以上。 これくらいが条件ですが

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.1

LCM関数(最小公倍数)で出来ます。 添付資料を参照ください。 B3 =LCM($B$2,$C$2,$D$2,$E$2)/B$2 LCM関数を使う際、何か設定をする必要があった気がします。 設定方法は、検索をかけて調べてください。

sugana
質問者

お礼

有難うございました。 参考にさせていただきます

関連するQ&A