プロが教える店舗&オフィスのセキュリティ対策術

Private Sub Command1_Click()

step = 0.25 ←式の定数
ramda = 0.5 ←式の定数
Dim Data(0 To 399) ←400個値を持つ配列を定義

Open "C:\hosei1.txt" For Input As #1 ←開くファイルの指定
Data(399) = Input(400, #1) ←読み込んだ値を配列に指定(型が違うとエラーがでます)
                    
surface = 1 ←surfaceを初め1にする
l = 400 ←値の数

Do While surface < l

g = 0
h = 0
i = surface

Do While i < l ←1未満まで繰り返し
h = h + (Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda) + g) * step / 2
g = Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda)
z = CSng(h / ramda * (1 - Exp(-(step * (l - surface) / ramda))))
i = i + 1
Loop

Print (CSng(z)) ←計算値を出力

surface = surface + 1
Loop

Listing1 = Array(List1, l) > output.txt ←計算値をテキストに出力


End Sub ←終了

以上です。お願いします。

A 回答 (4件)

こんにちは。

itohhといいます。

VBのヘルプ(MSDNライブラリー)は確認されました?

とりあえず、こちらに回答します。

1.まずは、ファイルの読み込みについて
> Data(399) = Input(400, #1)
ファイルの入力のInput文では一気に全レコードを読み込めません。
レコード数分、繰り返し読み込みましょう。
(MSDNライブラリーのInputの説明にサンプルが載っていますよ)

とりあえず、コードのサンプルを記載しますね。
Dim RecCnt As Integer
RecCnt = 0
' ファイルの終端までループを繰り返します。
Do While Not EOF(1)
If(RecCnt > 399) Then
' 配列より大きくなったらループを抜ける
' (配列よりも多く設定しようとするとエラーになります)
' 必要ならエラー処理を書いてください
Exit Do
End If
Input #1, Data(RecCnt) ' 配列n番目に読み込む
RecCnt = RecCnt + 1
Loop

2.計算のループについて
> Do While surface < l
これって、以下のループのほうがシンプルではないでしょうか?
For surface = 0 To l
For i = surface To l
' 計算処理


Next i
Next surface
For文の使用方法の詳細はMSDNライブラリーで確認してください。

3.ファイルへの書き出し処理
読み込みと同じです、まず、ファイルをオープンしてからPrint文で出力します。
これも、MSDNライブラリーのPrintの説明にサンプルが載っていますよ!
あえて、サンプルは書きません、ご自分で調べてみてください。

この回答への補足

どうも有難うございました。
無事走らせることはできたのですが、フォーム上にオブジェクトを作って、出力の値をテキストボックスに表示したいと思うのですが、うまく表示されません(スクロールバーの使い方もよく分かりません)。また、テキストファイルに出力する場合、ファイルをオープンしてからPrint文で出力する方法がうまくいきません(入力と同様にファイルを開いてそのファイルに書きこむとエラーがでる)。ヘルプを見てもテキストファイルにどうやって出力したらよいか分かりません。どうか出力方法を教えてください。
よろしくお願いします。

以下のプログラムでは出力がフォームに表示され値が重なり読み取ることができません。

Private Sub Command1_Click()

step = 0.25
ramda = 0.5

Open "C:\hosei1.txt" For Input As #1

Dim RecCnt As Integer
Dim Data(1 To 400)
RecCnt = 1

Do While Not EOF(1)

If (RecCnt > 401) Then
Exit Do
End If

Input #1, Data(RecCnt)
RecCnt = RecCnt + 1

Loop

surface = 1
l = 400

Do While surface < l

g = 0
h = 0
i = surface

Do While i < l
h = h + (Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda) + g) * step / 2
g = Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda)
z = CSng(h / ramda * (1 - Exp(-(step * (l - surface) / ramda))))
i = i + 1

Print CSng(z)

Loop

surface = surface + 1
Loop


End Sub

補足日時:2001/06/13 20:08
    • good
    • 0

Textファイル一行に1データと仮定して



Dim sBuf As String
Dim hFile As Integer
Dim dData() As Double
Dim iNumbOfData As Integer
Dim iCalcPtr As Integer

hFile = FreeFile
Open "c:\temp\hoge.txt" For Input As hFile
Do
 If EOF(hFile) <> False Then Exit Do
 Line Input #hFile, sBuf
 ReDim Preserve dData(iNumbOfData)
 dData(iNumbOfData) = Val(sBuf)
 iNumbOfData = iNumbOfData + 1
Loop
For iCalcPtr = 0 To UBound(dData)
 Debug.Print dData(iCalcPtr)
Next iCalcPtr
    • good
    • 0

こんにちは。

itohhといいます。

ファイルへの出力ですが、まずヒントだけ。
1.outputでファイルをオープンしましょう。

