• 締切済み

グリッドの使い方について

 VB初心者です。 Excelからデータをグリッドに取り込んでグリッドで計算しているのですが、x(i, j) = MSFlexGrid1.TextMatrix(i, j) の文がいろいろ入力してみたのですが、エラーが出てしまいます。  それと計算するときに最初のセルを(3,3)などにしたい時にどうすれば良いのかわかりません。 教えていただければ幸いです。よろしくお願いします。 Dim goukei(10) As Double Dim x(20, 10) As Double For i = 1 To 20 For j = 1 To 10 x(i, j) = MSFlexGrid1.TextMatrix(i, j) Next j Next i For j = 1 To 10 goukei(j) = 0 Next j For i = 1 To 20 For j = 1 To 10 goukei(j) = goukei(j) + x(i, j) Next j Next i For j = 1 To 10 Text1.Text = goukei(j) Next j

みんなの回答

  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

VB6ですか? こういう場合エラーメッセージをちゃんと書きましょう たぶん「型が一致しません」だと思うのですが・・・ TextMatrix(i, j) で得られるのはString型の値です。 代入先がDouble型ですので数値に変換できなければ上記のエラーが発生します Private Const OffsetR = 3 Private Const OffsetC = 3 Private InText as String Dim goukei(10) As Double Dim x(20, 10) As Double For i = 1 To 20  For j = 1 To 10   InText = MSFlexGrid1.TextMatrix(i + OffsetR, j + OffsetC)   'InTextが数値に変換可能か調べる   If IsNumeric(InText) Then    x(i, j) = CDbl(InText)    Else    x(i, j) = 0   End If  Next j Next i

