Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1540 / 13645 ツリー ←次へ | 前へ→

【73706】ユーザーフォームで最小値と最大値を取得して計算 kamo 13/2/5(火) 22:42 質問[未読]
【73707】Re:ユーザーフォームで最小値と最大値を取... kanabun 13/2/5(火) 23:11 発言[未読]
【73709】Re:ユーザーフォームで最小値と最大値を取... ウッシ 13/2/5(火) 23:20 回答[未読]
【73731】Re:ユーザーフォームで最小値と最大値を取... kamo 13/2/7(木) 0:18 お礼[未読]
【73730】Re:ユーザーフォームで最小値と最大値を取... kamo 13/2/6(水) 23:55 お礼[未読]
【73708】Re:ユーザーフォームで最小値と最大値を取... ichinose 13/2/5(火) 23:18 発言[未読]
【73732】Re:ユーザーフォームで最小値と最大値を取... kamo 13/2/7(木) 0:29 お礼[未読]
【73733】Re:ユーザーフォームで最小値と最大値を取... ichinose 13/2/7(木) 6:07 発言[未読]
【73743】Re:ユーザーフォームで最小値と最大値を取... kamo 13/2/8(金) 0:22 お礼[未読]

【73706】ユーザーフォームで最小値と最大値を取得...
質問  kamo  - 13/2/5(火) 22:42 -

引用なし
パスワード
   教えてください。
ユーザーフォームのテキストボックス1〜3に数字を入力し、コマンドボタンを押すとその数値の最大値と最小値を取得し、取得した2値の中間値をテキストボックス4に表示させたいのですが、テキストボックス1〜3が1つでも空欄だとエラーになります。空欄を無視して最小値と最大値を取得したいのですが、うまくいきません。
よろしくおねがいします。
Private Sub CommandButton1_Click()
Dim 最大値 As Single
Dim 最小値 As Single

Dim T1 As Single, T2 As Single, T3 As Single

T1 = TextBox1.Value
T2 = TextBox2.Value
T3 = TextBox3.Value

最大値 = Application.Max(T1, T2, T3)
最小値 = Application.Min(T1, T2, T3)

'テキストボックス4の計算
TextBox4.Value = (最大値 + 最小値) / 2

'整数のみ表示
TextBox4.Value = Fix(TextBox4.Value)

【73707】Re:ユーザーフォームで最小値と最大値を...
発言  kanabun  - 13/2/5(火) 23:11 -

引用なし
パスワード
   ▼kamo さん:

TextBoxのValueは あくまで文字列です。なので それを使っての数値計算
はいろいろと厄介です。
で、ひとつの考え方ですけど、各TextBoxを シートのセルとリンクさせて
おけば、MAX関数 MIN関数 AVERAGE関数 を使って目的の数値をTextBox4に
表示させることができます。

(以下のサンプルでは Sheet1 のHH列をリンク先として使っています)

Private Sub UserForm_Initialize()
  TextBox1.ControlSource = "Sheet1!HH1"
  TextBox2.ControlSource = "Sheet1!HH2"
  TextBox3.ControlSource = "Sheet1!HH3"
  Sheet1.[HH4].Formula = "=Average(MAX(HH1,HH2,HH3),MIN(HH1,HH2,HH3))"
  
End Sub

Private Sub CommandButton1_Click()

 TextBox4.Text = Sheet1.[HH4].Value

End Sub

【73708】Re:ユーザーフォームで最小値と最大値を...
発言  ichinose  - 13/2/5(火) 23:18 -

引用なし
パスワード
   こんばんは。


>Private Sub CommandButton1_Click()
>Dim 最大値 As Single
>Dim 最小値 As Single
>
Dim t(1 To 3) As Variant
t(1) = IIf(TextBox1.Value = "", "", Val(TextBox1.Value))
t(2) = IIf(TextBox2.Value = "", "", Val(TextBox2.Value))
t(3) = IIf(TextBox2.Value = "", "", Val(TextBox3.Value))
>
最大値 = Application.Max(t())
最小値 = Application.Min(t())
>
>'テキストボックス4の計算
>TextBox4.Value = (最大値 + 最小値) / 2
>
>'整数のみ表示
>TextBox4.Value = Fix(TextBox4.Value)

試してみてください

