数値のデータ型について †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | たろう |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2009-08-12 09:55:21 (水) |
OS | Windows XP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
おはようございます。
どなたかおわかりになる方がいらっしゃいましたら教えてください。
テキストボックスA,B,Cがあります。
(テキストボックスA×テキストボックスB)の値をテキストボックスCに表示したいと思っています。
テキストボックスA,Bは整数か小数点以下の数が入るかはわかりません。
oDialog.getControl("テキストボックスC").text = CDbl(oDialog.getControl("テキストボックスA").text) * CDbl(oDialog.getControl("テキストボックスB").text)
このようにしますと、小数点以下の数字の場合は大丈夫なのですが、整数の場合だとエラーが出てしまいます。
Cdblの所をCintにしますと、整数はいいのですが、小数点以下の数値の場合はエラーになってしまいます。
このような場合、どうやって計算式を作ればいいのでしょうか?
よろしくお願いいたします。
普通はエラーにならないのでは †
M.Kamataki (2009-08-12 16:57:53 (水))
ご質問内容がやや説明不足です。Calc上に置かれたテキストボックスか、ダイアログ上のテキストボックスか不明でしたが、興味があったので「Calc上に置かれたテキストボックス」でマクロを組んでみました。Sub Main Dim oDoc As Object, oDrawPages As Object, oDrawPage As Object Dim oForms As Object, oForm As Object Dim oTextBox1 As Object, oTextBox2 As Object, oTextBox3 As Object oDoc = ThisComponent oDrawPages = oDoc.getDrawPages() oDrawPage = oDrawPages.getByIndex(0) oForms = oDrawPage.getForms() oForm = oForms.getByName( "Standard" ) oTextBox1 = oForm.getByName( "テキストボックスA" ) oTextBox2 = oForm.getByName( "テキストボックスB" ) oTextBox3 = oForm.getByName( "テキストボックスC" ) oTextBox3.text = CDbl( oTextBox1.text ) * CDbl( oTextBox2.text ) '※ End Sub※行で、CDbl()を使って倍精度の小数点演算をさせてますが、整数値でも小数点を含む数値でもエラーが表示されることはありませんでした。
一応、サンプルを添付します。
faq4_1826macro1.ods
テキストボックスA、テキストボックスBの値を変えて、ボタンをクリックするとテキストボックスCの値が変わります。
ダイアログの場合でも同じだと思いますが、もし公開可能なサンプルを作成できるようでしたら、当ページに添付してください。
なお、バージョンは2.3でしょうか。サンプルは3.1で作成しましたが、2.3で実行してもエラーになりませんでした。
マクロの参考にしたところ †
M.Kamataki (2009-08-12 17:00:38 (水))
CALCのコントロールをBasicマクロで扱う方法は?
http://oooug.jp/cgi-bin/bbs/users/1054980773.html
common variable to access dialog controls?
http://www.oooforum.org/forum/viewtopic.phtml?t=83681
数値のデータ型について †
たろう (2009-08-19 09:06:59 (水))
M.Kamataki さん
お返事ありがとうございます。
お盆を挟んで、お盆明けもバタバタしていたため、返事が遅くなってしまい、申し訳ございませんでした。
また、説明不足で申し訳ございません。
テキストボックスはダイアログ上のものです。
教えて頂いたコード、サイトのコードを試してみましたが、全て同じ所、テキストボックスの計算の前に下記の部分で引っかかってしまいました。
例外のエラーが発生してしまいました。
Dim oDoc As Object, oDrawPages As Object, oDrawPage As Object
Dim oForms As Object, oForm As Object
Dim oLabel As Object
oDoc = ThisComponent
oDrawPages = oDoc.getDrawPages()
oDrawPage = oDrawPages.getByIndex(0)
oForms = oDrawPage.getForms()
oForm = oForms.getByName( "ダイアログの名前" ) ←ここでエラー発生
ダイアログの名前はもちろんあっていますが、この部分はダイアログの名前を表記するのであっていますでしょうか?
バージョンは2.3です。
よろしくお願いいたします。
ダイアログを使ったサンプルを作成してください †
M.Kamataki (2009-08-19 10:42:20 (水))
わたしの紹介したコードはCalcのシート上のフォームに配置されたコントロールを操作するものですから、ダイアログには適用できません。フォームの名前を探しているわけですから、ファームがなければエラーになります。
すでにダイアログ上のテキストボックスから値を取得する部分はできているはずですね。現在作成中のダイアログを、テキストボックスのA、Bの値からCへ代入するシンプルなものに書き換えてサンプルを作成してはどうでしょうか。
最初のご質問で表示されたコード以外に問題点があるのかもしれません。一部だけ紹介されましたが、Basicのコードとしては正しいように見えます。やりたいことを単純化したサンプルで、最初のご質問のような現象が生じるなら、不具合ということも考えられます。
問題が再現する、しないに関わらずサンプルをご提供いただければ、そのあたりがはっきりします。ご検討ください。
無題 †
ike@九州 (2009-08-19 12:44:33 (水))
oDialog.getControl("テキストボックスC").text = Cstr(CDbl(oDialog.getControl("テキストボックスA").text) * CDbl(oDialog.getControl("テキストボックスB").text))
テキストフィールドなので
Cstr関数にて"テキスト変換"すれば如何でしょうか
数値のデータ型について †
たろう (2009-08-20 16:43:49 (木))
M.Kamataki さん、ike@九州さん
ありがとうございます。
サンプルを作るのでさえ時間がかかってしまい、遅くなってしまって申し訳ございません。
簡単なサンプルを作成しましたので添付致します。
式をいくつか書いて、試してみたのですが、どうにもうまくいかず、わからなくなってしまいました。
このサンプルの場合ですと、どれもテキストボックスに値が入らず、エラーも出ません。
何が足りないのか、どこが違うのかもよくわかりません。。。(泣
教えて頂けましたら幸いです。
よろしくお願いいたします。
引き続き調べてみます。
元のファイルでは、テキストボックスに値が入ったのですが、このサンプルで作り直したら値も入らなくなってしまいました。。。(泣
無題 †
ike@九州 (2009-08-21 08:01:56 (金))
修正しました。
任意の変数名 oDialog は共通名としなければ他プロシージャで使えません。
ありがとうございました †
たろう (2009-08-21 09:03:52 (金))
ike@九州さん
ありがとうございました!
詳しい解説もしてくださって、ありがとうございます。
教えて頂いたコードで試してみます。
また何かありましたらよろしくお願いいたします。
ありがとうございました!!
サンプルでアップさせて頂いたファイルですが、元ファイルのコードもたくさん含まれていたみたいで。。。(苦笑)
別ファイルで作り直したつもりだったのですが。。。(泣)
サンプルファイルの中身をアップさせて頂きますので、念のためファイルを削除させて頂いてもよろしいでしょうか?
申し訳ございませんがよろしくお願いいたします。
以下がサンプルファイルを元に、ike@九州さんに修正して頂いたファイルの中身です。
Dim oDialog As Object
Sub Main()
oDialog.getControl("t3").text = Cstr(cdbl(oDialog.getControl("t1").text) * cdbl(oDialog.getControl("t2").text))
't1,t2,t3はそれぞれテキストボックスの名前です。
End Sub
'任意のオブジェクト変数名 oDialog は他のプロシージャ使用と同名でないと正しく繋がりません。
'他のModuleシートでも oDialog を使用する場合は、宣言を Global oDialog As Object とします。
'dispose()後は内容を破棄してしまうので、oDialog.getControl("t3").text など取得できなくなります。
'dispose()しなければ最後のデータを取得できます。
Sub Dialog1Show
DialogLibraries.LoadLibrary("Standard")
oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialog.Execute()
oDialog.dispose()
End Sub
やはりエラーになりません †
M.Kamataki (2009-08-23 11:26:34 (日))
問題の箇所をoDialog.getControl("t3").text = CDbl(oDialog.getControl("t1").text) * CDbl(oDialog.getControl("t2").text)としてみましたが、エラー表示されません。
ご質問の当初の疑問点であった「数値のデータ型の扱い」は、今回の問題に関係がなかったということで、よろしいでしょうか。
ike@九州さんのコメントにもあったように、別の部分に問題があったわけです。サンプルファイルを作成することが、問題解決の早道になる好例だったと思います。
ページ番号を変更しました †
M.Kamataki (2009-08-27 16:42:16 (木))
faq/5/20にページ番号を変えました。faq/5/3をご覧ください。