• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ソースの書き換えに挑戦中: 「インデックスが有効範囲にありません」 でお手上げ)

ソースの書き換えに挑戦中:「インデックスが有効範囲にありません」でお手上げ

このQ&Aのポイント
  • このQ&Aサイトで「Kaplan-Meyer生存分析に便利なソフトを教えて」と質問したshuu_01が、VisualBasicのソースを書き換える挑戦につまずいています。
  • 実行時エラーが発生し、インデックスが有効範囲にないことが原因です。
  • 以前のソースコードとの違いがわからず、解決方法に困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

dmの件にあわせてtも動的配列なのに、redimで初期化が行われていません。 この辺のサイトを参考に配列の基本を確認しましょう。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_07.html ただしその辺の矛盾をなくしたとしてもそのコードではまともに動かないでしょう。とりあえずその部分を読んだだけでは意図は何となく分かりますが、作り直す必要があるかと思います。 こちらを参考に。 配列を使ったセル処理の参考 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_array.html

shuu_01
質問者

お礼

popesyu さん、完璧な回答ありがとうございます。 ReDim で初期化をして、そのエラーは出なくなりました。 そして popesyu さんのご明察のとおり、次のエラーにぶちあたりましたが、教えてくださったサイトに答えがありそうなので一生懸命勉強します。本当にありがとう(^_^)v

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

Dim dm As Range dmは配列じゃないし、 dm(i) は配列だし、 どこが違うのだろう。

shuu_01
質問者

お礼

