• 締切済み

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

一週間前から,今まで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 というようにしたいんです. よろしくお願い致します.

みんなの回答

noname#259269
noname#259269
回答No.3

進展しそうなご様子、何よりです。 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
質問者

お礼

edp3142様 ありがとうございました.

noname#259269
noname#259269
回答No.2

とりあえず、すべて文字列として読み込んで(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
質問者

お礼

edp3142様 ご回答ありがとうございます. 上記アドバイスを元にして,現在うまくいきそうです.重ねて御礼申し上げます. レベルの低い質問を1つさせてください. Java APIのように,クラスやメソッドのライブラリーのようなものは,VBにはないのでしょうか? いまの現状は,やりたいことをgoogleで検索して,さぐりさぐりやっているような状況です. 初心者はこのページを見たらいい!みたいなサイトはありますか? ちなみに,ぼくはVBAを半年間くらい真剣に勉強して,Excelマクロで出来る範囲のことはすべてできるレベルです(たぶん..). よろしくお願いします.

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

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

a04sa013
質問者

お礼

お返事ありがとうございます. 読み込むファイル形式はエクセルだけでなく,テキスト形式,CSVと,いろいろあるので,単純にそういうわけにはいかず,少し難しいように感じます. 少し具体的に言いますと,VBのフォームアプリケーションで主成分分析等の多変量解析を行い,その結果をグラフィック表示するようなものを作りたいんです. なにかアドバイスがありましたら,教えていただけないでしょうか?

関連するQ&A

  • VB2008データベース

    非接続型データベースでUpdateをする文を書いていますがUpdateでエラーが出てしまいます。  OleDbCommandBuilder の参照をネットで確認等していますがエラーの内容がわかりません。 データベース参考書等にも下記と同じ文例でかいてあります。 どなたか教えてください。 *VB2008で開発しています。 Dim cn As OleDb.OleDbConnection Dim Buf As String Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet Dim dTbl As DataTable Dim cBuild As OleDb.OleDbCommandBuilder Buf$ = DefCnSt$ & X_SystemFile$ & ";Jet OLEDB:Database Password=" & XdtPs$ cn = New OleDb.OleDbConnection(Buf$) dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 物件", cn) dSet = New DataSet("物件") dAdp.Fill(dSet, "物件") dTbl = dSet.Tables("物件") dTbl.Rows(2)(1) = "ABC" cBuild = New OleDb.OleDbCommandBuilder(dAdp) dAdp.Update(dSet, "物件") <-ここでエラーが出ます。

  • C#でアクセスに更新するときの文字の色&呼び出すときの文字の色

    はじめまして。今回質問させていただく内容は。 C#でSQL文によってACCESSに更新するとき、更新した文字を更新したとわかりやすくACCESSのテーブルに赤色で表示させたいのですが。 SQL文によってどのように文字の色を変化させて追加するのかわからずにいます。 そしてこのことが可能であるならば、ACCESSのテーブルをSQL文で呼び出しデータグリッドビューに表示させるときもACCESSのテーブルのレコードの文字の色もまるっきり同じに呼び出すことは可能でしょうか? 下記にSQLでアクセスに更新するプログラミングと呼び出すとき使ったプログラミングを記述しておきます。 もし可能なら方法などご回答いただけたら嬉しいです。 ACCESSのデータを更新するプログラム System.Data.OleDb.OleDbCommandBuilder cBuild; System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("t_作業実績"); DataTable dTbl; System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source =C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //データセットに取得する dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績",cn); dAdp.Fill(dSet, "t_作業実績"); //コマンドビルダの作成 cBuild = new System.Data.OleDb.OleDbCommandBuilder(dAdp); //データセットからテーブルを取得して更新する dTbl = dSet.Tables["t_作業実績"]; dTbl.Rows[num-1]["移動個数"] = textBox2.Text; dAdp.Update(dSet, "t_作業実績"); MessageBox.Show("ok"); ACCESSからデータグリッドビューへ呼び出すプログラム System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("作業実績"); System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb //datasetに取得し、DATAGRIDVIEWに関連ずけする dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績", cn); dAdp.Fill(dSet, "作業実績"); dataGridView2.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; dataGridView2.DataSource = dSet.Tables["作業実績"];

  • OLE でACCESSデータを取得するとメモ型の内容255文字で切れてしまう

    お世話になります。 ■開発環境  VisualBasic2008 Express Edition  ACCESS2003(データ) ■質問内容  VBでaccessのmdbからデータを取得し、画面に表示しようと  しています。  ところが、メモ型の項目が255文字で切れてしまいます。  webでいろいろと調べましたが、jetエンジンの問題かなという  ところまではたどり着いたのですが、具体的にどうすれば改善  できるのかわかりません。  わかる方教えていただけないでしょうか。  よろしくお願いいたします。 ■ソース Dim SQL As String Dim Cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\message.mdb;") Dim dAdp As OleDb.OleDbDataAdapter Dim dView As DataView Dim dSet As DataSet = New DataSet("Detail") SQL = "SELECT M_ID,M_Title,M_Detail FROM MESSAGE_TBL " dAdp = New OleDb.OleDbDataAdapter(SQL, Cn) dAdp.Fill(dSet, "Detail") dView = New DataView(dSet.Tables("Detail"), "", "", DataViewRowState.CurrentRows) DataGridView1.DataSource = dView M_ID : 数値型、M_Title : テキスト型、M_Detail : メモ型 DataGridView1に表示されるときには、M_Detailが255文字になっています。     また、 'MessageBox.Show(Len(dSet.Tables("Detail").Rows(1)(2)))     で見たときにすでに255文字に切れていました。

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • GridViewのデータソースの入れ方がわかりません

    OleDb.OleDbDataAdapter' が定義されていません DataSet' が定義されていません。 OleDb.OleDbConnection' が定義されていません。 OleDb.OleDbDataAdapter' が定義されていません 以上の エラーが出ます 定義の、意味がわかりません 教えてください お願いします WinXP Microsoft Visual Web Developer 2008 ASPX Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("顧客台帳") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\*******\*****.mdb;") 'データセットに取得し、DataGridViewに関連付ける dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 顧客台帳", cn) dAdp.Fill(dSet, "顧客台帳") Me.GridView1.DataSource = dSet.Tables("顧客台帳") End Sub

  • Datagridviewのコンボボックスにつきまして

    vb2005です。 DataGridViewコントロールのデータセットにデータベースのテーブルをセットしています。 そのDataGridViewの1列目にコンボボックスを設定し、 そのコンボボックスのデータセットにも別のテーブルをセットしたいのです。 Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As New DataSet Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\DB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") DataGridView1.DataSource = dSet.Tables("t_商品") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 品種", cn) dAdp.Fill(dSet, "t_品種") Dim col As System.Windows.Forms.DataGridViewComboBoxColumn = DataGridView1.Columns(1) ・・・・★ col.DataSource = dtSet.Tables("t_品種") col.DisplayMember = "品種名" col.ValueMember = "品種コード" 上記のように記述しているのですが、★の部分で、下記のエラーになります。 型 'System.Windows.Forms.DataGridViewTextBoxColumn' のオブジェクトを型 'System.Windows.Forms.DataGridViewComboBoxColumn' にキャストできません データソースを指定したDataGridViewの列にはコンボボックス等の設定は 出来ないのでしょうか?

  • DataGridViewからDBの更新

    DataGridViewの内容を変更してボタンを押したらDBを更新する ということをしたいのですが とあるサンプルコードには Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_商品") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=C:\VB2008\SampleDB.accdb;") 'データセットに取得してデータを表示する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品", cn) dAdp.Fill(dSet, "t_商品") Me.DataGridView1.DataSource = dSet.Tables("t_商品") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dTbl As DataTable Dim dRow As DataRow Dim i As Integer 'DataGridからデータソースを取得する dTbl = Me.DataGridView1.DataSource '編集された行をコミットする For Each dRow In dTbl.Rows If dRow.RowState <> DataRowState.Unchanged Then dRow.AcceptChanges() End If Next End Sub End Class となっているのですがこのまま使用しても更新されません 全くの他力本願な質問ですがよろしくおねがいします イミデイトにはグリッド内容をnchange」になっています?

  • VB 2008 Express Editionでデータの抽出ができない

    VB 2008 Express Editionでデータの抽出ができません。 「Btn検索」ボタン押下時に「TextBox1.text」のデータで抽出を行いたいのですがデバッグして「TextBox1.text」にデータを入力して「Btn検索」ボタンを押下すると 「OledbExceptionはハンドルされませんでした。1つ以上の必要な値のパラメータが設定されていません」と表示されてしまいます。 ちなみにソースは下記になります。 -------------------------------------------------------------- Private Sub Btn検索_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn検索.Click Dim cn As New OleDb.OleDbConnection Dim dView As New DataView Dim strRec As String cn.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source = C;\管理台帳データベース.mdb" dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名=TextBox1.Text", cn) dadp.Fill(dset, "PC管理台帳") 'データベースの表示 DataGridView1.DataSource = dset.Tables("PC管理台帳") End Sub -------------------------------------------------------------- ちなみに下記のようにTextBox1.Textを'1111'とかにするとうまく抽出できます。 dadp = New OleDb.OleDbDataAdapter("SELECT * FROM PC管理台帳 WHERE 新PC名='1111'", cn) となたかアドバイスお願いします。

  • visualbasic2013 Excel出力

    以下の開発環境でOleDbを利用してExcelファイルの出力を 行いたいと考えております。 ・visualbasic2013(Pro) ・クライアントにはExcelインストール済 以下のコードを実装しています。 Dim cn As System.Data.OleDb.OleDbConnection '/ ADO.NET接続用 cn = New System.Data.OleDb.OleDbConnection() cn.ConnectionString = "provider=Microsoft.jet.OLEDB.4.0;Data source=" & _ "E:\test.xls" & ";Extended properties=""Excel 8.0;HDR=YES;IMEX=1""" '/ Excelファイル新規作成 cn.Open() 上記を実行すると cn.Open()で例外が発生してしまいます。 ※ファイルが存在しない 新規にファイル作成したいのでファイルが存在しない状態で 実行しているのですが、そもそもの考え方が誤っているのでは ないかと危惧しております。 実現したい事はOleDbを利用して新規Excelファイルを生成する事です。 大変恐れ入りますが分る方がいらっしゃいましたら ご教授頂けないでしょうか。 以上です。

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

専門家に質問してみよう