[[20210701161255]] 『ユーザーフォームのテキストボックス』(数式だらけ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームのテキストボックス』(数式だらけ)

こんにちは。よろしくおねがいします。

今、ユーザーフォームにて色々とてこずってます。

テキストボックス同士の計算は、セルでの計算と同じ
計算式は使えないのですか?

例えば、
Private Sub TextBox4_Change()

    If ComboBox12 = "円柱" Then
        TextBox7 = Format(3.1415926 / 4 * Val(TextBox3.Value) ^ 2 * Val(TextBox4.Value), "0.00")
    ElseIf ComboBox12 = "六角形" Then
        TextBox7 = sqrt(2) / 1
    ・
  ・
  ・
  ・
  ・
    End If
End Sub

と続けたいのですが、セルで使える「SQRT」と「PI()」が
使えなくて困っています。

ComboBox12には「円柱、六角形、六角穴、小判」など体積計算を
しようとする項目が並んでいます。
その項目を判定して計算式をしたいのですがどなたか
いい方法を教えてください。
色々検索はしたのですが、ヒットしなかったのでお願いします。

< 使用 Excel:unknown、使用 OS:unknown >


 PIに関して。

 Sub test()
  MsgBox WorksheetFunction.Pi
  MsgBox Application.Pi
 End Sub
(OK) 2021/07/01(木) 16:31

ワークシート関数の頭にWorksheetFunctionまたはApplicationを着けると使えるのでは?
すべてのワークシート関数が使えるとは限りませんが、たいていは使えます。
(γ) 2021/07/01(木) 16:31

 SQRTは

 Sqr(3)
 のような感じで出せます。
 他の関数もɤさんのコメントを参考に調べてみてください。
(OK) 2021/07/01(木) 16:35

 参考になるか分かりませんが。

[[20110309095643]] 『正五角形・正六角形の描き方』(韋駄天」

 どこが関係あるんじゃい?というツッコミは無しで。
(OK) 2021/07/01(木) 16:41

https://engi.cocolog-nifty.com/sirenai/2018/04/userform-b630.html
(QA) 2021/07/01(木) 16:53

皆様、早々のコメントありがとうございます。

OKさんの
>WorksheetFunction.Pi
を使用したらすんなりいけました。

平方根の方は後日検証してみたいと思います。

γさん
QAさん
ありがとうございました。

また困ったら質問させていただきます
(数式だらけ) 2021/07/01(木) 17:21


テキストボックスに入るのはただの文字列。

セルに数式として入力するのも、だたの文字列。

なので、文字列を作って、セルのFormulaプロパティに数式を設定して、
エクセル君に計算させるのも一案ですが、
エクセルの「文字列を読み取って数式と認識して、計算結果を返す」という機能を、
使うのは、
「Evaluateメソッド」という命令になります。
つまり文字列を作って、それをエクセルに評価させればよいかと思います。

https://excel-ubara.com/excelvba4/EXCEL_VBA_424.html
https://www.excel-chunchun.com/entry/excel-vba-evaluate

もちろん、大量の計算をする場合は、
大量の計算をするように作られたエクセルをがっつり利用しない手はないので、
シート上に書き込んでエクセル君に計算させた方がいちいちVBAで計算するより、
速く処理できます。

ユーザーフォームは見せるだけなので、
裏でどんなことをしようと関係ないので、
使えるものは使ってやると開発も楽になるかと思います。

Private Sub TextBox4_Change()

    Dim sFormula As String

    Select Case ComboBox12.Value
        Case "円柱": sFormula = "pai()/4*" & TextBox3.Value & "^2*" & TextBox4.Value
        Case "六角形": sFormula = "SQRT(2)/1"

    End Select

    MsgBox Evaluate(sFormula)

End Sub

(まっつわん) 2021/07/01(木) 17:22


まっつわんさんありがとうございます。

まだまだ初心者なので少しずつ調べながら勉強したいと思います。

少しまた質問です。

TextBox10 = WorksheetFunction.Degrees(atan(2 * Val(TextBox9.Value) / Val(TextBox5.Value)))

ATANを計算させたいのですが、Worksheetfunctionnを頭につけても
できませんでした。

何か間違っていますか?
(数式だらけ) 2021/07/02(金) 09:29


追加です。
Worksheetfunctionに
WorksheetFunction.Piは可能でしたが、WorksheetFunction.Sqr(3)ではエラーがでて無理でした。

手入力でしたら候補がでてきたのはWorksheetFunction.SqrtPiで
おそらく違うのだろうと判断しました。

(数式だらけ) 2021/07/02(金) 10:08


 >WorksheetFunction.Sqr(3)ではエラーがでて無理でした。 

 ただの Sqr(3)

(半平太) 2021/07/02(金) 10:29


半平太さんありがとうございます。

変更したらけいさんできました。

ATANの方はどうしたら計算できますか?
(数式だらけ) 2021/07/02(金) 10:48


VBAヘルプに「Visual Basic で使用できるワークシート関数一覧」というのがある。
それによると、対象にATANはなく、ATAN2というのがある。
代用できるか、定義を調べてみては?
X座標を1と指定すればいいんじゃないかな?

(γ) 2021/07/02(金) 11:43


γさんありがとうございます。

色々調べて試したら

[ATAN」ではなく「Atan」でいけました。
お騒がせしました。
(数式だらけ) 2021/07/02(金) 13:30


「Atn」の間違いです。
(数式だらけ) 2021/07/02(金) 13:31

VB6にatn関数というのがあったのですね。失礼しました。
(γ) 2021/07/02 14:13


色々と質問しましたが、ようやく目途がたちそうです。

皆様ありがとうございます。

最後にテキストボックスとコンボボックスをリセットしたいのですが
どうすればよいでしょうか?

色々検索してみると
Private Sub CommandButton6_Click()

 Dim Ctrl As Control
    For Each Ctrl In Controls
        If TypeName(Ctrl) = "TextBox" Then _
            Ctrl.Value = ""
    Next Ctrl   
End Sub

これでテキストボックスはできたのですが
コンボボックスはヒットしませんでした。

どうかよろしくお願いします
(数式だらけ) 2021/07/02(金) 16:07


 「リセット」とは?

 登録アイテム全てをコンボボックスから削除、なら、

 Me.ComboBox1.Clear

 何も選択されてない状態、なら、

 Me.ComboBox1.ListIndex = -1
(OK) 2021/07/02(金) 16:33

OKさん返信ありがとうございます。

解り難い説明ですいません。

コンボボックスを選択していない状態(空白)といえば
分かっていただけるでしょうか?

 Me.ComboBox1.ListIndex = -1

でもいけたのですが、一気に選択されていない状態にするには
どうすればよいでしょうか?

よろしくお願いします。
(数式だらけ) 2021/07/02(金) 16:56


TextBoxと同様ループの中で処理するだけですよ。

Private Sub CommandButton6_Click()

 Dim Ctrl As Control

    For Each Ctrl In Controls
        If TypeName(Ctrl) = "TextBox" Then
            Ctrl.Value = ""
        ElseIf TypeName(Ctrl) = "ComboBox" Then
            If Ctrl.ListCount <>  Then Ctrl.ListIndex =  -1
        End If
    Next Ctrl   
End Sub
(OK) 2021/07/02(金) 17:19

 >If Ctrl.ListCount <>  Then Ctrl.ListIndex =  -1

 ↓の間違いでした。

 If Ctrl.ListCount <> 0 Then Ctrl.ListIndex =  -1
(OK) 2021/07/02(金) 17:20

 >If Ctrl.ListCount <> 0 Then Ctrl.ListIndex =  -1

 コンボボックスにリストが格納されてなくてもCtrl.ListIndex =  -1
 で行けるようです。

 If Ctrl.ListCount <> 0 Then Ctrl.ListIndex =  -1
 を
 Ctrl.ListIndex =  -1
 に置き換えてください。

 ※そのままでもエラーにはなりません。
(OK) 2021/07/02(金) 17:42

返信遅くなりすいません。

OKさんありがとうございます。
ループの中に入れたら思い通りに動きました。

ありがとうございました。
(数式だらけ) 2021/07/05(月) 08:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.