• ベストアンサー

VBAのプログラムで質問です。

行 列 値 1 1 … 2 1 … … … … N 1 … 1 2 … 2 2 … … … … N M … このような行列番号とその値がテキストファイルにあります。 ところどころにデータが飛んでいて、そこの値は0です。 これからエクセルにN*M行列の表を作りたいのですが、 この値が0のデータが飛んでいるのがやっかいで プログラム初心者の私は全く検討がつきません。 お助けください。 お願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

メモ帳に下記のデータを作りました 例データ  間はTABで区切ってます。 1 1 1 2 1 3 3 1 4 4 1 5 1 6 1 2 8 2 2 9 3 2 2 4 2 5 2 1 3 3 2 3 4 3 3 2 4 3 5 3 1 test15.txtで保存 ====== 標準モジュールに Sub test01() Open "C:\Documents and Settings\xxxx\My Documents\text15.txt" For Input As #1 While Not EOF(1) Line Input #1, a 'MsgBox a x = Split(a, vbTab) 'MsgBox x(0) & " " & x(1) & " " & x(2) Worksheets("Sheet2").Cells(Val(x(0)), Val(x(1))) = x(2) Wend Close #1 End Sub ーーーー 実行結果 Sheet2のA1:C5に 1 8 3 3 9 4 4 2 2 6 1 となりました。こういうことでよいですか。 >この値が0のデータが飛んでいるのがやっかいで 意味不明だが空白としました。0にしたいなら、上記コードで、X(2が)空白かどうか聞いて空白の場合、セルにセットする値を0にしてください。

kokoichiko
質問者

お礼

回答してくださってありがとうございました。

kokoichiko
質問者

補足

わかりにくくてすいませんでした。imogasi様が作ったデータだと 1 1 1 2 1 3 3 1 4 5 1 6 1 2 8 2 2 9 3 2 2 1 3 3 2 3 4 3 3 2 5 3 1 こういうことになります。で、 1 8 3 3 9 4 4 2 2 0 0 0 6 1 0 このように表したいです。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#3です。 補足に従えば Sub test02() Open "C:\Documents and Settings\XXXX\My Documents\text15.txt" For Input As #1 While Not EOF(1) Line Input #1, a MsgBox a x = Split(a, vbTab) 'MsgBox x(0) & " " & x(1) & " " & x(2) For i = 0 To 2 If x(i) = "" Then x(i) = 0 Next i Worksheets("Sheet2").Cells(Val(x(0)), Val(x(1))) = x(2) Wend Close #1 End Sub で 結果 A1:C5 1 8 3 3 9 4 4 2 2 0 0 0 6 0 1

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 プログラムの初心者というよりも、質問自体に、データを省略しすぎてしまって、分からなかったです。辛うじて、#3 のimogasiさんのお書きになったデータでやってみることにしました。(Thanks imogasiさん)テキスト・ファイルからのインポートは手を付けないほうが良さそうな気がしました。 >エクセルにN*M行列 説明がありませんが、おそらく、N * M は、数値で、その各列の最大値のような気がします。結果的にそうなるだけだと思いますが、完全に数値がマトリックスになっているのか不明で、既に、数値が入っている場合などのバッティングの問題が出てくるのではないか、とも思いますが。 Sheet1(ActiveSheet) に貼り付けて、区切り位置で分けて、Sheet2 に移すというなら、こんなコードでよいはずです。ただし、これは、A1からということです。A1 からでなければ、For i = 1 と、to LastRow にその行数分を足してあげなくてはなりません。 '------------------------------------ Sub TestMacro1()   Dim LastRow As Long   Dim sh2 As Worksheet   Dim i As Long   Dim n As Long, m As Integer, d As Variant          Set sh2 = Worksheets("Sheet2")   sh2.UsedRange.ClearContents 'シート2のデータを消す      With ActiveSheet '生データのある場所から実行   LastRow = .Range("A1").CurrentRegion.Rows.Count     For i = 1 To LastRow       n = Val(.Cells(i, 1).Value)       m = Val(.Cells(i, 2).Value)       d = .Cells(i, 3).Value       If n >0 And m >0 Then        sh2.Cells(n, m).Value = d       End If     Next i   End With   Set sh2 = Nothing End Sub

