Excel VBA質問箱 IV

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

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


2312 / 13644 ツリー ←次へ | 前へ→

【68768】ユーザーフォムのテキトボックスの空白の計算 きしやん 11/4/15(金) 20:07 質問[未読]
【68770】Re:ユーザーフォムのテキトボックスの空白の計算 neptune 11/4/15(金) 21:09 回答[未読]
【68771】Re:ユーザーフォムのテキトボックスの空白の計算 きしやん 11/4/15(金) 21:40 お礼[未読]
【68775】Re:ユーザーフォムのテキトボックスの空白の計算 neptune 11/4/16(土) 13:24 回答[未読]
【68772】Re:ユーザーフォムのテキトボックスの空白の計算 kanabun 11/4/15(金) 21:57 質問[未読]
【68773】Re:ユーザーフォムのテキトボックスの空白の計算 kanabun 11/4/15(金) 22:12 発言[未読]
【68774】Re:ユーザーフォムのテキトボックスの空白の計算 kanabun 11/4/16(土) 9:35 発言[未読]
【68777】Re:ユーザーフォムのテキトボックスの空白の計算 sasa 11/4/16(土) 15:43 回答[未読]
【68778】Re:ユーザーフォムのテキトボックスの空白の計算 kanabun 11/4/16(土) 17:21 発言[未読]
【68779】Re:ユーザーフォムのテキトボックスの空白の計算 sasa 11/4/16(土) 18:49 回答[未読]
【68780】Re:ユーザーフォムのテキトボックスの空白の計算 きしやん 11/4/16(土) 20:46 お礼[未読]

【68768】ユーザーフォムのテキトボックスの空白の計算
質問  きしやん  - 11/4/15(金) 20:07 -

引用なし
パスワード
   エクセルVBA超初心者です。
ユーザーフォムにテキトボックスを20個配置し、下記の標準偏差求める構文をを作りました。
20個のデータを入力すれば問題ないのですが、データは20個以下の場合があり
テキトボックスを空白のまま実行すると、実行時エラー13 型が一致しませんのエラー
が発生します。空白のテキトボックスに0を入力すればよいのですがそれがめんどうで!
なにかよい解決法があれば宜しくご教授ください。

Option Explicit

Private Sub CommandButton1_Click()
  Dim r As Integer, s As Integer
  r = ActiveCell.Row
  s = ActiveCell.Column
  Dim t1 As Double, t2 As Single, t3 As Single, t4 As Single, t5 As Single
  Dim t6 As Single, t7 As Single, t8 As Single, t9 As Single, t10 As Single
  Dim t11 As Single, t12 As Single, t13 As Single, t14 As Single, t15 As Single
  Dim t16 As Single, t17 As Single, t18 As Single, t19 As Single, t20 As Single
  
  t1 = TextBox2
  t2 = TextBox5
  t3 = TextBox8
  t4 = TextBox9
  t5 = TextBox10
  t6 = TextBox11
  t7 = TextBox12
  t8 = TextBox13
  t9 = TextBox14
  t10 = TextBox15
  t11 = TextBox16
  t12 = TextBox17
  t13 = TextBox18
  t14 = TextBox21
  t15 = TextBox24
  t16 = TextBox27
  t17 = TextBox30
  t18 = TextBox33
  t19 = TextBox36
  t20 = TextBox39
  Cells(r, s) = Application.WorksheetFunction.StDev(t1, t2, t3, t4, t5,                           t6, t7, t8, t9, t10, _
                           t11, t12, t13, t14, t15, t16, t17, t18, t19, t20)


  End Sub

【68770】Re:ユーザーフォムのテキトボックスの空白の計算
回答  neptune  - 11/4/15(金) 21:09 -

引用なし
パスワード
   ▼きしやん さん:
そういう時はfunctionプロシージャを使いましょう。

空白だけ判断してます。
textboxにはsingle型を適用できる範囲の数値又は空白のみが入っていることが前提。

