Excel VBA質問箱 IV

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

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


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

【42564】トライアル計算について 頑張れ自分 06/9/15(金) 11:07 質問[未読]
【42568】Re:トライアル計算について ハチ 06/9/15(金) 11:22 発言[未読]
【42571】Re:トライアル計算について 頑張れ自分 06/9/15(金) 11:35 発言[未読]
【42576】Re:トライアル計算について ハチ 06/9/15(金) 12:47 発言[未読]
【42577】Re:トライアル計算について 頑張れ自分 06/9/15(金) 13:08 お礼[未読]
【42578】Re:トライアル計算について ハチ 06/9/15(金) 13:18 発言[未読]
【42630】できました 頑張れ自分 06/9/16(土) 23:43 お礼[未読]

【42564】トライアル計算について
質問  頑張れ自分  - 06/9/15(金) 11:07 -

引用なし
パスワード
   はじめまして。
まだまだ初心者ですがお願いします。
今、ある解を求めるためのトライアル計算について考えています。

private A(100),B(100)
******************************
private sub test()
for j = 1 to 10
 A(j) = cells( , )
 B(j) = cells( , )
・・・
 Ans = 1
 Stp = 1

 for i = 1 to 5
  Stp = stp / 10
  Ans = Tryal(Ans , Stp)
 next i
・・・
next j
end sub
*****************************
判定ルーチン↓
*****************************
private function tryal(X as single,Stp as single) as single
Tryal = X
for i = X to 0 step -Stp
・・・
 if 〜
・・・
 end
・・・
next i
end function
*****************************

というような感じで試したいのですが
変数A(j)とB(j)を判定ルーチンに渡したいのですが
どうすれば良いのかいまいち分かりません・・・

お願いします。

【42568】Re:トライアル計算について
発言  ハチ  - 06/9/15(金) 11:22 -

引用なし
パスワード
   ▼頑張れ自分 さん:
>というような感じで試したいのですが
>変数A(j)とB(j)を判定ルーチンに渡したいのですが
>どうすれば良いのかいまいち分かりません・・・
>
>お願いします。

モジュールの先頭に
Option Explicit
を入れて、
どの変数が宣言されてるか、広域変数か 確認してみては?
jを広域変数で宣言すれば動作はするでしょうけど
ループで使っていますので引数で渡したほうがいいと思います。

【42571】Re:トライアル計算について
発言  頑張れ自分  - 06/9/15(金) 11:35 -

引用なし
パスワード
   ▼ハチ さん

コメントありがとうございます。

>jを広域変数で宣言すれば動作はするでしょうけど
>ループで使っていますので引数で渡したほうがいいと思います。

の部分が、自分にはまだ理解できないです・・・
もう少し詳しく教えて頂ければ助かります・・・

よろしくお願い致します。

【42576】Re:トライアル計算について
発言  ハチ  - 06/9/15(金) 12:47 -

引用なし
パスワード
   ▼頑張れ自分 さん:
>>jを広域変数で宣言すれば動作はするでしょうけど
>>ループで使っていますので引数で渡したほうがいいと思います。
>
>の部分が、自分にはまだ理解できないです・・・
>もう少し詳しく教えて頂ければ助かります・・・
>
>よろしくお願い致します。

>モジュールの先頭に
>Option Explicit
>を入れて、

こっちはやってみましたか?
変数を宣言するクセをつければ、jの渡し方も解ってくると思います。
説明がヘタクソなので・・
「広域変数」で検索すれば参考になるページは沢山出てきます。
http://www.bekkoame.ne.jp/~poetlabo/COMP/Excel/VBALEC/arg.htm
など。

For Nextで使うならまだマシですけどDo Loopなどで多様すると
こんなバグになることもあります。初期化を忘れなければいいんですけど。
↓のマクロを結果を見ながら、数回実行してみてください。

Private i As Integer
Sub Test()
  'i = 0: j = 0  '変数の初期化を省略すると・・・
  Do Until j = 10
    Range("A1").Offset(j) = i
    i = i + 1
    Range("B1").Offset(j) = j
    j = j + 1
  Loop
End Sub

'別モジュールでこんな感じも
Private i As Integer
Sub Test2()
  Dim i As Integer  '間違ってiを宣言してしまった
  
  For i = 1 To 5
    Call Msg_Test
  Next i
End Sub

Sub Msg_Test()
  '広域変数iを表示(のつもり)
  MsgBox "変数i= " & i
End Sub

【42577】Re:トライアル計算について
お礼  頑張れ自分  - 06/9/15(金) 13:08 -

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

>変数を宣言するクセをつければ、jの渡し方も解ってくると思います。

変数宣言するクセはほとんどありませんでした・・・

>「広域変数」で検索すれば参考になるページは沢山出てきます。
>http://www.bekkoame.ne.jp/~poetlabo/COMP/Excel/VBALEC/arg.htm
>など。

ありがとうございます。
チラリと覗いてみましたが、自分にはちょっと難しそうなので
少し時間かけてみます。

>For Nextで使うならまだマシですけどDo Loopなどで多様すると
>こんなバグになることもあります。初期化を忘れなければいいんですけど。

Do Loop も使いこなしたいなぁ〜とは思ってますが
今のところは何とかFor Next で頑張ってみます!

わざわざ、サンプルソースまで書いて頂きありがとうございます!
先ほどのリンク先も参考しながら、すこし試してみます!

また来たときはよろしくお願いします!

【42578】Re:トライアル計算について
発言  ハチ  - 06/9/15(金) 13:18 -

引用なし
パスワード
   ▼頑張れ自分 さん:

Private Function tryal(X As Single, Stp As Single, j As Long) As Single
'tryal = X 'これは最後に代入しないと常に戻り値は常にAnsと同じになるのでは?
For i = X To 0 Step -Stp
  if A(j)・・B(j)・・・〜
    '・・・
  End If
    '・・・
Next i
tryal = X
End Function

シンプルに必要な引数は全部渡せば良いと思います。

【42630】できました
お礼  頑張れ自分  - 06/9/16(土) 23:43 -

引用なし
パスワード
   ▼ハチ さん

色々と試してみながらチャレンジした結果
ようやく思ってたものができました。

>シンプルに必要な引数は全部渡せば良いと思います。

因数渡しもそうですが、それ以上に配列渡しについても悩んで
何となく・・・という感じでやってみたらできました!!

結果としては、A(i)という配列に対して
private i as integer
で宣言し、サブルーチン名の変数?の一つとしてiも引き渡すと言った感じです。

すごく単純なことでしたが、分かるまでかなり時間が・・・
ハチさんのアドバイスのおかげでまた少しマクロが楽しくなりました。
どうもありがとうございます。

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