• 締切済み

インデックスが配列の境界外です。と出ます

お世話になります。 VB2008でiniファイルの中身を書き換えるプログラムを作っているのですが ↓コード     Dim LineLists As String Dim FileObj As Object Dim ListFile As String Dim f As New Form2 If f.ShowDialog(Me) = DialogResult.OK Then Vertext.Text = f.TextBox1.Text End If Try FileObj = New IO.StreamReader(Foldername & "\CUS\Basic.ini", System.Text.Encoding.Default) ListFile = FileObj.ReadToEnd() FileObj.Close() Catch ex As Exception MessageBox.Show("指定のファイルが見つかりません", "エラー", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try LineLists = Split(ListFile, ControlChars.CrLf) Dim ap As String ap = LineLists(11).Substring(11, 3) LineLists(11) = LineLists(11).Replace(ap, Vertext.Text) LineLists(1) = LineLists(1).Replace("K ", "G") LineLists(3) = LineLists(3).Replace("K", "G") LineLists(3) = LineLists(3).Replace("C5", "45") LineLists(69) = LineLists(69).Replace("Mos", "Gen") LineLists(75) = LineLists(75).Replace("Mos", "Gen") LineLists(81) = LineLists(81).Replace("Mos", "Gen") LineLists(292) = LineLists(292).Replace("L.EXE", "DL.EXE") LineLists(636) = LineLists(636).Replace("E_001=K_A.kmp", "E_001=KAA.kmp") まずiniファイルを1行ずつ配列に格納し、それを行指定して文字列を置換するのですが、ちょうど最後の636のところでエラーが出ます。 最初は、テキストボックスに書き込み、置換する文字列を1行ずつ検索していって置換するコードでしたが、あまりに処理時間がかかるのでこちらの方法でやっているのですが・・・ 上記の方法ではできましたが、こちらでやるとエラーが出てしまったので、解決策がわかりません。VB初めて2週間です。 どなたかよろしくおねがいします。

みんなの回答

  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.1

iniファイルが637行まで無いんじゃないかなぁ。 VBの場合配列の添え字は0~はじまるので(確か) 読み込んだレコード(行)の 1行目が、LineLists(0) 636行目が、LineLists(635) になります。 iniファイルが636行だとすると、LineListsの配列の添え字は0~635ですよ。 全体的に1ずつずれていないでしょうか?

nyoro514
質問者

お礼

原因がわかりました。 デバックした後のiniファイルを見ると500行しかありませんでした。 どうやらLineListsの配列に500行分しかいれれないので、それ以降のものは入れれないみたいです・・・ 違う方法でやってみます。ありがとうございました。

関連するQ&A

  • テキストファイルを保存しきれない

    いつもありがとうございます。 iniファイルを置換して上書き保存するのですが、置換して保存すると保存後のファイルの最後のほうが切れて保存しきれていませんでした。 保存前→100行 保存後→80行 な感じです。コードが悪いんだと思いますが、どなたか教えていただけないでしょうか。 Dim FileObj13 As Object Dim ListFile13 As String Try FileObj13 = New IO.StreamReader(Foldername & "\CUS\UISetup.ini", System.Text.Encoding.Default) ListFile13 = FileObj13.ReadToEnd() FileObj13.Close() Catch ex As Exception MessageBox.Show("指定のファイルが見つかりません", "エラー", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try '置換 ListFile13 = ListFile13.Replace("K", "G") ListFile13 = ListFile13.Replace("C5", "45") 'ファイルを上書きで保存するための指定 Dim writer13 As New System.IO.StreamWriter(Foldername & "\CUSUISetup.ini", False, System.Text.Encoding.Default) writer13.Write(ListFile13) Label2.Text = "完了"

  • VBAの正規表現

    VBAで正規表現による置換をしたいです。 以下のような行が複数あります。 1 aaa bbb ccc ddd 2 aaa bbb ccc ddd 3 aaa bbb ccce ddd 4 aaa bbb eccc ddd ccc の部分のみ置換したいです。 dim hensuu as string dim replace as string replace = eee hensuu = ccc (省略) strPattern = "(\s*)" & hensuu & "(\s+)" rep = RegExpObj.Replace(buf, "\1" & replace & "\2") 行数1,2 のみを置換したのですが、4も置換されてしまいます。 (\s*) の "*" が良くないのは理解していますが、"+" にしてもうまくいきません。 どなたかどのようにしたら1,2のみ置換できるようになるかをご教授お願いできませんでしょうか よろしくお願いいたします。

  • インデックスが配列の境界外です。というメッセージ

    連立方程式を解くプログラムにおいて、連立方程式の解をテキストファイルに記録する作業を行うために以下のようにしました。 [連立方程式のPAD] Dim File As Integer File = FreeFile() FileOpen(File, "ABC.txt", OpenMode.Output) Dim i As Integer For i = 0 To N_i - 1 WriteLine(File, b_data(i)) Next i FileClose(File) End Sub すると、「インデックスが配列の境界外です」とエラーメッセージが出てしまいました。理由がまったく分かりません。 どなたかご回答よろしくお願いします。

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

  • VB(2008)で文字列の置き換え

    Dim a As String Dim b As String a = TextBox1.Text b = a.Replace("hogehoge", "fuga") b = a.Replace("piyo","xyzzy") b = a.Replace("foo", "bar") Textbox2.Text= b のようにしているのですが、置き換えることができません。 初歩的な内容ですがどなたかよろしくお願いします。

  • Excelの表の項目名(フィールド名)が勝手に書き換えられる

    Excelの表の項目名(フィールド名)が勝手に書き換えられる ある日突然Excelの表の項目名(フィールド名)が勝手に書き換えられるようになりました。 これまでの手順は以下です。 1.新規ブックを作成 2.項目名(フィールド名)を手入力 3.データは既存の社内のファイルから「形式を選択して貼り付け」-「値」でコピー 4.「Excelの○意 6 VBAの実践テクニック」の「株式会社や(株)等の表記を統一したい」のいコードをコ ピーしました。コードの内容は以下でした。 ----------------------------------------------------- <内容> Sub 株式会社統一() Dim 置換1 As String Dim 置換2 As String Dim 統一 As String 置換1 = "株式会社" 置換2 = "(株)" 統一 = "(株)" Cells.Replace What:=置換1, Replacement:=統一 Cells.Replace What:=置換2, Replacement:=統一 End Sub Sub 有限会社統一() Dim セル As Range Dim 置換1 As String Dim 置換2 As String Dim 統一 As String Dim 変換文字 As String 置換1 = "有限会社" 置換2 = "(有)" 統一 = "(有)" For Each セル In Selection 変換文字 = セル.Text 変換文字 = WorksheetFunction.Substitute( _ 変換文字, 置換1, 統一) 変換文字 = WorksheetFunction.Substitute( _ 変換文字, 置換2, 統一) セル.Offset(, 2).Value = 変換文字 Next End Sub ----------------------------------------------------- 症状としては例えば「G1」セルの項目名「名前」が「住所」に勝手に変わります。 変わるタイミングは  1.上記マクロを実行  2.上書き保存  3.別ウィンドウを別作業をしたり、化粧直しなどに立つなど「数分」たったあと コードが原因なのか、ウィルスか何か悪いプログラムが使用PCに入っているのかわかりません。 どなたか心あたりのある方がいらっしゃいましたらアドバイスをお願いします。<(_ _)>

  • vb 配列の再検索について

    こんばんは、 vbで悩んでいます。  配列の検索で、みつかったら、行と位置を出力する でた結果の次の行から 再検索する ということをしたいのですが。 一回目の検索はできるのですが、ボタンをおしたら つづいて 検索できるようにしたいのです。 できたら、アドバイス等おねがいいたいします。 Dim i,r,j As Integer Dim a1() As String Dim a2 As String a2 = Text.Text For j = LBound(a1) To UBound(a1) r = r + 1 i = a1(j).IndexOf(a2, 0) Do Until i <> 0 text1.Text = Val(i + 1)  i = a1(j).IndexOf(a2, i + 1) text2.Text = r  text3.Text = a1(j) If i <> 0 Then Exit For End If Loop Next a1に以下の内容があった時 a1(0) = "例1" a1(1) = "例2" a1(2) = "例3" ”例”と検索をかけると、 text1.Textには 1と出力。(位置表す) text2.Textには 1と出力。(行表す) text3.Textには 例1と出力。 exit for でループをぬけているのですが。 これを、検索ボタンを押すたびに、行と位置 が表示されるようにしたいのですが、 アドバイスおねがいします。

  • テキストファイルを読み込み 偶数行の特定の文字を置換するには?

    お世話になります。 vb6なんですけどテキストファイルを読み込んで 偶数行のある文字を置換したいんですけど このサンプルをどういう風に改変して偶数行の文字列をある文字列に 置換するコードを書いてよいのかわかりません。 置換するのはreplace関数を使うと思うのですが。 教えて下さい。お願いします。 Dim n As Long, tmp As String n = FreeFile Open "D:\Test.txt" For Input As #n Line Input #n, tmp Close #n

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?