Public Function ValueCheck(ByRef pT As MSForms.TextBox) As Single
  If pT.Text = "" Then
    ValueCheck = 0
  Else
    ValueCheck = CSng(pT.Text)
  End If
End Function

使い方
>  t1 = TextBox2
  t1 = ValueCheck(TextBox2)

・・・テストしてませんのでおかしかったら適当に修正して下さい。

【68771】Re:ユーザーフォムのテキトボックスの空白の計算
お礼  きしやん  - 11/4/15(金) 21:40 -

引用なし
パスワード
   neptune さん
早速のご回答ありがとうございます。
なにせ超初心者のためfunctionプロシージャの使い方が全くわかりません。
具体的な使い方をご教授願えれば幸いです。

▼neptune さん:
>▼きしやん さん:
>そういう時はfunctionプロシージャを使いましょう。
>
>空白だけ判断してます。
>textboxにはsingle型を適用できる範囲の数値又は空白のみが入っていることが前提。
>
>Public Function ValueCheck(ByRef pT As MSForms.TextBox) As Single
>  If pT.Text = "" Then
>    ValueCheck = 0
>  Else
>    ValueCheck = CSng(pT.Text)
>  End If
>End Function
>
>使い方
>>  t1 = TextBox2
>  t1 = ValueCheck(TextBox2)
>
>・・・テストしてませんのでおかしかったら適当に修正して下さい。

【68772】Re:ユーザーフォムのテキトボックスの空白の計算
質問  kanabun  - 11/4/15(金) 21:57 -

引用なし
パスワード
   ▼きしやん さん:
失礼します

>ユーザーフォムにテキトボックスを20個配置し、下記の標準偏差求める構文をを作りました。

なんだかTextBoxの番号がとびとびで、見づらいですね(=_-)

それはそうと、
TextBoxコントロールには ControlSource プロパティが
ありますから、ワークシートの未使用領域の連続セル範囲に
TextBoxの値をリンクさせて、StdDev はこのワークシートの連続
セル範囲にたいして実行したらいかがでしょう。

Option Explicit
Private GSourceRange As Range

Private Sub UserForm_Initialize()
 '各TextBoxとリンクするシート上のセル範囲
 Set GSourceRange = Sheet1.Range("BB1").Resize(20)
 With GSourceRange
   TextBox2.ControlSource = .Item(1).Address(, , , True)
   TextBox5.ControlSource = .Item(2).Address(, , , True)
   TextBox8.ControlSource = .Item(3).Address(, , , True)
   TextBox9.ControlSource = .Item(4).Address(, , , True)
   TextBox10.ControlSource = .Item(5).Address(, , , True)
   TextBox11.ControlSource = .Item(6).Address(, , , True)
   TextBox12.ControlSource = .Item(7).Address(, , , True)
   TextBox13.ControlSource = .Item(8).Address(, , , True)
   TextBox14.ControlSource = .Item(9).Address(, , , True)
   TextBox15.ControlSource = .Item(10).Address(, , , True)
   TextBox16.ControlSource = .Item(11).Address(, , , True)
   TextBox17.ControlSource = .Item(12).Address(, , , True)
   TextBox18.ControlSource = .Item(13).Address(, , , True)
   TextBox21.ControlSource = .Item(14).Address(, , , True)
   TextBox24.ControlSource = .Item(15).Address(, , , True)
   TextBox27.ControlSource = .Item(16).Address(, , , True)
   TextBox30.ControlSource = .Item(17).Address(, , , True)
   TextBox33.ControlSource = .Item(18).Address(, , , True)
   TextBox36.ControlSource = .Item(19).Address(, , , True)
   TextBox39.ControlSource = .Item(20).Address(, , , True)
 End With
End Sub

Private Sub CommandButton1_Click()
  'Range("W1").Select  '← StDevを書き出すセル
  ActiveCell.Value = WorksheetFunction.StDev(GSourceRange)
End Sub

【68773】Re:ユーザーフォムのテキトボックスの空白の計算
発言  kanabun  - 11/4/15(金) 22:12 -

