• 締切
  • すぐに回答を!

一週間前から,今までVBAで行っていたものを,理由がありVisual

  • 質問No.6227604
  • 閲覧数359
  • ありがとう数7
  • 回答数3

お礼率 45% (5/11)

一週間前から,今までVBAで行っていたものを,理由がありVisual Studio 2008を用いて作成しなおしています.

しかし,VB .net自体,完全な初心者で,「独習VisualBasic2008」で勉強しているレベルです.

質問内容はというと,ADOでエクセルファイルのデータを読み込み,DataTableを作成し,DataGridViewで表示するということを行いたいのです.

このような感じで...

cn = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" & ExcelFileName & "; Extended Properties = ""Excel 12.0; HDR=NO""")


dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn)
dAdp.Fill(dSet, "Table1")


dgv1.DataSource = dSet.Tables("Table1")

ここで,Extended PropertiesのHDRがNOになっていることに注目していただきたいのですが,あとでトランスポーズを行いたいため,このようにしています.

そして読み込むデータはこんな感じです.
文字 文字 文字 文字 文字
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
...

ほんとうはもっと大きいのですが,とりあえず,これをこのまま読み込んでしまうとデータ型が自動的に予測されてしまい(デフォルトでは8行目までスキャンされると書いてありました)データ型が自動的にInt32になってしまいます.

このため,DataTableでは一行目が文字ではなくなってしまい

0 0 0 0 0

と表示されてしまいます.

これをそのまま文字として表示させるにはどのようにすればいいのでしょうか?
一行目だけString
二行目からはDouble
のようにしたいのですが..

そしてトランスポーズ後は,
一列目がString
二列目以降はDouble

というようにしたいんです.

よろしくお願い致します.

回答 (全3件)

  • 回答No.3

ベストアンサー率 60% (226/373)

進展しそうなご様子、何よりです。
VS2008 付属のヘルプか、オンラインなら MSDN ライブラリでどうぞ。

http://msdn.microsoft.com/ja-jp/library/aa139615.aspx

VS2008 は .NET Framework 3.5 アプリまで利用できますが、.NET Framework 2.0 がベースになります。
2.0 のクラスライブラリリファレンスは下記です。

http://msdn.microsoft.com/ja-jp/library/ms229335%28v=VS.80%29.aspx

それでは頑張ってください。
お礼コメント
a04sa013

お礼率 45% (5/11)

edp3142様

ありがとうございました.
投稿日時:2010/10/06 13:09
  • 回答No.2

ベストアンサー率 60% (226/373)

とりあえず、すべて文字列として読み込んで(Extended Properties に IMEX=1 を指定) DataTable を作成してから、
データ型を定義した DataTable を別途用意して、変換をかけながらデータ移送してはどうでしょうか。

データ型を定義した DataTable は、型付き DataSet としてデザイナで定義するか、以下のようにコーディングします。

Dim dtNew As New DataTable
dt.Columns.Add("Column1", GetType(String))
dt.Columns.Add("Column2", GetType(Double))

尚、読み込みデータの1行目は見出し行ですので、DataTable の中のデータとして持たせるのではなく、上記の Column1, Column2 のように列名として持たせるべきだと思います。つまり、上記は

Dim dt As DataTable = dSet.Tables("Table1")

Dim dtNew As New DataTable
dt.Columns.Add(dt.Rows(0).Item(0), GetType(String))
dt.Columns.Add(dt.Rows(0).Item(1), GetType(Double))

といった感じに書きなおせるかと思います。
お礼コメント
a04sa013

お礼率 45% (5/11)

edp3142様

ご回答ありがとうございます.
上記アドバイスを元にして,現在うまくいきそうです.重ねて御礼申し上げます.

レベルの低い質問を1つさせてください.

Java APIのように,クラスやメソッドのライブラリーのようなものは,VBにはないのでしょうか?

いまの現状は,やりたいことをgoogleで検索して,さぐりさぐりやっているような状況です.
初心者はこのページを見たらいい!みたいなサイトはありますか?

ちなみに,ぼくはVBAを半年間くらい真剣に勉強して,Excelマクロで出来る範囲のことはすべてできるレベルです(たぶん..).

よろしくお願いします.
投稿日時:2010/10/05 21:09
  • 回答No.1

ベストアンサー率 54% (76/140)

根本的に間違ってます。
ADOはデータベースを読み書きするためのもの。
データベースはフィールド毎にデータ型がほぼ決まっている。
エクセルは、全く違います。
ADOではなく、Excel.Application オブジェクトを使いましょう。
お礼コメント
a04sa013

お礼率 45% (5/11)

お返事ありがとうございます.

読み込むファイル形式はエクセルだけでなく,テキスト形式,CSVと,いろいろあるので,単純にそういうわけにはいかず,少し難しいように感じます.

少し具体的に言いますと,VBのフォームアプリケーションで主成分分析等の多変量解析を行い,その結果をグラフィック表示するようなものを作りたいんです.

なにかアドバイスがありましたら,教えていただけないでしょうか?
投稿日時:2010/10/05 09:02
関連するQ&A
ページ先頭へ