• 締切済み

マクロで関数の使い方

下記のコードを試したのですが、オブジェクトはこのプロパティまたはメソッドをサポートしていませんとエラーが出ます。 どの部分の書き方が間違っているでしょうか? Label93.Caption = 2 * (Application.SQRT(Val(Label91.Caption) ^ 2 - (Val(Label91.Caption) - Val(TextBox35.Value)) ^ 2))

noname#241383
noname#241383

みんなの回答

回答No.3

No.2 です。連続ですみません。No.2 の一部の書きぶりが、説明用としてはイマイチだったので、修正させてください。( ) の位置をちょっと動かしています。 正でない平方根: -(負でない数値^(1/2)) あるいは -(負でない数値^0.5)  ※実は外側の ( ) は省いても大丈夫

回答No.2

No.1 さんのおっしゃるとおり、WorksheetFunction.Sqrt というのは用意されて「いません」。代わりに、VBA に組み込まれている Sqr 関数が使えますね。 逆に、WorksheetFunction.Sum メソッドというのはありますが、単なる Sum 関数は VBA にはありません。基本的にワークシート関数と VBA 関数は重複しないようになっていると思います。ヘルプ「WorksheetFunction オブジェクト メンバ」も参照してください。 ただ、平方根などを求める計算は、高校くらいの算数でも習うとおり、あえて関数を使わなくても、次式でできますね。 負でない平方根: 負でない数値^(1/2)   あるいは 負でない数値^0.5 正でない平方根: -(負でない数値)^(1/2) あるいは -(負でない数値)^0.5 立方根:     数値^(1/3) n 乗根:     数値^(1/n)   ※ n が偶数の場合の符号については平方根と同様

noname#241383
質問者

補足

1人目の方が指摘のようにSqrでしました。 ちょっと変更ししてますが、 WorksheetFunction.Sqr(Val(TextBox33.Value) このコードでは、エラーがでます。 なにか書き方が間違っていますか? 指摘のように関数を使わない方法だと問題なくできました。 なぜ、このコードだとエラーがおこるのかな?

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.1

ben9210さん おはようございます。 正解を先に示します。 正解) Application.SQRT の部分を sqr と書き換えて下さい。 1) VBA内でExcelの関数を利用するためには、Worksheetfunctionオブジェクトを参照します。  試しにエディタで、Worksheetfunction. と打ち込んでください。見慣れたExcelの関数が羅列されるはずです。 2) ルート(二乗根)を導出する関数は、Excelの関数を利用しません。VBAに内臓されたsqr() 関数を利用します。 以上2点から、上の回答となりました。

noname#241383
質問者

補足