【73709】Re:ユーザーフォームで最小値と最大値を...
回答  ウッシ  - 13/2/5(火) 23:20 -

引用なし
パスワード
   こんばんは

テキストボックスに入力して実行するのが決めなら、

Private Sub CommandButton1_Click()
  Dim 最大値 As Single
  Dim 最小値 As Single
  Dim i   As Long
  Dim t()  As Single
  i = 0
  If TextBox1.Value <> "" Then
    i = i + 1
    ReDim Preserve t(1 To i)
    t(i) = TextBox1.Value
  End If
  If TextBox2.Value <> "" Then
    i = i + 1
    ReDim Preserve t(1 To i)
    t(i) = TextBox2.Value
  End If
  If TextBox3.Value <> "" Then
    i = i + 1
    ReDim Preserve t(1 To i)
    t(i) = TextBox3.Value
  End If
  
  If i > 0 Then
    最大値 = Application.Max(t)
    最小値 = Application.Min(t)
    
    'テキストボックス4の計算
    TextBox4.Value = (最大値 + 最小値) / 2
    
    '整数のみ表示
    TextBox4.Value = Fix(TextBox4.Value)
  End If

End Sub

こんな感じでも。

【73730】Re:ユーザーフォームで最小値と最大値を...
お礼  kamo  - 13/2/6(水) 23:55 -

引用なし
パスワード
   ▼kanabun さん:

お礼が遅れてすいません。
うまくできました。
今回は、どうしてもユーザーフォームで
処理したかったので、今後の参考にしたいと思います。
ありがとうございました。

【73731】Re:ユーザーフォームで最小値と最大値を...
お礼  kamo  - 13/2/7(木) 0:18 -

引用なし
パスワード
   ▼ウッシ さん:
お礼が遅れてすいません。

うまく処理できました。
行き詰まっていたのでとても嬉しいです。

ただ、VBA初心者でIF文が完璧に理解できないのが
残念ですが・・・。

もっと勉強したいと思います。

ありがとうございました。

【73732】Re:ユーザーフォームで最小値と最大値を...
お礼  kamo  - 13/2/7(木) 0:29 -

引用なし
パスワード
   ▼ichinose さん:
お礼が遅れてすみません。

うまく出来ました。本当に助かりました。

VBAを始めたばかりで、IIF関数を始めて知りました。
もしよろしければ 
t(1)=iif(textbox1.value="","",val(textbox1.value))
の意味を少し教えていただけばと思うのですが・・・。

まずは、回答いただきありがとうございました。

【73733】Re:ユーザーフォームで最小値と最大値を...
発言  ichinose  - 13/2/7(木) 6:07 -

引用なし
パスワード
   おはようございます。
ワークシート関数のMaxやMin関数って、
実際にセルで試してみればわかりますが、元々数値以外は、対象外ですよね!!

ですから、未入力は、未入力を返し それ以外は、Val関数を使って変換した値を返す

という処理を

Dim t(1 To 3) As Variant
t(1) = IIf(TextBox1.Value = "", "", Val(TextBox1.Value)

↑ここで行っています。配列tに""も入れられるようにVariantで宣言しました。

Iif関数は、便利ですが、知らないと無駄な処理時間を費やしてしまうので
要注意です。以下の例

Sub test()
  Dim a As Long
  Dim b As String
  a = 0
  b = IIf(a = 0, "0がはいっている", test1(a))
  MsgBox b
End Sub
'==================================
Function test1(num As Long) As String
  Dim g0 As Long
  Dim g1 As Long
  Dim g2 As Long
  test1 = "何がはいっているかしらべていない"
  For g2 = 1 To 200
   g1 = 0
   For g0 = 1 To 500000
   g1 = g1 + 1
   Next
  Next
End Function


a=0 なのですから、

"0がはいっている" と簡単に表示してくれればよいのに 結構時間がかかりますよね?

上記は、極端な例ですが、こういうこともあるので 注意です。

【73743】Re:ユーザーフォームで最小値と最大値を...
お礼  kamo  - 13/2/8(金) 0:22 -

引用なし
パスワード
   ▼ichinose さん:
 こんばんは

引き続き回答頂きありがとうございます。
iif関数の使い方よく分かりました。

今後、注意点に気をつけて
(試しましたが、確かに時間がかかりました。)
また、iif関数を使ってみたいと思います。

1540 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free