「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2033
現在:2


ソルバーのマクロでの記述方法

ページOpenOffice.org FAQの登録ページ
投稿者匿名
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-09-04 13:24:56 (金)
OSWindows XP
依存するページhttp://api.openoffice.org/docs/common/ref/com/sun/star/sheet/Solver.html
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

ソルバーの処理をマクロの記録で記録できないため、UNO APIを使用してマクロを記述したいのですが、設定の仕方がよくわかりません。

.プションの設定はどのように記述すればよいのでしょうか? ◆峽覯未虜播化」で値の指定はどのように記述すればよいのでしょうか?

よろしくお願い致します。


ポイントということですが

M.Kamataki (2009-09-04 17:45:19 (金))

たぶんまだ英語の情報しかないと思います。以下のOpenOffice.org Communty Forumのやりとりなどが参考にならないでしょうか。

[Solved] Solver Macro
http://user.services.openoffice.org/en/forum/viewtopic.php?f=9&t=16980

無題

tani (2009-09-07 09:55:54 (月))

↓だいたいこんな感じです。

Sub Main

 oSolver = CreateUnoService("com.sun.star.sheet.Solver")
 oSolver.Document = ThisComponent
 
 ' ターゲットセル
 oSolver.Objective = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("D5").getCellAddress()

 ' 変更されるセル
 Dim Arr_1(2) As New com.sun.star.table.CellAddress
 Arr_1(0) = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C2").getCellAddress()
 Arr_1(1) = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C3").getCellAddress()
 Arr_1(2) = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C4").getCellAddress()
 oSolver.Variables = Arr_1
 
 ' 最大値
 oSolver.Maximize = True

 ' 制限条件 D5<=5000, C5=40, C2・C3・C4は整数
 Dim Arr_2(4) As New com.sun.star.sheet.SolverConstraint
 Arr_2(0).Left = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("D5").getCellAddress()
 Arr_2(0).Operator = com.sun.star.sheet.SolverConstraintOperator.LESS_EQUAL
 Arr_2(0).Right = 5000
 Arr_2(1).Left = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C5").getCellAddress()
 Arr_2(1).Operator = com.sun.star.sheet.SolverConstraintOperator.EQUAL
 Arr_2(1).Right = 40
 Arr_2(2).Left = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C2").getCellAddress()
 Arr_2(2).Operator = com.sun.star.sheet.SolverConstraintOperator.INTEGER
 Arr_2(3).Left = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C3").getCellAddress()
 Arr_2(3).Operator = com.sun.star.sheet.SolverConstraintOperator.INTEGER
 Arr_2(4).Left = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("C4").getCellAddress()
 Arr_2(4).Operator = com.sun.star.sheet.SolverConstraintOperator.INTEGER
 oSolver.Constraints = Arr_2

 ' ソルバー実行
 oSolver.solve()

 If oSolver.Success = True Then
   Msgbox "ターゲット値は" & oSolver.ResultValue
   Arr_3 = oSolver.Solution 
   MsgBox "変数値は" & Arr_3(0) & ":" & Arr_3(1) & ":" & Arr_3(2) & "です。"
 End If

End Sub

無題

tani (2009-09-07 10:00:44 (月))

各プロパティやらメソッドやら構造体(の配列)やらENUMやらの説明は以下にあります。
http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XSolver.html

なお簡単な連立方程式とか整数問題とかだったらソルバーの機能を使用するよりも普通に計算プログラムを書き下ろしたほうが楽だと思います。例えば上のような問題だと普通に書くと以下のようになると思います。

Sub Main
 For i = 0 To 40   
   For j = 0 To 40 - i 
     k = 40 - i - j
     If i * 200 + j * 300 + k * 100 = 5000 Then
       Msgbox i & ":" & j & ":" & k
       Exit Sub
     End If
   Next j
 Next i
End Sub
お名前:
題名: