VBによるExcelデータ抽出について困っています

このQ&Aのポイント
  • VB.NET(2003)とOffice2003、OS XPの開発環境で複数のエクセルシートのデータを抽出したいです。
  • 参考URLを元にデータ抽出用のモジュールを作成し、2回目の抽出時にエラーが発生しています。
  • 解決策を探しているので、アドバイスをいただきたいです。
回答を見る
  • ベストアンサー

VBによるExcelのデータ抽出について

初歩的なことで困っています。下記質問の内容で教えていただけたら助かります。 開発環境は、VB.NET(2003)、Office2003、OS XPです。 複数のエクセルシートのデータを抽出したく、下記URLを参考にして、データ抽出用のモジュールを一つ作成し、(殆どURLのまま:シート名を引数で渡すぐらいの変更)、データを抽出する度に、このモジュールが呼ばれるようなプログラムになっています。 実際に、動作させると2回目の抽出時(2回目を呼び出した時)に「Fill」の部分で下記エラーが表示されます(1回目は正常に抽出できます)。 いろいろ調べても解決できず、困っています。何か良いアドバイスがあれば、宜しく御願いします。 Error: 「System.NullReferenceException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。」 OKボタン押下で「現在の場所のソースコードを表示できません。」と表示。 URL: http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp

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

  • ベストアンサー
回答No.1

原因は、、、よくわかりませんが、、、、 おそらく MyConnection.Close の部分が絡んでいると思います。 その部分をコメント化してみたらどうなります? 私はこういった機能は、カプセル化を行い、クラスにして利用することが多いです。 不要時(オブジェクト破棄時)に勝手に切断開放をしてくれるので、もしかしたら、対応することにより、改善されるかも知れません。 参考程度にですが、ソースを張っておきます。 'サンプルクラス Public Class oleXls   Private m_Cnn As OleDb.OleDbConnection   Public Sub New(ByVal p_strBookPath As String)     Me.New(p_strBookPath, False)   End Sub   Public Sub New(ByVal p_strBookPath As String, ByVal p_blnHeader有無 As Boolean)     m_Cnn = ExcelConnection(p_strBookPath, p_blnHeader有無)     m_Cnn.Open()   End Sub   Public Function テーブル取得(ByVal p_strシート名 As String) As DataSet     Dim l_strSQL As String = String.Format("SELECT * FROM [{0}$]", p_strシート名)     Dim l_adp As New OleDb.OleDbDataAdapter(l_strSQL, m_Cnn)     Dim l_dst As New Data.DataSet()     l_adp.Fill(l_dst, p_strシート名)     Return l_dst   End Function   Private Function ExcelConnection(ByVal p_strBookPath As String, ByVal p_blnHeader有無 As Boolean) As OleDb.OleDbConnection     Dim MyConnection As System.Data.OleDb.OleDbConnection     Dim l_strConnection As String = String.Join(";", New String() { _         "Provider=Microsoft.Jet.OLEDB.4.0", _         String.Format("Data Source={0}", p_strBookPath), _         String.Format("Extended Properties=""Excel 5.0;HDR={0}""", IIf(p_blnHeader有無, "YES", "NO")) _     })     Return New Data.OleDb.OleDbConnection(l_strConnection)   End Function End Class 'クラスの利用方法サンプル Sub Main()   Dim l_oleXls As New oleXls("C:\test.xls", True)   Dim l_dst As DataSet   l_dst = l_oleXls.テーブル取得("Sheet1")   l_dst = l_oleXls.テーブル取得("Sheet2")   l_dst = l_oleXls.テーブル取得("Sheet1")   l_dst = l_oleXls.テーブル取得("Sheet2")   l_dst = l_oleXls.テーブル取得("Sheet1")   l_dst = l_oleXls.テーブル取得("Sheet2") End Sub

参考URL:
http://okwave.jp/kotaeru.php3?q=2192519
i-miyo
質問者

お礼

早速の回答ありがとうございます。 内容を確認させて頂き、カプセル化のサンプルを利用して実行したところ、正常に処理することができました。本当にありがとうございます。 ただ、先に質問のありました「MyConnection.Close」のコメントですが、実際に行っても同じくエラーは発生しました。また、コネクションの部分のみ、外部で行うように(サンプルはテーブルを取得するたびにコネクションとClose処理を行っていたのを、テーブル取得中は常にコネクションのまま)しても、変わりませんでした。 確かに、原因は良く分かりませんが、今後はクラスの活用をもっと考えていかなければいけないなとつくづく思わされました。本当に助かりました。