引用なし
パスワード
   数値化するときの変数のデータ型ですが、
Single型というのは精度が悪いのであまり使わないほうが
いいですね。 Double型にしましよう。

もっとも、
ControlSourceで セルにリンクしていれば、セルの(数値の)
データ型は Doubleなので、問題は生じません。

あと、
ユーザーフォームを立ち上げると、前回入力した数値が
(ワークシートのリンク先と連動してますので)表示されますが、
20個のTextBoxの入力値を一括クリアしたいときも、
以下のようなCommandButtonを用意しておけば、
このボタンをクリックするだけで TextBoxの値をクリアできます。

Private Sub btnClearAll_Click()
  GSourceRange.ClearContents
End Sub

【68774】Re:ユーザーフォムのテキトボックスの空白の計算
発言  kanabun  - 11/4/16(土) 9:35 -

引用なし
パスワード
   ▼きしやん さん:
>Private Sub UserForm_Initialize()
> '各TextBoxとリンクするシート上のセル範囲
> Set GSourceRange = Sheet1.Range("BB1").Resize(20)
> With GSourceRange
>   TextBox2.ControlSource = .Item(1).Address(, , , True)
>   TextBox5.ControlSource = .Item(2).Address(, , , True)
>   TextBox8.ControlSource = .Item(3).Address(, , , True)
>   TextBox9.ControlSource = .Item(4).Address(, , , True)
>   TextBox10.ControlSource = .Item(5).Address(, , , True)
>   TextBox11.ControlSource = .Item(6).Address(, , , True)
>   TextBox12.ControlSource = .Item(7).Address(, , , True)
>   TextBox13.ControlSource = .Item(8).Address(, , , True)
>   TextBox14.ControlSource = .Item(9).Address(, , , True)
>   TextBox15.ControlSource = .Item(10).Address(, , , True)
>   TextBox16.ControlSource = .Item(11).Address(, , , True)
>   TextBox17.ControlSource = .Item(12).Address(, , , True)
>   TextBox18.ControlSource = .Item(13).Address(, , , True)
>   TextBox21.ControlSource = .Item(14).Address(, , , True)
>   TextBox24.ControlSource = .Item(15).Address(, , , True)
>   TextBox27.ControlSource = .Item(16).Address(, , , True)
>   TextBox30.ControlSource = .Item(17).Address(, , , True)
>   TextBox33.ControlSource = .Item(18).Address(, , , True)
>   TextBox36.ControlSource = .Item(19).Address(, , , True)
>   TextBox39.ControlSource = .Item(20).Address(, , , True)
> End With
>End Sub

ですが、
以下のようにまとめることもできますね。

Private Sub UserForm_Initialize()
 Dim tno, i As Long
 Dim ss As String
 
 Set GSourceRange = Sheet1.Range("BB1").Resize(20)
 ss = "2 5 8 9 10 11 12 13 14 15 16 17 18 21 24 27 30 33 36 39"
 For Each tno In Split(ss)
   i = i + 1
   Controls("TextBox" & tno).ControlSource _
      = GSourceRange.Item(i).Address(, , , True)
 Next
 
End Sub

【68775】Re:ユーザーフォムのテキトボックスの空白の計算
回答  neptune  - 11/4/16(土) 13:24 -

引用なし
パスワード
   ▼きしやん さん:
>なにせ超初心者のためfunctionプロシージャの使い方が全くわかりません。
等と言わず勉強して下さい。先のresで使い方も書いてますし。
超初心者等という言葉は自分で勉強しない、調べないという理由にはなりません。

身近なところではHelpのvisual basic プログラミングのヒントにも書いています。

>具体的な使い方をご教授願えれば幸いです。
>>使い方
>  t1 = TextBox2
  t1 = ValueCheck(TextBox2)
>  t2 = TextBox5
  t2 = ValueCheck(TextBox5)
・・・以下同様

敢えて、きしやん さんが書かれている通りsingleの型で書きましたけど
本当はdouble型をお勧めします。
理由はkanabunさんが書かれている通りです。

