変化させるセルが変化しない

このQ&Aのポイント
  • マクロを使用してセルの値を変化させる方法について悩んでいます。特に、ソルバーを使用して係数を推定する際に問題が発生しています。
  • ソルバーを利用して係数を推定するために、ワークシートを使用して値を計算していますが、2回目以降の計算ではセルの値が更新されず、結果として係数を推定することができません。
  • 連動という概念についても疑問があります。連動は、設定した値に応じて自動的に追随することを指すのでしょうか。
回答を見る
  • ベストアンサー

変化させるセルが変化しない

お世話になります。 マクロ側のソルバー機能を利用して係数を推定しようと考えています。 係数の置き場所はワークシートです。計算値、実測値も同様です。 ただし、ワークシートに打ち出す計算値は外部dllで行います。 コードの概要は以下の通りです。 sub cal call 外部dll end sub optsolver For i = 1 To 100 Call cal SolverOk SetCell:="E18", MaxMinVal:=2, ValueOf:="0", ByChange:="D3:D4" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 Next i end 1回目のステップではワークシート上に計算値が得られるのですが、 2回目以降はセルの値(係数や計算値)が更新されませんし、結果として係数も推定できません。 100回くらい画面がちらついて、終わりの表示もなく終わります。 ここでいう係数と計算値は連動していないとソルバーは使えないと どこかで聞いたことがあるのですが、このためでしょうか。 (連動って、設定の数値を変えれば自動で追随することだろうとおもいます。) 使用環境は winxp pro sp2 excel 2003 です。

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

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

状況が今ひとつはっきりわからないのですが、推定すると以下のようなことでしょうか? ・係数を求めたい。よってこれを変化させるセル(D3:D4)に割り当てた。 ・計算値を実測値に近付けたいので、目的セル(E18)には計算値(あるいは計算値と実測値の近さを表す数値)が計算されるようになっている。 ・計算値は外部dllを用いて係数から算出する。そのため、係数(変化させるセル、D3:D4)を変更しただけでは目的セル(E18)の値は更新されない。そこで、外部dll呼び出しとソルバーを交互に繰り返し実行する質問文中のコードを書いて実行してみたがうまくいかない。 もしそうであれば、そのとおりうまくいきません。 質問者様も書かれている通り、ソルバーが正常に動作するには「ここでいう係数と計算値が連動している」必要があり、そういう状態にできないのであれば値の計算とソルバーを交互に行ってもうまくいきません。 (連動の意味も質問者様の理解で合っていると思います) 部外者の立場としては、外部dllでの計算をワークシートの数式で実現できないのか、と聞きたくなりますがおそらくだめなのでしょうね。 現実的な解決策ですが、ユーザー定義関数を作り、その中で外部dllを呼び出すようにし、ワークシートの数式にそのユーザー定義関数を用いて化させるセル(D3:D4)から目的セル(E18)を算出するようにしてはいかがでしょうか。 (もちろん、外部dllの呼び出しとソルバーの交互繰り返し実行はやめます)

takaminaseven
質問者

お礼

結論から言うと、完成しました! 私はqueuerev2様の回答で、世界が広がりました。結構悩んでいたので。 初めての投稿で返信がいただけるかどうか不安だったのですが、回答をいただける方に出会えたことを嬉しく思います。感謝です。

takaminaseven
質問者

補足

queuerev2様が上3分の1くらいで述べられたことは、まさにその通りです。 >質問者様も書かれている通り、ソルバーが正常に動作するには「ここでいう係数と >計算値が連動している」必要があり、そういう状態にできないのであれば値の計算 >とソルバーを交互に行ってもうまくいきません。 きっと評価関数が動けないと困るんでしょうね。 >部外者の立場としては、外部dllでの計算をワークシートの数式で実現できないのか、 >と聞きたくなりますがおそらくだめなのでしょうね。 おっしゃるとおりで、外部DLLは外せないですね。実はこの質問の意図は、エクセルのソルバーだけを利用したい、です。ですので、肝心の計算の中身はワークシートやマクロに記述せず外部DLLに集約させています。もちろんy=ax+bとかの簡易なモデル式ならばワークシートに直打ちした方が楽です。しかし、簡易でないときは面倒ですし、なによりもモデル記述の可能性を狭めてしまいますよね。これもまたエクセルの利用法の一つだと思うのです。