指摘のようにSqrでしました。 検索すればわかりました。 ちょっと変更ししてますが、 WorksheetFunction.Sqr(Val(TextBox33.Value) このコードでは、エラーがでます。 なにか書き方が間違っていますか? 2人目の方が指摘のように関数を使わない方法だと問題なくできました。 なぜ、このコードだとエラーがおこるのかな?

関連するQ&A

  • エクセルVBA 計算の繰り返し処理?

    エクセルのVBA フォーム内にて 下記、各テキストボックスの数値を変更することにより Label27にLabel28*TextBox12+TextBox13+TextBox14 Label33にLabel34*TextBox16+TextBox17+TextBox18 Label27、Label33に計算の答えを書き込みたいため 下記のように書き込みました。 Private Sub TextBox12_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox13_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox14_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox16_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox17_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox18_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub 計算は出来るのですが計算ラベル50程あるため、修正を考えて ももう少し簡素化して書き込みたいため 調べましたがヒント項目がずれているせいか回答を検索できませんでした。 どのようにすれば宜しいかご教示の程宜しくお願いいたします。

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • VBA 同様処理の簡素化?

    エクセル VBAで下記のようにテキストボックスの処理を 書き込みました。 Private Sub TextBox24_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub Private Sub TextBox25_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub テキストボックス24、25内の処理は同じなのですが テキストボックスが増えた場合、修正することも考えて 簡素化したいのですが、どのように行なえばいいでしょうか?

  • LabelとTextboxの自動計算を希望

    ComboBox2のリスト選択で連動でlabel2とlabel12の数字変更 TextBox2には数字入力 Label12(数字) x TextBox2(数字) = Lavel22(乗算合計)で Label12変えないで、TextBox2の数字変えた時はLabel22の合計変動 Label12の数字変えて、TextBox2の数字変ない時はLabel22の合計変わらない現状です。 Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case True 'TextBox2かLabel12が空白の時Label22空白 Case TextBox2.Value = "" Or Label12.Caption = "" Label22.Caption = "" Case Else 'TextBox2とLabel12が数字の時Label22はTextBox2の数字とLabel12数字を乗算する If IsNumeric(TextBox2.Value) And IsNumeric(Label12.Caption) Then _ Label22.Caption = TextBox2 * Label12 'Label22に数字がある時Label29に合計表示 Label29.Caption = Label22 End Select End Sub ComboBox2_change()作って、TextBox2_KeyUp書いてる内容を書けば動くでしょうが・・・ 同じ内容2つ書かないで動く方法があれば非常に助かります。 いい方法無さそうならComboBox2_change()作って書こうかな・・・と思ってます

  • (Excel 2003) マクロでワークシート上のラベルをコントロールしたいのですか・・・

    こんにちは。 Excel 2003 で思い通りのグラフが作成できなくて、ならば自分で作ろうと無謀にも思い立ち、 マクロでラベルをワークシートに貼り付けてみました。 (とりあえずの目標) ・目的の位置に目的の大きさで貼り付ける。 ・標題を消去する。(あるいは、特定の文字を設定。) ・境界線を設定する。 ・背景色を設定する。 しかし、思った通りに動作してくれません。下記はそのテスト用のコードです。 Sub Test1() With Sheets("テスト").OLEObjects.Add(ClassType:="Forms.Label.1", _ Left:=54, Top:=13.5, Width:=54, Height:=13.5) '.Caption = "" 実行時エラー '.BorderStyle = fmBorderStyleSingle 実行時エラー '.BackColor = RGB(192, 192, 192) 実行時エラー .Border.Color = vbBlack 'OK .Interior.Color = RGB(192, 192, 192) 'NG(実行時エラーはないが効果無し) End With End Sub (質問1) プロパティウインドウでは指定可能なのに、VBAでプロパティを利用できないのは何故ですか? Caption, BorderStyle, BackColor など 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 (質問2) 標題を消去する(または、特定の文字を指定する)にはどうしたらよいですか? また、背景色を設定するにはどうしたらよいですか? 初歩的なことと思いますが、よろしくお願いします。

  • エクセルマクロのテキストボックスの質問です。テキストボックス内の文字を

    エクセルマクロのテキストボックスの質問です。テキストボックス内の文字を24文字13行で設定します。文字を打つことにより残り行数をカウントできるようなマクロを作成したいと思い次のマクロを設定しましたがエラーがでます。対処方法わかりますか。 UserForm1のマクロは次の通りです。 Private Sub CommandButton1_Click() Me.Hide End Sub Private Sub TextBox1_Change() ato = 13 - TextBox1.linecounut Label1.ForeColor = 0 If ato <= 10 Then Label1.ForeColor = RGB(255, 0, 0) Label1.Caption = "あと " & ato & " 文字入力できます。" End Sub すると1回目は入力可能ですが,次のセルに移動するとこのようなメッセージが出てしまいます。 linecountのプロパティーを取得できません。このコントロールはフォーカスを持つ必要があります。setfoucusメソッドによってこのプロパティーまたhメソッドが参照される前にフォーカスに移動しました

  • VBA 年月日から日曜日に当たる日の文字を赤くする

    よろしくお願いします。 TextBox2に年号(西暦) ComboBox1に月 TextBox7に日 を、入力します。 入力方法は、Label1からLabel31を押下して日付けを入れます。 したときに各Labelの内、日曜日に該当するLabelならCaptionの文字を赤くする。 Private Sub Label1_Click() TextBox7.Value = 1 ’もし1日が日曜日ならLabel1のCaptionの文字を赤くする End Sub Private Sub Label2_Click() TextBox7.Value = 2 End Sub Private Sub Label3_Click() TextBox7.Value = 3 End Sub ~ Private Sub Label29_Click() TextBox7.Value = 29 End Sub Private Sub Label30_Click() TextBox7.Value = 30 End Sub Private Sub Label31_Click() TextBox7.Value = 31 End Sub 追 ComboBoxで日付けをダウンリスト表示したかったのですが、1列表示で 長くなってしまいます。 ※2列に表示する方法を知らないもので、Labelで2列表示にしました。 もし、ダウンリストを2列表示できるのであれば、ぜひともご教示をお願いします。 無識なものですみません。 何卒宜しくお願い致します。

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • VBAでコントロール配列を持つことは可能ですか?

    Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

  • 配列化

    VB2005においてlabel,textboxといったコントロールを配列化したいのですがどうすればいいでしょうか? VB6では下記のコードが成り立ちますが・・・ For i=0 to 3 label(i).caption = str(i) Next このようにコントロール自体を配列化することは出来るのでしょうか?

専門家に質問してみよう