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 ←終了
以上です。お願いします。
No.1
- 回答日時:
こんにちは。
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
No.2
- 回答日時:
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
No.3
- 回答日時:
こんにちは。
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に大量の情報が書かれているので思うように知りたいことを調べることができません。何か良い方法があるのでしょうか?
いろいろ教えて頂いて申し訳ないのですが、よろしくお願いします。
No.4ベストアンサー
- 回答日時:
こんにちは。
itohhといいますとりあえず、動くようになって良かったですね。
>このあとグラフ作成するので一列に表示されてほしい
これって、縦一列ですよね?
横一列だと400個の数値を表示するのはムリがありますものね(^^;
テキストボックス(Text1)のスクロールバーの表示は、
テキストボックス(Text1)のプロパティを変更します。
ScrollBars プロパティ:両方(縦だけでよいのでしたら「垂直」)
MultiLine プロパティ:True
これだけでOKです。
>MSDNに大量の情報が書かれているので思うように知りたいことを調べることができません。
>何か良い方法があるのでしょうか?
ヘルプの使い方には、いろいろな方法があります。
1.ソースコードの調べたい単語にカーソルを持っていって、
左上にある[F1]キーを押下する。
2.プロパティウィンドウの調べたいプロパティにカーソルを持っていって、
左上にある[F1]キーを押下する。
3.VBのメニュー「ヘルプ」の中の「キーワード」または「検索」で調べたい単語を入力する。
※これで、MSDNライブラリーの該当項目を表示してくれます。
この後、「使用例」をクリックすると、サンプルコードが表示されます。
MultiLineだったんですね(^。^)。Falseになっていました。だからスクロールバーが表示されなかったんですね。それとファンクションキーは結構役に立つんですね。どうも有難うございました。分かりやすい説明大変感謝いたします。
今回のプログラムでVBは面白いなーって実感しました。これからいろいろ勉強したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- LANケーブル・USBケーブル Surface laptop Goの画面をそのままテレビに映し出したいが、映らない 3 2022/09/04 17:43
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) ExcelVBAの転記について 1 2022/03/23 20:13
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
BCPユーティリティの使用法_...
-
VBAでPowerPointからExcelにデ...
-
複数行の文字列を変数として使...
-
access vbaでCSVファイルを文...
-
テキストファイルを直接置換す...
-
Rubyで外部ファイル内の文字列...
-
Linuxについて質問です。 引数...
-
ある文字列を含む行の抽出
-
RandomとBinaryモードの違い
-
c言語の問題です
-
unicode文字列(日本語)のファイ...
-
excel vbaでテキスト出力
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトのエラーに...
-
バッチでテキストファイルから...
-
Word VBA MSGBOX 内で降順表示
-
大量のフォルダからひとつのフ...
-
バッチ処理でファイルの中身を...
-
バッチ終了時にDOS窓を閉じるコ...
-
一太郎がイントラで開けません...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでPowerPointからExcelにデ...
-
BCPユーティリティの使用法_...
-
特定フォルダ内のテキストファ...
-
Excel.VBA テキストファイルを...
-
VBAで新しい日付順にファイルを...
-
access vbaでCSVファイルを文...
-
VB6側からテキストファイルをク...
-
テキストファイルを直接置換す...
-
複数行の文字列を変数として使...
-
ある文字列を含む行の抽出
-
unicode文字列(日本語)のファイ...
-
VBAで任意のフォルダ内のファイ...
-
テキストファイルの行頭に文字...
-
excelにテキストファイルの指定...
-
C#でのファイル編集と上書き保...
-
VB.NETでテキストファイルからH...
-
fortranでのcsvファイルを出力...
-
iniファイルとの比較(iniファイ...
-
バッチでiniファイルの編集
-
ソースコードの差分がある行番...
おすすめ情報