関連するQ&A

  • セル値のシート参照

    excel2010 セル値のシート参照がうまく動作しません。 構成は下記です。 ディスクトップにa.xlsmのファイル。シート名称はSheet1、シート計算は手動にしています。 Cドライブのtempフォルダにabc.xlsというファイルを登録しています。 C:\TEMP\abc.xls abc.xlsのファイルは、シート名称が(日付け)という構成です。 9/1だと(1)、9/23だと(23)の様になっています。 a.xlsmのファイルからマクロを使い、日付けに相当するシートを表示させようとしています。 a.xlsmのQ2セルには日付けのデータが入ります。表示形式は9/23みたく。 Q3セルは、="("&TEXT(Q2,"dd")*1&")" これで、日付けからabc.xlsファイルのシート名称を参照させる構成です。 作成したマクロは下記です Sub マクロからブックを開く2() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t ’Q3セル値を更新させる為に計算実行 Calculate Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate End Sub 上記だと、Q2セルの日付けを変えても1つ前の日付けで参照されます。 上記を2回そのまま実行すると正しく反映されます。 Debug.Print tでも更新されていないのが分かります。 なぜなのでしょうか? ちなみに、下記の様にマクロを分割すると、正しく表示されます。 Sub マクロからブックを開く() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t Calculate cal End Sub Sub cal() Dim t As String t = Range("Q3").Value Debug.Print t Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate 'Call カレントフォルダの表示 End Sub 上記の様に2つに分けると Debug.Print tで更新されていることが確認出来ます。 1つ目のマクロ マクロからブックを開く2 のおかしな内容の理由と対策内容を教えていただきたく、よろしくお願いします。

  • セルの選択について

    <Sheet2のコード> Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not UserForm3.Visible Then UserForm3.Show 0 UserForm3.TextBox1.Text = Selection.Count End Sub *********************************************** <UserForm3のコード> Private Sub CommandButton1_Click() With Selection .MergeCells = True .WrapText = True .Value = TextBox2.Text & ComboBox1.Text End With UserForm3.Hide End Sub ---------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, lastrw2 As Integer, i As Integer lastrw = Sheet3.Range("A1").End(xlDown).Row lastrw2 = Sheet3.Range("B1").End(xlDown).Row If Sheet2.Range(Cells(5, 4), Cells(5, 100)).Select Then ・・・(1) For i = 1 To lastrw - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 1).Value Next i End If If Sheet2.Range(Cells(6, 4), Cells(6, 100)).Select Then ・・・(2) For i = 1 To lastrw2 - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 2).Value Next i End If End Sub ************************************************* ワークシート上でマウスで選択されたセルの行ごとにUserForm3のComboBox1で表示させる文字を変えたいのですが、どのようにすればよいのでしょうか。 上の(1)(2)だととマウスで選択されたセルではなく(1)(2)の範囲のセルが結合されてしまいます。。。 また、今はワークシート上でマウスを左クリックする度にUserForm3が表示されてしまいます。 これをワークシート上でマウスでセルを選択して右クリックするとUserForm3が表示される ようにしたりすることは可能なのでしょうか。

  • VBの実行シーケンスについて

    お世話になります。 以下のような構造の場合 Sub1内の処理1が完了してから Sub2内の処理2が始まることは保証されるのでしょうか? また、Declareで定義したDLL呼出をCALLする場合、 CALLしたDLLの処理が終了するまでVBは待つのでしょうか? 基本的なところと思うのですが、開発したプログラムが不安なので、もしやと思い質問しました。 Sub Main() Sub1 Sub2 End End Sub Sub Sub1() 処理1 End Sub Sub Sub2() 処理2 End Sub

  • VBA エクセル 2003作成→2007実行について

    コマンドボタンを押すとソルバーが実行されるものを2003で作成したのですが、2007で実行しようとすると、 コンパイルエラー プロジェクトまたはライブラリが見つかりません。 と表示されて実行できません。 ご教授お願いします。 Private Sub CommandButton5_Click() SolverOk SetCell:="$E$176", MaxMinVal:=2, ValueOf:="0", ByChange:= _ "$D$173:$I$173,$H$167,$F$129:$J$129,$G$130:$J$130,$H$131:$J$131,$I$132:$J$132,$J$133" SolverSolve End Sub

  • マクロでソルバーを使えますか?

    VBAは未経験です。エクセルでソルバーをマクロで記録し、実行しようとしたらエラーメッセージが出てしまいました(コンパイルエラーsubまたは functionが定義されていません)。 マクロにソルバーを組み込むこと自体ができないのでしょうか? 宜しくお願いします。 Range("E4:M4").Select Selection.Copy Range("E11").Select ActiveSheet.Paste Range("E4:M4").Select Selection.Copy Range("E12").Select ActiveSheet.Paste SolverOk SetCell:="$E$7", MaxMinVal:=3, ValueOf:="20", ByChange:="$D$5:$K$5" SolverSolve Range("E4").Select End Sub

  • エクセルのマクロでのソルバーの使い方に関して教えてください。

    エクセルのマクロでのソルバーの使い方に関して教えてください。 下記のようなソルバーを含むマクロを組んでいます。(一部です。) SolverReset SolverOk SetCell:="$B$10", MaxMinVal:=3, ValueOf:="0", ByChange:="$M$46" a = SolverSolve(True) If a = 0 Then SolverFinish KeepFinal:=1 Else SolverFinish KeepFinal:=0 End If ソルバーを起動させ、"B10"が0になるように計算させ、 ソルバーの返り値をaに入れます。このとき、a=0の場合は、つまり最適値を得た場合のみ, 解を保存したく、a=0の場合、SolverFinish KeepFinal:=1で、保存するようにしています。  しかし、実際は、a=0の場合でも解を保存してしまい、元の値に戻せていません。  最適値を得られなかった場合に、元の値に戻したい場合は、どのように記載すれば良いでしょうか?  よろしくお願いします。

  • Evaluateを[ ]で代用するときの範囲指定

    質問を見ていただき、ありがとうございます。 VBAで、Evaluateを[ ]で代用して計算を行っています。 たとえばA1からA3のセルに数値が入っているとき、 A1からA3までの合計をメッセージボックスに出したければ ワークシート関数を利用して、以下のように書けます。 Sub Sum1() Dim Ans Ans = [SUM(A1:A3)] Call MsgBox(Ans) End Sub このとき、もし範囲を変数で指定したいならば どのように書けばよいのかが解らず、困っております。 たとえば、[ ]を使わずにEvaluateを使うのであれば 以下のようにできるのですが、あまり美しくない気がします。 Sub Sum2() Dim Ans, R R = "A1:A3" Ans = Evaluate("sum(" & R & ")") Call MsgBox(Ans) End Sub どなたか、ぜひ良い方法をご教授ください。

  • Excelのsolver実行の手間を省きたい

    Excel2000上でソルバーを使って関数のパラメータの最適値を求める作業をできるだけ自動的にできないでしょうか。 例えば、関数が一つだとしても、それを当てはめるべきデータのリストが100個あれば、ソルバーを手作業で100回実行しなければなりません。特に同じワークシートのなかで全ての作業を済ませようとすると、1回ごとに「目的セル」や「変化させるセル」を指定しなければなりません。当てはめを行うワークシートを独立に用意すればソルバーの実行自体は簡単になるかもしれませんが、そこにデータリストをコピーし結果をどこかに保存する手間がかかります。さらに、エクセルのマクロではソルバーは使えないと聞いております。なんとかならないものでしょうか。(OS:WindowsME)

  • エクセルマクロで以下の計算式どこが間違っているか教えてください。

    エクセルマクロで以下の計算式どこが間違っているか教えてください。 実行すると「オブジェクトが必要です。」と出ます。 Sub 計算() ' ' 計算 Macro ' Dim Acam Dim Bcam Dim Rp 'Rough Profit Dim Xscal Acam = Cells(ワークシート1!I4) Cells(ワークシート3!I4) = Acam ' Application.Goto Reference:="計算" End Sub

  • 自作DLLをエクセルVBAで使用したい

    こんにちは。 自作DLLをエクセルVBAで使用したいのですが、知識不足でうまく動かせません。どうぞお知恵をお貸しください。 例えば足し算をするCのプログラムを以下のように作ります。ファイル名は"wa.c"とします。 #define EXPORT __declspec(dllexport) __stdcall EXPORT double wa(double a,double b) { return(a+b); } これをコンパイルして、DLLファイル"test.dll"を作ります。 gcc -shared -o test.dll wa.c エクセルVBAのモジュールには次のように記述しました。 Declare PtrSafe Function wa Lib "test.dll" (ByVal a As Double, ByVal b As Double) As Double ここで作成した関数をワークシート関数として呼び出したいのですが、ワークシート上での返り値は常にゼロになってしまいます。例えば、ワークシートのセルに"=wa(1.2,3.5)"と記入すると、"4.7"を返してほしいところですが、ゼロとなってしまいます。ワークシート関数として正しく動作させるにはどうしたらよいでしょうか? ちなみに、この関数をエクセルVBAのサブルーチンで使うことはできます。例えばこんな感じです。 Sub test() x = 1.2 y = 3.5 Call MsgBox(wa(x, y)) End Sub また、上記の"test.dll"を他のCのプログラムから呼び出すことも正しくできます。 なお、64bitのエクセルを使っています。Cのコンパイラも64bitです。 どうぞよろしくお願いいたします。

専門家に質問してみよう