関連するQ&A

  • エクセルで検索し別シートに抽出したい。2007

    http://okwave.jp/qa/q6798171.html 昨日上記URLで質問させて頂き、無事問題は解決。しばらく思い悩んだ件も解決し喜び表を作成していたのですが、大事な事を質問していなかった事に気がつき再度質問させて頂ければと思います。 先のタイトル通りご教授頂いたおかげで、別シートへデータを抽出することができました。 ただ、Sheet1からSheet20まであり、(肝心の部分を書洩らしていました。)残りの19Sheetについては抽出できませんでした。(Sheetは1~20までが同じフォーマット、サイズのもの。別途5Sheetは全く違うもの) 何故かと思い、教えて頂いたVBAを見て調べたところ、標準モジュールへ記述したとき最前面に表示されているワークブックのWorkbookオブジェクトを参照します。との記述を発見し、色々と試してみましたが一度に複数シートを検索抽出する事はできませんでした。 下記で指定したシート名を変更することで、残りのシートも抽出する事は出来たのですが、毎回の作業となるとかなりの時間を要しますので出来れば、指定したシート名を一度に処理出来ればと思います。 Set wS = Worksheets("Sheet2")別シート名へ変更 Application.ScreenUpdating = False With Worksheets("Sheet1")別シート名へ変更 度々の質問で申し訳ありませんがよろしくお願いします。

  • VB2005ExpressEditionでのフォーム継承

    お世話になります。 VB2005ExpressEditionには継承ピッカーと呼ばれる機能が無い?ようですが、 フォーム継承(下記MSDNサイト)をする事は可能なのでしょうか? 可能ならばその方法を教えて下さい。 宜しくお願い致します。 ■チュートリアル : ビジュアル継承のデモンストレーション http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbcon/html/vbwlkwalkthroughdemonstratingvisualinheritance.asp

  • エクセル データ抽出・印刷

    下記のような表でデータ抽出・印刷はうまくいくのですが、B2に抽出された氏名をいれたいのですが、うまくいきませんどのようにしたらよろしいでしょうか   A    B  C 1  2    _  3 4  5  6 No  氏名 金額 7 100 Aさん 1000 8 100 Aさん 1000 9 102 Bさん 1000 10 103 Cさん 1000 11 102 Bさん 1000 12 104 Dさん 1000 ※データの抽出方法は下記のとおりです。 Sub ListPrint_Test() 'リストの最終行の行番号を格納する Dim lngLastRow As Long Dim objList As Object Dim objListData As Object Dim objTempSheet As Object '何回か同じ記述が必要になるので、Tempシートをオブジェクト変数に格納 Set objTempSheet = ThisWorkbook.Worksheets("Temp") '既に作成されている抽出用リストを削除する objTempSheet.Range("A6").CurrentRegion.ClearContents '抽出条件用のリストを作成する lngLastRow = ActiveSheet.Range("A6").End(xlDown).Row ActiveSheet.Range("A6:A" & lngLastRow).AdvancedFilter xlFilterCopy, , objTempSheet.Range("A6"), True 'できあがった抽出条件リストのセル範囲を格納する lngLastRow = objTempSheet.Range("A6").End(xlDown).Row Set objList = objTempSheet.Range("A7:A" & lngLastRow) 'オートフィルターを実行し、全項目分印刷を繰り返す For Each objListData In objList Range("A6").Select Selection.AutoFilter Field:=1, Criteria1:=objListData.Value MsgBox "抽出条件:" & objListData.Value & " データの印刷をしています" ActiveWindow.SelectedSheets.PrintOut Copies:=1 Next 'オートフィルターを解除する Selection.AutoFilter End Sub

  • 【エクセル】データ抽出する関数の使い方

    データを抽出するのに、今までVlookupなどを使っていました。 今回2つの項目(下記の表だと月と色)を指定して、抽出したいです。 Sheet1(元データ)   A  B  C   1 月  色 値段 2 01  赤 4532 3 02  赤 1495  4 01  白 10012 5 03  赤 7568 6 02  白 78964 7 01  緑 78932 8 02  緑 7894 9 上記のような表から、下記のような形にデータを抽出したいです。 Sheet2   A  B   C    D    E  1 色 1月値段 2月値段 3月値段 2 赤 4532  1495 7568 3 白 10012 78964 4 緑 78932 7894 5 … 6 … Sheet2の色の項目内(A列)の順番は決まっています。 色に対応する、月ごとの値段の出し方がわかりません。 Sheet1のデータは2000行弱くらいの量です。 月は3月までです。説明不足名ところがありましたら 追記いたします。 ※重要なのが元データのシートで作業列などを追加することが出来ませ  ん(色と月を結合した列を追加などが出来ません)。Sheet2のセル内  に関数を記入するだけで今回のようなことは可能 でしょうか。 すみませんがご指導よろしくお願いいます。

  • データの抽出について

    エクセルにてデータの抽出をしたいのですが、わからないので教えてください。 例えば、下の様なデータがあります。 回数   1回目   2回目   3回目   4回目 1000    あ      a      A      0 1001    い       b       B      1  1002    う       c       C      2 1003    え      d       D      3   1004    お      e       E      4  1005    か      f       F      5 別のシートに、 回数の1001と入力すると、3回目のBが抽出    1003と入力すると、3回目のDが抽出    1005と入力すると、3回目のFが抽出出来る様にしたいです わかりにくい文章ですいませんが、ご回答よろしくお願いします。 

  • Excel データの抽出について

    年始のお忙しいところ失礼いたします。 Excelにおけるデータ抽出についてお尋ねいたします。 抽出元データは左から1番目のシートのA列から順に、日付、部門名、商品名、数量0、記号、数量1、記号、数量2、記号、数量3、記号、残り数量となっています。 残り数量の列には、『=数量0-数量1-数量2-数量3』 という数式が記述してあります。 今回は、左から3番目のシートに、商品名、数量0、残り数量の3列の条件式を入力する場所と条件式に合致するデータを表示する場所を作成して、条件式に合致するデータを抽出することを検討しています。 条件式 商品名列:商品名の中から1つの商品を抽出 数量0:数量0=40、数量0<=10など数量0の値が入力した任意の数量と=またはは、以下(<=)を抽出 残り数量:残り数量<>0、残り数量<=20など残り数量の値が0以外か、入力した任意の数量以下を抽出 条件式を書き換える(抽出条件を変更する)ことが多いため、書き換える(条件を変更する)たびに、表示されるデータが更新されるようにしたいです

  • エクセルVBAでのデータ抽出についての質問です。

    エクセルVBAでのデータ抽出についての質問です。 下記のような2つのシートがあります。 (シート1) AA BB CC DD EE FF GG HH ←タイトル(複数固定) ああ いい うう ええ おお かか きき けけ ←値 ささ しし すす せせ そそ たた なな はは ←値 まま みみ むむ めめ もも らら りり るる ←値 (シート2) AA FF HH ・・・ ←タイトル(数は変更あり) シート1にタイトルの付いたデータが100列ほどありまして、 シート2に抽出したい列だけのタイトルを並べたとします。 このシート2のタイトルに入れたデータのみをシート1から列ごと 抽出してきたい場合、マクロで可能でしょうか。 本来はアクセスなどを使ってデータベースでクエリ抽出してくるものだと思いますが、 マクロでなんとかしたいと思っております。

  • ASPで抽出したデータをエディタで表示させる

    手順 1.AAA.aspでbbb.aspへのリンクをクリック 2.bbb.aspでデータ抽出のスクリプトが実行され、テキストエディタが起動し、抽出したデータが表示される という処理を実現させたいのですが、どのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセルでデータ抽出後の元データを自動削除する方法

    エクセルで下記のような抽出方法を質問したのですが、 http://okwave.jp/qa/q6856275.html さらに、(2)のようなことが可能でしょうか。 (1)sheet1のA1からA100に入力された文字をsheet2のA1に抽出したい文字をいれると、    sheet2のA2以下に抽出したい文字を含んだ行を抽出。(解決済み) (2)上記、抽出時に抽出された元データを自動的に削除したい。 宜しくお願いします。

  • データ抽出

    VBA初心者です。 エクセルで2枚のシートを練習用で作成しました。 画像上段がシート1で元データです。 下段が転記先の表で、シート2です。 シート2は、今はデータが参考に貼りつけてありますが 普段はマクロで作業後は消去して、空白にしています。 今したい処理が 元データをINPUTBOX関数を使って抽出し、 NO,購入日付、分類、感想、備考のデータを下段画像シート2のように 転記したいのです。 抽出条件のキーになるのは、主に「購入日付」と「分類」です。 どこかのセルに、日付を範囲指定で入力すれば、条件に当てはまる データをシート2に表示させたいです。 四半期ごとのデータを検索したいためです。 INPUTBOX関数でなくても、どこかの特定のセルに範囲指定する日付を入力 して、抽出してもかまわないです。 あと、分類は割と「飲料水」を抽出して、印刷する頻度が多いのですが 今後の参考に、全部の分類を抽出できるスタイルが望ましいです。 現在は、一行一行日付と分類を目視で確認しながら シート2にコピペ作業しているので 時間がかかります。 エクセルの機能でフィルタ等をしてみたのですが、 関数やVBAで素早くしたいのですが、なかなかコードが思いつきません。 お願いします。