Excel VBA質問箱 IV

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

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


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

【31979】指定した行の数と式の数字を対応させたい! kruk 05/12/3(土) 14:46 質問[未読]
【31980】Re:指定した行の数と式の数字を対応させた... かみちゃん 05/12/3(土) 14:51 発言[未読]
【31981】Re:指定した行の数と式の数字を対応させた... kruk 05/12/3(土) 15:19 質問[未読]
【31982】Re:指定した行の数と式の数字を対応させた... かみちゃん 05/12/3(土) 15:32 発言[未読]
【31983】Re:指定した行の数と式の数字を対応させた... kruk 05/12/3(土) 15:37 お礼[未読]
【32007】Re:指定した行の数と式の数字を対応させた... kruk 05/12/4(日) 16:17 質問[未読]
【32008】Re:指定した行の数と式の数字を対応させた... かみちゃん 05/12/4(日) 16:57 発言[未読]
【32014】Re:指定した行の数と式の数字を対応させた... kruk 05/12/4(日) 17:51 質問[未読]
【32017】Re:指定した行の数と式の数字を対応させた... かみちゃん 05/12/4(日) 18:11 回答[未読]
【32018】Re:指定した行の数と式の数字を対応させた... kruk 05/12/4(日) 18:15 お礼[未読]
【32019】Re:指定した行の数と式の数字を対応させた... kruk 05/12/4(日) 19:04 質問[未読]
【32020】Re:指定した行の数と式の数字を対応させた... かみちゃん 05/12/4(日) 19:14 発言[未読]
【32043】Re:指定した行の数と式の数字を対応させた... kruk 05/12/5(月) 13:30 お礼[未読]
【31984】Re:指定した行の数と式の数字を対応させた... Kein 05/12/3(土) 15:38 回答[未読]

【31979】指定した行の数と式の数字を対応させたい...
質問  kruk  - 05/12/3(土) 14:46 -

引用なし
パスワード
   以下のようなプログラミングを組んでいるのですが、

Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
Dim Std As Single, sigma As Single
Dim RanData As Range
Set RanData = Range(DataRange)
 Std = Application.StDev(RanData)
Range(OutputRangeA).Select
Call Output(Std)
 sigma = Std * Sqr(239)
Range(OutputRangeB).Select
Call Output(sigma)
End Sub

このsqr()内の数字をユーザーフォームで指定した行の数と対応するようにしたいのですが、どのようにしたらよろしいでしょうか?
よろしくお願いします。

【31980】Re:指定した行の数と式の数字を対応させ...
発言  かみちゃん  - 05/12/3(土) 14:51 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>このsqr()内の数字をユーザーフォームで指定した行の数と対応するようにしたい

どのように対応させたいのですか?
UserFormkTextBoxの値とかにしたいということですか?
sigma = Std * Sqr(UserForm1.TextBox1.Value)
などとすればいいかと思います。(TextBox1の値のエラーチェックはしていません)

【31981】Re:指定した行の数と式の数字を対応させ...
質問  kruk  - 05/12/3(土) 15:19 -

引用なし
パスワード
   早速、ご返事ありがとうございます。やってみたのですが、うまくいきませんでした。

ユーザーフォームでは、A1:A100のように範囲を打ち込むのですが、この選んでる行の数である100がsqr()内の数字になるように指定したいのです。
よろしくお願いします。

【31982】Re:指定した行の数と式の数字を対応させ...
発言  かみちゃん  - 05/12/3(土) 15:32 -

引用なし
パスワード
   >やってみたのですが、うまくいきませんでした。

私が質問の趣旨を理解できていませんので、想像して書きましたので、うまくいかないかもしれません。

>ユーザーフォームでは、A1:A100のように範囲を打ち込むのですが、この選んでる行の数である100がsqr()内の数字になるように指定したい

そういうことは最初に書きましょう!

まず以下のコードを確認してください。

Sub Test()
 Dim strRow As String

 strRow = "A1:A100"
 MsgBox Range(strRow).Rows.Count
End Sub

これを応用すればよろしいかと思います。

【31983】Re:指定した行の数と式の数字を対応させ...
お礼  kruk  - 05/12/3(土) 15:37 -

引用なし
パスワード
   ありがとうございます。これから、やってみます。

【31984】Re:指定した行の数と式の数字を対応させ...
回答  Kein  - 05/12/3(土) 15:38 -

引用なし
パスワード
   例えば TextBox1 に入力された値から、目的の数値を取り出すとして

Dim i As Long, x As Long, Mynum As Long

With Me.TextBox1
  If .Value = "" Then Exit Sub
  For i = Len(.Value) To 1 Step -1
   If Not IsNumeric(Mid(.Value, i, 1)) then
     x = i + 1: Exit For
   End If
  Next i
  If x = 0 Then
   Mynum = CLng(.Value)
  Else
   Mynum = CLng(Mid(.Value, x))
  End If
End With

で、変数 Mynum に整数型で格納されます。

【32007】Re:指定した行の数と式の数字を対応させ...
質問  kruk  - 05/12/4(日) 16:17 -

引用なし
パスワード
   かみちゃんさん、keinさん昨日はどうもありがとうございました。
あの後、いろいろとやってみて、
strRow =Me.TextBox1
 MsgBox Range(strRow).Rows.Count
とすることで、メッセージボックスに指定した行の数を抽出することに成功しました。
しかし、モジュールの式に数値を送ることがどうしてもできません。よろしかったら、もう1度お教えください。
で、現在ユーザーフォームは
Private Sub CommandButton1_Click()
Dim DataRange As String, OutRangeA As String, OutRangeB As String, _
i As Long, x As Long, Mynum As Long, strRow As String
 DataRange = UserForm1.TextBox1.Text
 OutRangeA = UserForm1.TextBox2.Text
 OutRangeB = UserForm1.TextBox3.Text
 Call Calculate(DataRange, OutRangeA, OutRangeB)
 Unload UserForm1
With Me.TextBox1
  strRow = Me.TextBox1
  If .Value = "Range(strRow).Rows.Count" Then Exit Sub
  For i = Len(.Value) To 1 Step -1
   If Not IsNumeric(Mid(.Value, i, 1)) Then
     x = i + 1: Exit For
   End If
  Next i
  If x = 0 Then
   Mynum = CLng(.Value)
  Else
   Mynum = CLng(Mid(.Value, x))
  End If
End With
End Sub
このようになっており、モジュールは
Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
Dim Std As Single, sigma As Single
Dim RanData As Range
Set RanData = Range(DataRange)
 Std = Application.StDev(RanData)
Range(OutputRangeA).Select
Call Output(Std)
 sigma = Std * Sqr(Mynum)
Range(OutputRangeB).Select
Call Output(sigma)
End Sub
となっています。

【32008】Re:指定した行の数と式の数字を対応させ...
発言  かみちゃん E-MAIL  - 05/12/4(日) 16:57 -

引用なし
パスワード
   こんにちは。かみちゃんです。

>モジュールの式に数値を送ることがどうしてもできません。

どういうことをなさりたいのか、再度ご説明していただけませんか?

ざっと見たところ、

Option Explicit

Private Sub CommandButton1_Click()
 '〜省略〜
 Unload UserForm1 ' Meで指定されているフォームとUserForm1は異なるフォームですか?
 With Me.TextBox1
  strRow = Me.TextBox1
  If .Value = "Range(strRow).Rows.Count" Then Exit Sub
 '〜省略〜
          ↑
" "で囲っているので、「Range(strRow).Rows.Count」という文字列とTextBox1の値を比較しています。
しかし、
  If .Value = Range(strRow).Rows.Count Then Exit Sub
としたとしても、Me.TextBox1.Value は、セル範囲を示す文字列、
Range(strRow).Rows.Count は、そのセル範囲の行数を返しますので、
必ず一致することはないと思います。

