- ベストアンサー
VBA、値のずらし計算
初めて利用させていただきます。まだVBAをはじめてまもないですがよろしくお願いします。 まず、2個のテキストファイルから値を10個ずつ読み込みます。 読み込んだ2つの値のうちの1つを1つづつずらして計算したいのですが、どなたか教えてくれませんか。 例えば、 1周目 → 2周目 →・・・ ファイルA ファイルB → ファイルA ファイルB 1 + 10 → 1 + 20 2 + 20 → 2 + 30 3 + 30 → 3 + 40 4 + 40 → 4 + 50 5 + 50 → 5 + 60 6 + 60 → 6 + 70 7 + 70 → 7 + 80 8 + 80 → 8 + 90 9 + 90 → 9 + 100 10 + 100 → このようにVBAで5周目まで計算させたいです。よろしく願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ところで、3連休に入ります。 さすれば、補足質問への回答も不能。 そこで、?を埋めるヒントを。 For J = 0 To 2 ・・・・・ Next J これは、3週目(0,1,2)だけ計算せよの指示。 For J = 0 To 2 For I = J To 2 Me.Cells(H, J + 1) = Val(strSuji_I(J) + Val(strSuji_J(I)) Next I Next J ところで、このように計算させれば、 1+10,2+20,3+30 2+20,3+30 3+30 となって、目的の結果が得られません。 For I=J To 2:Next I のループでは、 strSuji_I()のインデックスは0からカウントアップしなきゃなりません。 For J = 0 To 2 H = 0 For I = J To 2 H = H + 1 Me.Cells(?, ?+ 1) = Val(strSuji_I(? - 1)) + Val(strSuji_J(?)) Next I Next J そこで、このように H というstrSuji_I()のインデックス用の変数を用意して不具合を解消します。 H は、当然のようにループ突入前に初期化します。 これで、事実上、伏字回答ではなくなったと推察します。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
この質問には2つの解決点があると思います。 (1)テキストファイルを読み込むコード (2)ヅラして計算するロジック (3)その他?結果の書き出しするの?。 ーー A.テキストファイルは1レコード1データか B.計算(掛け算)した結果はどうするのか。何か集計するのか、1結果ずつ(テキストファイルに?)書き出すのか。 C.書き出すときのレコードの順序は? こういうことが質問に書いてないのは>をはじめてまもないです、であっても、VBAコードを離れて、考えることがもれているのでは。 -- (1)テキストファイルの読み込みはWEBに載ってます。数種のコードがあります。 (2)(2)はVBAと直接関係無く、ロジック組み立て力の修練が必要です。 第二ファイルのレコードのデータは毎回使うので、毎回読むことにすると、読み込み時間のロスが多いので、配列に記憶できれば保持したいのだが、数についてはどれほどだろうか。 >2個のテキストファイルから値を10個ずつ読み込みます 意識としてはそうでも、レコードをメモリや配列に全部保持してしまうのは素人的なやり方です。 第2ファイルを読み配列に入れる。D2(1)・・・ 第1ファイル1つ目D1(1)を読んで第2ファイルから必要な相手を選ぶ。 第1ファイル2つめD1(2)を読んで第2ファイルから必要な相手を選ぶ。 以下繰り返し。 Sub test01() For j = 1 To 5 For i = 1 To 10 - j + 1 k = k + 1 Cells(k, "A") = "D1(" & i & ")+" & "D2(" & j + i - 1 & ")" Next i Next j End Sub を実行してみてください。A列に出る組み合わせについて、 この組み合わせで良いですか。
お礼
回答ありがとうございます。本当に私の説明不足申し訳ございませんでした。これで問題解決できました。本当にありがとうございました。
補足2:Hの是非。 さて、Hの導入の必要性を考えれば、そもそもHは必須か? こういう疑問も湧くでしょう。 debug.print H, I, J この1行で、その疑問の答えも見つかります。 <作法の問題> アルゴリズム上で不必要な変数は使わないという作法。 アルゴリズムを説明する上で有用な変数は残すという作法。 まあ、私は、プログラマではなく単なる素人ですから後者を採用しています。 これは、質問者の選択かと思います。
a.txt 1 2 3 b.txt 10 20 30 1+10=11,2+20=22, 3+30=33 1+20=21,2+30=32 1+30=31 このような結果を欲したのかと・・・。 11__21__31 22__32 33 エクセルに、この計算結果を表示するサンプルコードは次のようです。 ※OKWave では丸投げ禁止ですので ? の部分は質問者で考えて下さい。 Private Sub CommandButton1_Click() Dim H As Integer Dim I As Integer Dim J As Integer Dim strSuji_I() As String Dim strSuji_J() As String strSuji_I() = FileReadArray("C:\Temp\a.txt") strSuji_J() = FileReadArray("C:\Temp\b.txt") For J = 0 To 2 H = 0 For I = J To 2 H = H + 1 Me.Cells(?, ?+1) = Val(strSuji_I(? - 1)) + Val(strSuji_J(?)) Next I Next J End Sub ここでは、Microsoft Scripting Runtime を参照させて FileReadArray関数 を利用しています。 Public Function FileReadArray(ByVal FileName As String) As String() On Error GoTo Err_FileReadArray Dim fso As FileSystemObject Dim strTexts() As String Set fso = New FileSystemObject strTexts() = Split(fso.OpenTextFile(FileName).ReadAll, vbCrLf) Exit_FileReadArray: FileReadArray = strTexts() Exit Function Err_FileReadArray: MsgBox Err.Description & "(FileReadArray)", vbExclamation, " 関数エラーメッセージ" strTexts() = Split("") Resume Exit_FileReadArray End Function
お礼
わかりやすい回答ありがとうございます。まだまだ勉強不足な自分にもわかりやすく助かりました。またなにかあったらよろしくお願いします。本当にありがとうございました。
- benelli
- ベストアンサー率51% (78/152)
お望みの答えが正確にはわかりませんが、こんな感じでよろしいでしょうか? 利用目的はよく分かりませんが、適当に応用してください。 "C:\FileA.txt"と"C:\FileB.txt"は必要にあわせて変えてください。 '----------------------------------------------------- Sub main() 'メイン関数。実際に実行させる部分 For i = 1 To 5 Call fairuyondezureru Next End Sub Sub fairuyondezureru() 'オリジナル関数。処理を行う部分 'いろいろ宣言 Dim dat1int(10) Dim dat2int(10) Dim datrange FileA = "C:\FileA.txt" FileB = "C:\FileB.txt" datrange = 9 Const ForReading = 1 Const ForWriting = 2 'FileA読み込み Set objFS = CreateObject("Scripting.FileSystemObject") Set mydat1 = objFS.opentextfile(FileA, ForReading) For i = 0 To 9 If mydat1.AtEndOfLine = True Then datrange = i - 1 Exit For End If dat1int(i) = CInt(mydat1.ReadLine) Next mydat1.Close 'FileB読み込み Set mydat2 = objFS.opentextfile(FileB, ForReading) For i = 0 To datrange If mydat2.AtEndOfLine = True Then datrange = i - 1 Exit For End If dat2int(i) = CInt(mydat2.ReadLine) Next mydat2.Close '読み込んだふたつの値を計算してなんとなく表示させてみる tempstr = "" For i = 0 To datrange tempstr = tempstr & dat1int(i) & "+" & dat2int(i) & "=" & dat1int(i) + dat2int(i) & vbNewLine Next MsgBox tempstr, vbOKOnly, "ひとまず読み込み結果報告" 'FileBの内容を一個ずらして上書き書きこみ Set mydat2 = objFS.opentextfile(FileB, ForWriting, True) For i = 1 To datrange mydat2.WriteLine dat2int(i) Next mydat2.Close End Sub '-----------------------------------------------------
お礼
ありがとうございます。今試させていただきましたら非常に参考になりました。説明不足で申し訳ありませんでした。結果をEXCELに表示させたっかたのですがそれは自分でがんばってみようと思います。本当にありがとうございました。また何かわからないことがあればよろしくお願いします。
お礼
大変わかりやすく補足していただき、ありがとうございます。答えを丸々教えてくださるのではなくこのようにところどころを「?」でしてくださるので1つ1つ理解しながら自分で考えて進めていけるので大変勉強になります。今回の回答を参考にし、今回の問題を解決できるよう努力します。 ところで3連休は忙しいみたいですね。そのような状況なのに回答していただきありがとうございます。