#不要な引用は止めましょう。スレッドが無駄に長くなって鬱陶しいので。

【68777】Re:ユーザーフォムのテキトボックスの空白の計算
回答  sasa  - 11/4/16(土) 15:43 -

引用なし
パスワード
   ▼きしやん さん:
>テキトボックスを空白のまま実行すると、実行時エラー13 型が一致しませんのエラー
>が発生します。空白のテキトボックスに0を入力すればよいのですがそれがめんどうで!
>なにかよい解決法があれば宜しくご教授ください。

Val関数を使うのが簡単だと思います。
 t1 = TextBox2
    ↓
 t1 = Val(TextBox2)

【68778】Re:ユーザーフォムのテキトボックスの空白の計算
発言  kanabun  - 11/4/16(土) 17:21 -

引用なし
パスワード
   ▼きしやん さん:
>テキトボックスを空白のまま実行すると、実行時エラー13 型が一致しませんのエラー
>が発生します。空白のテキトボックスに0を入力すればよいのですが

TextBoxが空のとき、そのTextBoxは計算に含めないようにしないと...
0に直しちゃったら、その値も有効なデータとして計算されてしまいますよ。

> Val
についても同様です。

【68779】Re:ユーザーフォムのテキトボックスの空白の計算
回答  sasa  - 11/4/16(土) 18:49 -

引用なし
パスワード
   ▼kanabun さん:
>▼きしやん さん:
>>テキトボックスを空白のまま実行すると、実行時エラー13 型が一致しませんのエラー
>>が発生します。空白のテキトボックスに0を入力すればよいのですが
>
>TextBoxが空のとき、そのTextBoxは計算に含めないようにしないと...
>0に直しちゃったら、その値も有効なデータとして計算されてしまいますよ。

質問文からは空白の時は0を入力したとみなす、と受け取れますが...
質問の真意が、
TextBoxが空のとき、そのTextBoxは空白とみなす(計算に含めない)
とすると、当然それなりに処理することになるでしょう。
以下一例。

Private Sub CommandButton1_Click()
 Dim nn, vv(1 To 20), ii&
 For Each nn In Evaluate("{2,5,8,9,10,11,12,13,14,15,16,17,18,21,24,27,30,33,36,39}")
  ii = ii + 1
  vv(ii) = Trim(Controls("TextBox" & nn))
  If vv(ii) <> "" Then vv(ii) = Val(vv(ii))
 Next
 ActiveCell = Application.StDev(vv)
End Sub

【68780】Re:ユーザーフォムのテキトボックスの空白の計算
お礼  きしやん  - 11/4/16(土) 20:46 -

引用なし
パスワード
   ▼sasa さん:
>▼kanabun さん:
sasaさんの方法でうまくいきました。
本当に有難う御座いました。


▼sasa さん:
>▼kanabun さん:
>>▼きしやん さん:
>>>テキトボックスを空白のまま実行すると、実行時エラー13 型が一致しませんのエラー
>>>が発生します。空白のテキトボックスに0を入力すればよいのですが
>>
>>TextBoxが空のとき、そのTextBoxは計算に含めないようにしないと...
>>0に直しちゃったら、その値も有効なデータとして計算されてしまいますよ。
>
>質問文からは空白の時は0を入力したとみなす、と受け取れますが...
>質問の真意が、
>TextBoxが空のとき、そのTextBoxは空白とみなす(計算に含めない)
>とすると、当然それなりに処理することになるでしょう。
>以下一例。
>
>Private Sub CommandButton1_Click()
> Dim nn, vv(1 To 20), ii&
> For Each nn In Evaluate("{2,5,8,9,10,11,12,13,14,15,16,17,18,21,24,27,30,33,36,39}")
>  ii = ii + 1
>  vv(ii) = Trim(Controls("TextBox" & nn))
>  If vv(ii) <> "" Then vv(ii) = Val(vv(ii))
> Next
> ActiveCell = Application.StDev(vv)
>End Sub

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