>このようになっており、モジュールは

Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
 Dim Std As Single, sigma As Single
 Dim RanData As Range
 '〜省略〜
 Call Output(Std) ← 何の処理かわかりませんが・・・
 sigma = Std * Sqr(Mynum) ←Mynumという変数は、宣言されていません。
 '〜省略〜

【32014】Re:指定した行の数と式の数字を対応させ...
質問  kruk  - 05/12/4(日) 17:51 -

引用なし
パスワード
   かみちゃん さん、ありがとうございます。
昨日、かみちゃんさんからお教えいただいたものを活用して、

 strRow = Me.TextBox1
 MsgBox Range(strRow).Rows.Count
と、することで、テキストボックス1にA1:A100と範囲を打ち込んで、メッセージボックスに99と選択した行の数値が出るようにはなったのですが、その数値をモジュール内のsigma = Std * Sqr()という式の入れ込む方法で今は悩んでいる状況です。
以下は、先ほどのかみちゃんさんからの返答に答えたものですが、
Private Sub CommandButton1_Click()
 '〜省略〜
 Unload UserForm1 ' Meで指定されているフォームとUserForm1は異なるフォームですか? A:フォーム一緒のものです。
 With Me.TextBox1
  strRow = Me.TextBox1
  If .Value = "Range(strRow).Rows.Count" Then Exit Sub
 '〜省略〜
          ↑
" "で囲っているので、「Range(strRow).Rows.Count」という文字列とTextBox1の値を比較しています。
しかし、
  If .Value = Range(strRow).Rows.Count Then Exit Sub
としたとしても、Me.TextBox1.Value は、セル範囲を示す文字列、
Range(strRow).Rows.Count は、そのセル範囲の行数を返しますので、
必ず一致することはないと思います。←keinさんから教わったものを使ってみたの                 ですが、使用しないほうがいいのでしょう                  か?

モジュールは、
Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
Dim Std As Single, sigma As Single
Dim RanData As Range
'〜省略〜
Call Output(Std) ← 何の処理かわかりませんが・・・
A:ユーザーフォームに値が出る場所が2つあり、これはOutputRangeAからTextBox2に標準偏差の値を出す処理です。

sigma = Std * Sqr(Mynum) ←Mynumという変数は、宣言されていません。
すいません。変数を宣言するのを忘れておりました。
何分、VBA初心者なもので、ご足労おかけいたしますが、どうぞよろしくお願いします。

【32017】Re:指定した行の数と式の数字を対応させ...
回答  かみちゃん  - 05/12/4(日) 18:11 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> strRow = Me.TextBox1
> MsgBox Range(strRow).Rows.Count
>と、することで、テキストボックス1にA1:A100と範囲を打ち込んで、メッセージボックスに99と選択した行の数値が出るようにはなった

メッセージボックスに「99」と表示されましたか?
私は、「100」と表示されるのですが・・・

Keinさんのコードと私のコードは同様のことをしています。
なので、失礼ながら、中途半端に融合されています。
以下のようなコードで十分かと思います。
Private Sub CommandButton1_Click()
' Dim DataRange As String, OutRangeA As String, OutRangeB As String, _
  i As Long, x As Long, Mynum As Long, strRow As String
 Dim DataRange As String, OutRangeA As String, OutRangeB As String
 DataRange = UserForm1.TextBox1.Text
 OutRangeA = UserForm1.TextBox2.Text
 OutRangeB = UserForm1.TextBox3.Text
 Call Calculate(DataRange, OutRangeA, OutRangeB)
 Unload UserForm1
' With Me.TextBox1
'  strRow = Me.TextBox1
'  If .Value = "Range(strRow).Rows.Count" Then Exit Sub
'  For i = Len(.Value) To 1 Step -1
'   If Not IsNumeric(Mid(.Value, i, 1)) Then
'    x = i + 1: Exit For
'   End If
'  Next i
'  If x = 0 Then
'   Mynum = CLng(.Value)
'  Else
'   Mynum = CLng(Mid(.Value, x))
'  End If
' End With
End Sub

Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
 Dim Std As Single, sigma As Single
 Dim RanData As Range
 Set RanData = Range(DataRange)
 Std = Application.StDev(RanData)
 Range(OutputRangeA).Select
 Call Output(Std)