noname#192382
noname#192382
回答No.4

No2の補足です。 もとのdataの最後のデータの下に1列目に999というデータを入れておいてください。終わりのしるしです。

noname#192382
noname#192382
回答No.2

マクロを次のようにつくりました。もとのdataをシート1に、出来上がりの配列をシート2に入れることにしています。これでうまくいくと思います。 Option Explicit Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2008/8/23 ユーザー名 : ' Dim mygyo As Integer, myretu As Integer, gyokazu As Integer, retukazu As Integer, myvalue As Variant, myline As Integer myline = 1 Sheets("sheet1").Select Do Until Cells(1, 1) = 999 mygyo = Cells(myline, 1) myretu = Cells(myline, 2) myvalue = Cells(myline, 3) Sheets("sheet2").Select Cells(mygyo, myretu) = myvalue myline = myline + 1 Sheets("sheet1").Select Loop ' End Sub

kokoichiko
質問者

お礼

できました。ありがとうございました。

  • t-sazen
  • ベストアンサー率42% (37/87)
回答No.1

質問の意味がまったくわかりません。。。 各セルのデータがどうなっているとか、それをどうしたいのかとか、0のデータが飛ぶとは???

kokoichiko
質問者

お礼

1 1 … 1 2 … ……… 1 N … 2 1 … 2 2 … 2 3 … ……… 2 N … 3 1 … 3 3 … ……… 3 N … ……… ……… M 1 … M 2 … ……… M N … こんな感じで、列番号 行番号 そこに入る値、の順に書かれたテキストデータがあります。 値のところの0のデータが飛んでいるというのは、上の3列2行のようにデータが抜けているのは、3列2行に入る値が0ということです。 プログラムを組んで、これをN*M行列の形でエクセルに書き表したいです。 わかりにくくて申し訳ないです。よろしくお願いします。