okormazd さん、とても早い回答ありがとう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • String だと「 ByRef引数の型が一致しません 」というエラーが出ます。なぜ?

    ここで「Kaplan-Meyer 生存分析に便利なソフトを教えて」と質問した shuu_01 です。ここで VisualBasic のソースのありかを教えて頂き、自分に使いやすいようソースを書き換えようと奮闘中です(それまで VisualBasic の経験がなく 無謀!と実感中です)。 元々のソースはグラフが1本だけだったので、肺癌だと「腺癌」「扁平上皮癌」「小細胞癌」、、といろんな癌の種類別にグラフを数本 書くのが目標です。そこで、 Sub km_test() Dim nc As Integer, gr() As String nc = 2 ReDim gr(nc) gr(0) = "腺癌" gr(1) = "扁平上皮癌" gr(2) = "小細胞癌" km_group_test nc, gr End Sub Sub km_group_test(nc As Integer, gr As String) End Sub というソースを書くと: String の変数 gr の色が変わり、「 ByRef引数の型が一致しません 」というエラーが出ます。 Integer の変数 nc ではエラーが出ません。 きちんと型を一致させているつもりなのに、なぜ???

  • Kaplan-Meyer 生存分析に便利なソフトを教えて

    医療関係者(医師)です。Kaplan-Meyer 生存分析をするのに使いやすいソフトを教えて頂けませんか? 現在、FileMaker のデータを Excel に export して、「4stepsエクセル統計」(税込み 4200円)付録の「Statcel2」を用い、生存分析できているのですが、(1) たとえば 肺癌の stage1 から stage4 までの生存分析をしてくれるものの別々のグラフに表示され、1つに手作業でまとめなければならず面倒、(2) 生存期間 0.125月 など 1以下の少数がエラーになる、(3) 表の隣り合った列に並べてからデータの範囲を指定しないといけない、(4) 打ち切り、非打ち切りを 0,1 で指定しなければならない、など不便な所があります。Statistica version6 というソフトが良いと聞き、生存分析してみた所、(2) はエラーにならず、(3) は離れた項目でも選択でき、(4) は「打ち切り」、「非打ち切り」 のままでも良いのですが、(1) は Statcel2 よりさらに使いにいでした。

  • OLEDragDropで フォームとSSTABの違いがわからない。

    VisualBasicを使っています。 OLEDragDropを使おうとしていますが、フォームの方は正しく動作しましたが、 SSTABの方はファイルをドロップさせても無反応でした。 使い方を間違えているのでしょうか? Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub Private Sub SSTab1_OLEDragDrop(Data As TabDlg.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub

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

    連立方程式を解くプログラムにおいて、連立方程式の解をテキストファイルに記録する作業を行うために以下のようにしました。 [連立方程式の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 すると、「インデックスが配列の境界外です」とエラーメッセージが出てしまいました。理由がまったく分かりません。 どなたかご回答よろしくお願いします。

  • 配列変数 インデックス番号の最小値

     特に指定しない場合、配列変数のインデックス番号の最小値は0から始まるはずですが、下記のプロシージャでは、abの最小インデックス番号は1,2次元とも「0」でなく「1」から始まります(ウォッチ式で見ても「1」から始まっています)。 「0」から始まらない理由が分かりません。 ご教授を よろしくお願いいたします。 Public Sub セル参照() ' "A1:B10"のセル範囲のデータを順番にメッセージボックスに表示する。 Dim ab As Variant Dim i As Integer, j As Integer ab = Worksheets("Sheet1").Range("A1:B10").Value For i = 1 To UBound(ab, 1) For j = 1 To UBound(ab, 2) MsgBox ab(i, j) Next j Next i End Sub

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

  • VisualBasic2005 ボタンを押したとき、DirectXで解像度を変更するには

    VisualBasic2005 ボタンを押したとき、DirectXで解像度を変更するには ボタンをクリックすると解像度を変える 例)1280,800 → 800,600 アプリケーションを終了したら 元の解像度に戻す のようなものを作りたいのです。 SetDisplayModeの定義は Public Sub SetDisplayMode( _ ByVal width As Integer, _ ByVal height As Integer, _ ByVal bitPerPixel As Integer, _ ByVal refreshRate As Integer, _ ByVal standardVgaMode As Boolean ) と教えていただきました。 ボタンを押したときの処理がよく分からないので どのように書くと解像度が変わるか教えてください。 VisualBasic2005 DirectX10 WindowsVista を使っています。

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • 範囲名定義の削除マクロ

    よろしくお願いします。 ブックに不定数の範囲名が設定されていて、ある複数の範囲名を除き、他はすべて削除するマクロを組もうと思い、以下の通りに組んでみました。 範囲名 A と Q 以外はすべて削除するつもりなのですが、 If 範囲名(i) <> "A" Or "Q" Then の行で「型が一致しません。」とエラーが出ます。 If 範囲名(i) <> "A" Then と Or を使わなければ、成功するのですが・・・。 Or はこの場合使えないということなんでしょうか? まったく違った組み方もあると思いますが、含めてご教授願います。 以下、自作マクロサンプル ----- Sub 不要範囲削除() Dim i As Integer Dim 範囲名(20) As String With ActiveWorkbook NC = .Names.Count For i = 1 To NC 範囲名(i) = .Names(i).Name Next For i = 1 To NC If 範囲名(i) <> "A" Or "Q" Then .Names(範囲名(i)).Delete End If Next End With End Sub

  • Functionプロシージャの便利さがわかりません

    私はVBAコードを作る時は、もっぱらsubプロシージャーを使ってしまうのですが、 http://excelvba.pc-users.net/fol5/5_4.html を参考に、 Functionプロシージャとsubプロシージャの違いを確認してみたのですが、 Functionプロシージャの便利さがわかりません。 *********************************** Sub Test() SubプロシージャとFunctionプロシージャのテスト i = 1 Call Subプロシージャ(i) i = Functionプロシージャ(i) MsgBox "Functionプロシージャ結果:" + CStr(i) End Sub Sub Subプロシージャ(ByVal i As Integer) MsgBox "Subプロシージャ結果:" + CStr(i) End Sub Function Functionプロシージャ(ByVal i As Integer) As Integer i = i + 1 Functionプロシージャ = i End Function *********************************** Functionプロシージャは、 (ByVal i As Integer) As Integer のように、、二回もデータ型(Integer)の指定をしなくてはいけないのでしょうか? リンク先の説明には、 「SubプロシージャとFunctionプロシージャの違いは Subプロシージャが引数を受け取るのみに対して Functionプロシージャは引数を受け取り、 戻り値を返すという関数としての役割を果たすことができる点です。」 と記載されてますが、 それはSubプロシージャでも出来てますよね? サンプルコードにおいてのFunctionプロシージャの便利さを教えてください。