' sigma = Std * Sqr(Mynum)
 sigma = Std * Sqr(Range(DataRange).Rows.Count)
 Range(OutputRangeB).Select
 Call Output(sigma)
End Sub

【32018】Re:指定した行の数と式の数字を対応させ...
お礼  kruk  - 05/12/4(日) 18:15 -

引用なし
パスワード
   ありがとうございます。さっそく、試みてみます。
あと、私のもしっかり100と表示されます。わたしのうっかりです。

【32019】Re:指定した行の数と式の数字を対応させ...
質問  kruk  - 05/12/4(日) 19:04 -

引用なし
パスワード
   聞いている分際で失礼なのですが、先ほどかみちゃんさんがお答えくださったコードは、先ほど私が質問する際に書いたコードほとんどそのままではないでしょうか?
あと、今いろいろと改良してみたのですが、実行してみたところモジュール部分で、「Rangeメッソドは失敗しました。Globalオブジェクト」と表記されるのですが、どのようにしたらいいでしょうか?
以下、コードです。
ユーザーフォーム
Private Sub CommandButton1_Click()
Dim DataRange As String, OutRangeA As String, OutRangeB As String, _
i As Long, x As Long, Mynum As Long, strRow As String
 DataRange = UserForm1.TextBox1.Text
 OutRangeA = UserForm1.TextBox2.Text
 OutRangeB = UserForm1.TextBox3.Text
 Call Calculate(DataRange, OutRangeA, OutRangeB)
 Unload UserForm1
With Me.TextBox1
  strRow = Me.TextBox1
  If .Value = Range(strRow).Rows.Count Then Exit Sub
  For i = Len(.Value) To 1 Step -1
  If Not IsNumeric(Mid(.Value, i, 1)) Then
     x = i + 1: Exit For
   End If
  Next i
  If x = 0 Then
   Mynum = CLng(.Value)
  Else
   Mynum = CLng(Mid(.Value, x))
  End If
End With
End Sub
 
モジュール
Sub Calculate(DataRange As String, OutputRangeA As String, OutputRangeB As String)
Dim Std As Single, sigma As Single, Mynum As Long

Dim RanData As Range, strRow As Range
Set RanData = Range(DataRange)
Set strRow = Range(strRow)
 Std = Application.StDev(RanData)
Range(OutputRangeA).Select
Call Output("標準偏差", Std)
 sigma = Std * Sqr(Mynum)
 sigma = Std * Sqr(Range(strRow).Rows.Count)
Range(OutputRangeB).Select
Call Output("インプライドボラティリティ", sigma)
End Sub

よろしくお願いします。

【32020】Re:指定した行の数と式の数字を対応させ...
発言  かみちゃん  - 05/12/4(日) 19:14 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>聞いている分際で失礼なのですが、先ほどかみちゃんさんがお答えくださったコードは、先ほど私が質問する際に書いたコードほとんどそのままではないでしょうか?

わかりやすいように不要な部分をすべてコメント文にさせていただき、
必要なところは、元のコードをコメント文にして、修正をしただけです。
それを試していただけていないということでしょうか?

>モジュール部分で、「Rangeメッソドは失敗しました。Globalオブジェクト」と表記されるのですが、どのようにしたらいいでしょうか?

どのコードで表示されますか?

>Set strRow = Range(strRow)

strRowの値が設定されていないように思われます。

さきほど、私が提示したコード、たしかに動作確認はしていませんが、
TextBoxの値が正しく入力されていれば、正しく動くはずですが・・・・
それとも、私が何かミスをしているのでしょうか。

【32043】Re:指定した行の数と式の数字を対応させ...
お礼  kruk  - 05/12/5(月) 13:30 -

引用なし
パスワード
   すいません。私の読解力のなさが原因でした。 
プログラムようやくできました。大変ありがとうございました。

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