• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答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/17070)
回答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