関連するQ&A

  • VBAプログラミングの質問です。

    Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。 1 1 967 2 1 687 ……… x y 802 ……… x行、y列に802を代入するという感じです。全部で57985データあります。 前の回答を参考にして、48881データまではSheet2に For k = 1 To 48881 Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5) Next k このようにプログラムを書いて納まって、残りの57985-48881=9104データの行列はSheet2に納まらなかったので、Sheet3に書こうと思い、下のように書きましたがプログラムがうまく動きませんでした。他にも試しましたが初心者のためダメでした。 Dim n As Long Dim m As Long n = 9104 m = 48881 For k = 1 To n Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5) Next k 48881というのが大きいため動かないと考えられますが、どのように対処したらよいかわかりません。教えてください。お願いします。

  • 行列をベクトルに(C言語)

    行列をベクトルに(C言語) m行n列の行列Aがあったとき、それをm×n行1列の行列(ベクトル)Bに するというプログラムを作りたいです。 これは、行列Aの1列目m行分の要素をそのまま行列Bの1行1列目に持っていき、 それを行列Aのn列の数だけ繰り返す、といった要領です(画像参照) つまり MATRIX B; B.m=A.m*A.n; B.n=1; return B; ということだと思うのですが、なかなかうまいくいきません。 また、構造体も使いたいので、 typedef struct { int m; int n; double *mat; } MATRIX; と宣言しました。 画像は説明のため、一応載せておきました。(例として4列の行列になっています) みなさんよろしくお願いします。

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • C++

    forを使って mとnを入力し(m、nとも最大10)、 m*n個の実数を入力して、m行n列の行列を作る。 この行列に対して、各行の合計、平均及び最大と各列の合計、平均及び最大を求めるプログラムを作成。-----------------------------------------------------------------教えてください。

  • 行列をベクトルに

    m行n列の行列Aがあったとき、それをm×n行1列の行列(ベクトル)Bに するというプログラムを作りたいです。 つまり MATRIX B; B.m=A.m*A.n; B.n=1; return B; ということだと思うのですが、なかなかうまいくいきません。 また、構造体も使いたいので、 typedef struct { int m; int n; double *mat; } MATRIX; と宣言しました。 みなさんよろしくお願いします。

  • VBA初心者です。プログラム教えてください。

    行1にA~Kの値があり、この範囲で、A列に同じ値が入っている限り1、2、3と始まる値が入るよう処理をする。A列の値が変ったら、また1からスタートする値が入るよう処理をしたい。 Sub Work() Dim M As Integer Dim N As Integer M = 2 N = 2 Do While Cells(2 ,N) <> "" Cells(3 , N) <> "" Or C = Cells(3 , N - 1)  (1) N = N + 1 Loop End Sub 上記を作りましたが、(1)の所でデバックしてしまいます。 解決策をぜひ教えてください。よろしくお願いします。

  • 行列式のプログラムでのループがわかりません。

    行列式を求めるプログラムを考えていて、一応はちゃんと答えがでるのですが、 ループを使って計算させようとしたのですがイマイチわかりません。 #include <stdio.h> main() {     int a[3][3]={{1,2,2},{-1,5,3},{2,0,1}};     int i,j,n;     for(i=0;i<3;i++)     {          for(j=0;j<3;j++)              printf("%3d",a[i][j]);              printf("\n");     }     n=a[0][0]*(a[1][1]*a[2][2]-a[1][2]*a[2][1])      -a[1][0]*(a[0][1]*a[2][2]-a[0][2]*a[2][1])      +a[2][0]*(a[0][1]*a[1][2]-a[0][2]*a[1][1]);     printf("この行列の行列式は \n");     printf("%d \n",n); } 1 2 2 -1 5 3 2 0 1 という行列式です。 nの処理をループを使うとどう書いたらいいでしょうか? これはたまたま3行3列だからひとつひとつ指定して計算できますが これが4行4列とかだったら絶対ループ使わなきゃ面倒ですからね~。 とりあえず3行3列のが理解できたらいいとは思うのですがなかなか複雑で難しいですね。

  • 行列に関するプログラムについて

     『m×n 型行列Aの最大成分と最小成分を捜し、それぞれの行番号と列番号を出力するプログラムを作れ』という問題です。  以下のようにBACICで考えたのですが、うまく行番号と列番号を出力するプログラムを作れません。アドバイスいただければと思います。宜しくお願い致します。 100 INPUT m 110 INPUT n 120 DIM A(m,n) 130 MAT INPUT A 140 FOR i=1 TO m 150 FOR j=1 TO n-1 160 LET s=A(i,j) 170 LET t=A(i,j) 180 IF A(i,j)<A(i,j+1) THEN LET s=A(i,j+1) 190 IF A(i,j)>A(i,j+1) THEN LET t=A(i,j+1) 200 NEXT j 210 NEXT i 220 PRINT "最大成分は";s,"最小成分は";t

  • 複素n次正方行列に関する質問です。

    λ∈Cに対して次のような複素n次正方行列N, J[λ](n)を考えます。 Nは、1行2列目、2行3列目、3行4列目、……、(n-1)行n列目の成分が全て1になっていて、残りの成分が全て0の行列です。(つまり単位行列の対角成分を右に一個ずつずらした感じです) J[λ](n)は、対角成分が全てλで、1行2列目、2行3列目、3行4列目、……、(n-1)行n列目の成分が全て1になっていて、残りの成分は全て0の行列です。 したがって、J[λ](n)=λE+N が成り立ちます。それで、k≧nという条件の下で、J[λ](n)のk乗を求めたい場合、 {J[λ](n)}^k=Σ【r=0→k】kCr(λE)^(k-r)*N^r となりますが、このときの1行n列目の成分がどうなるのかわからないので教えてください。 たぶん、kC(k-n)*λ^nか、kC(n-1)*λ^(k-n+1)のどちらかだと思います。

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

専門家に質問してみよう