> Print CSng(z)
2.上記のPrint文では、どのファイルに出力したらよいかわかりません。
  Inputのとき#1としたようにどのOpen文と関係するのかを明記しなければいけません。
  (ファイル番号といいます)

3.出力がすべて終わったらClose文でファイルを閉じてください。

※Input文のほうもCloseしましょう。
※使用している変数は関数の最初にDim文で定義するようにしてください。
そして、必ずデータ型を指定するようにします。
そうすれば、CSng(z)などの変換が必要なくなるはずです。

まず、ヘルプを良く理解することです。ヘルプには、もっと細かいサンプルが載っていますよ。

あと、フォーム上に表示したいとのことですが、どのようにコードを書いたのでしょうか?
できれば、そのコードを記載してください。

>スクロールバーの使い方もよく分かりません
どういうときのスクロールバーでしょうか?

> If (RecCnt > 401) Then
400までしかないので401ではなく400にしましょう。

この回答への補足

Private Sub Command1_Click()

step = 0.25
ramda = 0.5

Open "C:\hosei1.txt" For Input As #1

Dim RecCnt As Integer
Dim Data(1 To 400)
RecCnt = 1

Do While Not EOF(1)

If (RecCnt > 400) Then
Exit Do
End If

Input #1, Data(RecCnt)
RecCnt = RecCnt + 1

Loop
Close #1
Open "C:\hosei2.txt" For Output As #2
surface = 1
l = 400

Do While surface < l

g = 0
h = 0
i = surface

Do While i < l
h = h + (Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda) + g) * step / 2
g = Data(i + 1) * Exp(-((i - surface + 1) * step) / ramda)
z = CSng(h / ramda * (1 - Exp(-(step * (l - surface) / ramda))))
i = i + 1

Loop

Print #2, CSng(z)
surface = surface + 1
Loop
Close #2

End Sub

このようなプログラムで補正計算を無事することができました(^o^)。
どうも有難うございました。

>フォーム上に表示したいとのことですが、どのようにコードを書いたのでしょうか? できれば、そのコードを記載してください

計算過程をテキストボックスに出したかったのでフォーム上にText1をつくり、
     Text1.Text=Text1.Text & CSng(z) & vbCrLf
というコード(これは私が持っているVBの参考書の例題にありました)を書いたのですが、実行後、Text1には横に続けて値が表示されて最初の値しか分からない(ドラッグして動かせば全ての値はみれますが)といったようになってしまいうまくいきませんでした(このあとグラフ作成するので一列に表示されてほしい)。
 
また、このText1にスクロールバーを付けて全ての値をスクロールにより見れるようにしたかった(計算の終了が分かると同時にコピーできる。)のですが、参考書にも説明が書かれておらず分かりませんでした。参考書の例題には、例題の実行結果の絵がフォーム上にスクロールバー付きのテキストボックスで表示されています(vbCrLfの説明もありません)。
 
どうすればテキストボックスにスクロールバー付きで表示できるのでしょうか?
また、MSDNに大量の情報が書かれているので思うように知りたいことを調べることができません。何か良い方法があるのでしょうか?
いろいろ教えて頂いて申し訳ないのですが、よろしくお願いします。

補足日時:2001/06/14 01:52
    • good
    • 0

こんにちは。

itohhといいます

とりあえず、動くようになって良かったですね。

>このあとグラフ作成するので一列に表示されてほしい
これって、縦一列ですよね?
横一列だと400個の数値を表示するのはムリがありますものね(^^;

テキストボックス(Text1)のスクロールバーの表示は、
テキストボックス(Text1)のプロパティを変更します。
ScrollBars プロパティ:両方(縦だけでよいのでしたら「垂直」)
MultiLine プロパティ:True
これだけでOKです。

>MSDNに大量の情報が書かれているので思うように知りたいことを調べることができません。
>何か良い方法があるのでしょうか?
ヘルプの使い方には、いろいろな方法があります。
1.ソースコードの調べたい単語にカーソルを持っていって、
  左上にある[F1]キーを押下する。
2.プロパティウィンドウの調べたいプロパティにカーソルを持っていって、
  左上にある[F1]キーを押下する。
3.VBのメニュー「ヘルプ」の中の「キーワード」または「検索」で調べたい単語を入力する。

※これで、MSDNライブラリーの該当項目を表示してくれます。
この後、「使用例」をクリックすると、サンプルコードが表示されます。
    • good
    • 0
この回答へのお礼

MultiLineだったんですね(^。^)。Falseになっていました。だからスクロールバーが表示されなかったんですね。それとファンクションキーは結構役に立つんですね。どうも有難うございました。分かりやすい説明大変感謝いたします。
今回のプログラムでVBは面白いなーって実感しました。これからいろいろ勉強したいと思います。

お礼日時:2001/06/14 17:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!