関連するQ&A

  • VBで作成した、プログラムについて

    VBで作成した、プログラムについて VBで作成したプログラムをCで作り直したいです。 ソース(フォーム1ロードから、エンドクラスまで)を下記に記載しておきますので、疑問に答えていただけませんか。 ソース: Dim hensu(3, 4) As Integer Dim goukei, i, j As Integer hensu(0, 0) = 20 hensu(0, 1) = 70 hensu(0, 2) = 60 hensu(0, 3) = 30 hensu(0, 4) = 40 hensu(1, 0) = 30 hensu(1, 1) = 50 hensu(1, 2) = 30 hensu(1, 3) = 90 hensu(1, 4) = 40 hensu(2, 0) = 90 hensu(2, 1) = 20 hensu(2, 2) = 80 hensu(2, 3) = 60 hensu(2, 4) = 20 hensu(3, 0) = 40 hensu(3, 1) = 30 hensu(3, 2) = 30 hensu(3, 3) = 60 hensu(3, 4) = 30 label1.text="" For j = 0 to 4 goukei=0 For i = 1 to 3 goukei = goukei + hensu(i, j) Next label1.text=label1.text & goukei & "," Next End Sub End Class 疑問1 forループの部分は、for(j=0; j<5; j++) { } と、 for(i=1; j<4; j++) { } でいいでしょうか。 疑問2 goukei = goukei + hensu(i,j) はどのように記載すれば、よいでしょうか? 疑問3 label1.text=label1.text & goukei & "," の部分は、どのように記載すればよいでしょうか? 疑問4 hensu(0, 0)=20・・・hensu(3, 4)=30 はどう記載すればよいでしょうか? くだらないかもしれませんが、お早めによろしくお願いします。

  • VB2010での連立方程式の計算

    VB2010でガウスの消去法のプログラムを作りたいんですが、うまく解が求まらないのでメールしました。今回の例は未知数8です。ちなみにVBは初心者です。 Myarrayは、列の1-8個目までが、各未知数の係数、9個目が整数を表しています。 行は式を表していて、未知数が8個あるので8行あります。 Dim MyArray(,) As Double = {{-1, 1, -1, 1, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0, -1}, {0, 0, 0, 0, 0, 0, 0, 1, -1}, {0, 0, 0, 0, 1, 1, 1, 1, 0}, {0, 0, 1, 0, 0, 0, -1, 0, 0}, {0, 2, 0, 0, 0, -2, 0, 0, 0}, {-6, 2, 0, 0, 0, 0, 0, 0, 0}, {6, 2, 0, 0, 0, 0, 0, 0, 0} } Const N = 8 Dim i, j, k, l, pivot As Integer Dim x(N) As Double Dim p, q, m As Double Dim b(1, N + 1) As Double For i = 0 To N - 1 Step 1 m = 0 pivot = i For l = i To N - 1 Step 1 'i列の中で一番値が大きい列を選ぶ If System.Math.Abs(MyArray(l, i)) > m Then m = System.Math.Abs(MyArray(l, i)) pivot = l End If Next 'pivotがiと違えば、行の入れ替え If pivot <> i Then For j = 0 To 8 Step 1 b(0, j) = MyArray(i, j) MyArray(i, j) = MyArray(pivot, j) Myarray(pivot, j) = b(0, j) Next End If Next For k = 0 To N - 1 Step 1 p = Myarray(k, k) '対格要素を保存 MsgBox(p) MyArray(k, k) = 1 '対格要素は1になることが分かっているので代入 For j = k + 1 To N Step 1 MyArray(k, j) = MyArray(k, j) / p Next For i = k + 1 To N - 1 Step 1 q = MyArray(i, k) For j = k + 1 To N Step 1 MyArray(i, j) = MyArray(i, j) - q * MyArray(k, j) Next '0となることが分かってるので代入 MyArray(i, k) = 0 Next Next '解の計算 For i = N - 1 To 0 Step -1 x(i) = MyArray(i, N) For j = N - 1 To i + 1 Step -1 x(i) = x(i) - MyArray(i, j) * x(j) Next Next MsgBox(x(0)) MsgBox(x(1)) MsgBox(x(2)) MsgBox(x(3)) MsgBox(x(4)) MsgBox(x(5)) MsgBox(x(6)) MsgBox(x(7)) 出力結果としてNAN(非数値)と出てきてしまいます。原因は、pに0が入ってしまっていることがあるからだと思いますが、これを回避する方法はないでしょうか?ご教授よろしくお願いします。

  • VB6→VS2005アップグレード後

    いつもお世話になっております。 VBを勉強中です。 VB6→2005にアップグレード後、下記のエラーが発生しました。 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" 以前もこちらでアドバイスをいただき、 デザインの中でADDされているかどうかを確認し、解決に結びついたので 今回も同様かと思い、色々と行ったのですが解決しません。 frmapli_S3のデザイナ内に下記が存在しましたが 原因はここでしょうか? CType(Me.Frame1, System.ComponentModel.ISupportInitialize).EndInit() 以下はVB6での正常稼動時のソースです。 Public Sub ShowPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) Textbox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) PermValue(k) = Textbox.Text Next Next 下記はVB2005アップグレード時のソースです。 Public Sub ShowPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) TextBox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) PermValue(k) = Textbox.Text   ←ここでエラー Next Next End Sub

  • VBのFileOpenとInputというコマンドをVC#で使えませんか?

    例:(VB)   FileOpen(2, "test.txt", OpenMode.Input)   Dim i, j, p, r, t As Integer Dim y, T1 As Double Dim x As Double Dim S1() As Double Dim S2() As Double Try Input(2, y) Input(2, T1) For p = 1 To Emax Input(2, x(p)) Next For t = 1 To Tmax Input(2, S1(t)) Next For t = 1 To Tmax Input(2, S2(t)) Next Catch ex As Exception FileClose(2) Exit Sub End Try

  • VBのプログラムの質問です。

    VBのプログラムの質問です。 100点満点のテストで10人分の点数を一次元配列で読み込み、各人の偏差値を含めて表示するプログラムを作りなさい。 知恵袋で一度同じような質問をしましたが、似たようなエラーが出てきてしまうために 今一度力をお貸しください、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Integer = CInt(TextBox3.Text)  ←ここ Dim p(n) As Integer 'データの取得と平均計算 Dim s As Double = 0 For i As Integer = 0 To n - 1 p(i) = CInt(TextBox1.Lines(i)) s = s + p(i) Next Dim m As Double = s / n '標準偏差の計算 Dim sx As Double = 0 For i As Integer = 0 To n - 1 sx = sx + (p(i) - m) ^ 2 Next Dim sd As Double = (sx / n) ^ (1 / 2) '偏差値の表示 For i As Integer = 0 To n - 1 Dim dv As Double = 50 + 10 * (p(i) - m) / sd TextBox2.Text = TextBox2.Text & Format(dv, "##.#0") & vbCrLf Next End Sub String "" から型 'Integer' への変換は無効です。 と Dim n As Integer = CInt(TextBox3.Text)からでてしまいます。 詳しい方よろしくお願いします

  • 配列を利用したコードにしてください

    下記コードですが 計算速度が遅いので配列を利用した コードに修正してください。お願いいたします。 Dim mx As long Dim Rp As Double Dim yy1 As Double Dim pai As Double Dim Ba AS long Dim i As long, j as long Dim K As Doubke Dim xx1 As Double, yy1 As Double Dim x0 As Double,y0 As Double Dim x1 As Double, y1 As Double mx = Sheets("nn").Range("B65536").End(xlUp).Row Rp1= Sheets("pp").Range("B65536").End(xlUp).Row yy1= Sheets("pp").Range("A25") With Sheets("zzz") pai=Atn(1) * 4 Ba=Sheets("sheet1").Range("A1")  For I = 1 To Ba K = -Sheets("sheet1").Range("B" & I + 3).Value * pai/180 xx1 = Sheets("sheet1").Range("C" & I + 3).Value   yy1 = Sheets("sheet1").Range("D" & I + 3).Value  For j = 1 To mx - 1 x0 = .Cells(2 + j, 2) y0 = .Cells(2 + j, 3) X1 = x0 * Cos(K) + y0 * Sin(K) Y1 = -x0 * Sin(K) + y0 * Cos(K) .Cells(2 + j, 2 * I + 2) = X1 + xx1 - Rp1 .Cells(2 + j, 2 * I + 3) = Y1 + yy1  Next j  Next I End with

  • VBによる回帰直線のプログラム

    VB6を本を見ながら勉強していますが、どの本にもフォーム上にグラフを表示するものばかりでピクチャボックスに回帰直線y=ax+bの直線を描けるようにはどうしたらいいのかプログラムに困っています。どなたか分かる方いましたらよろしくお願いします。ちなみにプログラムはこのようになっています; Private Sub Command1_Click() Dim c(10) As Double Dim d(10) As Double Dim cx As Integer, cy As Integer, lx As Integer, ly As Integer '----------------------------------------------------------------- 'ピクチャボックスの初期化 Picture1.Cls 'グラフの位置 cx = 60 cy = 320 lx = 300 ly = 300 'グラフ枠を描画 Picture1.FillColor = QBColor(15) Picture1.Line (cx, cy)-(cx + lx, cy - ly), , B '縦軸の目盛り Picture1.DrawStyle = 2 '線の種類 点線 For i = 0 To 5 Picture1.Line (cx, cy - 60 * i)-(cx + lx, cy - 60 * i) Picture1.CurrentX = cx - 25 'ラベルを表示する場所の指定 Picture1.CurrentY = cy - 60 * i '横軸を描画 Picture1.Print Format(i) 'ラベル出力位置を設定 '(i*縦軸の目盛りの倍数 現在は10倍 Next i '横軸の目盛り For i = 0 To 5 Picture1.Line (cx + 60 * i, cy)-(cx + 60 * i, cy - ly) Picture1.CurrentX = cx + 60 * i Picture1.CurrentY = cy + 5 Picture1.Print Format(i) Next i '------------------------------------------------------------------------ Dim n As Integer 'n:データ数 n = Val(Text3.Text) For i = 0 To n - 1 c(i) = Val(Text1(i).Text) d(i) = Val(Text2(i).Text) Next i 'データを○印でプロット For i = 0 To n - 1 Picture1.Circle (cx + 60 * c(i), cy - 60 * d(i)), 3, QBColor(0) Next i 'ここまで成功---------------------------------------------------------------------- 'xに関する平均値と標準偏差の計算プログラム Dim sx As Double, sxx As Double, avx As Double, sdx As Double Dim x(10) As Integer For i = 0 To n - 1 x(i + 1) = c(i) Next i sx = 0 sxx = 0 For i = 1 To n sx = sx + x(i) sxx = sxx + x(i) * x(i) Next i avx = sx / n sdx = Sqr((sxx - n * avx * avx) / n) 'yに関する平均値と標準偏差の計算プログラム Dim sy As Double, syy As Double, svy As Double, sdy As Double Dim y(10) As Double 'インデックスが範囲を超えているのエラーの解決 10を代入 For i = 0 To n - 1 y(i + 1) = d(i) Next i sy = 0 syy = 0 For i = 1 To n sy = sy + y(i) syy = syy + y(i) * y(i) Next i avy = sy / n sdy = Sqr((syy - n * avy * avy) / n) '-------------------------------------------------------------------------------------- '回帰直線y=ax+bを描く End Sub

  • EXCEL VBA 配列変数の値すべてを返すには

    EXCELは2002ですが、97でも動くと嬉しいです。 《質問》 1~10をランダムに並べるためのプログラムを書きました。 これはこれで動くのですが、一行(3行目)だではなく 4行目にも、5行目にも同じことをしたい場合、 バブルソートの部分をサブルーチン(関数)にしたいのですが X_v() = GetSortArray(n_s,n_v)()とはできません。.cloneもだめですよね。 かといって、要素毎に引くとその度にRndが効いて、1~10が並びません。 どのようにやるのが、スマートなのでしょうか?よろしくお願いします。 《以下プログラム》 Sub Bu_Click() Dim i As Integer Dim j As Integer Const n_e = 10 Const n_s = 1 Dim X_r(n_e) As Long Dim X_v(n_e) As Long Dim temp1 As Long Dim temp2 As Integer Randomize For i = n_s To n_e X_r(i) = Int(Rnd * 10 ^ 9) X_v(i) = i Next i For i = n_s To n_e - 1 For j = n_s To n_e - 1 If X_r(j + 1) < X_r(j) Then temp1 = X_r(j + 1) X_r(j + 1) = X_r(j) X_r(j) = temp1 temp2 = X_v(j + 1) X_v(j + 1) = X_v(j) X_v(j) = temp2 End If Next j Next i For i = 0 To n_e - 1 Cells(3, 3 + i).Value = X_v(i + 1) Next i End Sub Public Function GetSortArray(s As Integer, e As Integer) As Long() Dim r() As Long Dim v() As Long Dim temp1 As Long Dim temp2 As Integer ReDim r(e) ReDim v(e) Randomize For i = s To e r(i) = Int(Rnd * 10 ^ 9) v(i) = i Next i For i = s To e - 1 For j = s To e - 1 If r(j + 1) < r(j) Then temp1 = r(j + 1) r(j + 1) = r(j) r(j) = temp1 temp2 = v(j + 1) v(j + 1) = v(j) v(j) = temp2 End If Next j Next i GetSortArray = v() End Function ありゃ?Tabのスペース消えますね。

  • 文字制限方法。

    どなたか知識ある方、教えてください。 ソートプログラムの演習をしているんですが、 どのように書いていいか悩んでます。現在の課題はtextが10個あり、sortボタンをクリックすると左から数字を小さい順に並びます、数字のみ入力可、空白でもエラーなしで(全て空白はエラー)とりあえず数字があれば10個埋めていなくても並べる、文字等はエラーを出したいです。 '配列のインデックス番号の開始に1を設定 Option Base 1 Option Explicit Private Sub cmdCLEAR_Click() '変数の宣言 Dim ans As Integer Dim i As Integer '消去する際の確認事項 ans = MsgBox("消去していいですか?", vbYesNo + vbQuestion) Select Case ans Case vbYes For i = 1 To 10 Step 1 Text(i).Text = "" Next i Case vbNo MsgBox "取り消します", vbInformation End Select End Sub Private Sub cmdSORT_Click() '変数の宣言 Dim intNum(10) As Integer Dim S As Integer Dim j As Integer Dim k As Integer Dim i As Integer '配列の整理 For i = 1 To 10 Step 1 intNum(i) = Int(Text(i).Text) Next i 'バブルソート For k = 1 To 9 Step 1 For j = 1 To 9 Step 1 If intNum(j) > intNum(j + 1) Then S = intNum(j) intNum(j) = intNum(j + 1) intNum(j + 1) = S End If Next j Next k '結果を返して表記する For i = 1 To 10 Step 1 Text(i).Text = intNum(i) Next i End Sub 現在書いたのはここまででどうしてもエラーと文字制限の方法はわからないので教えていただける方、宜しくお願いします。

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

専門家に質問してみよう