• ベストアンサー

VB.NETの配列にExcelから読み込んできたデータを格納したい

今回もお世話になります。 VisualBasic.NETでプログラムを作っています。 Excelからデータを読み込んで配列に格納したいのですが、どうしてもうまくいきません。 原因とその解決法を教えていただけないでしょうか? また、他の解決法や参考にできるサイトがあれば教えていただきたいです。 Excel,VB.NETともに2003を使っています。 以下エラー内容 -------------------- 'System.NullReferenceException' のハンドルされていない例外が 重度障害者用入力装置自動選択システム.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 -------------------- 以下ソースです -------------------- Option Explicit On Imports Microsoft.Office.Interop Public Class Form2 Inherits System.Windows.Forms.Form Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim xl As Object 'Excel.Application Dim wb As Object 'Excel.Workbook Dim ws As Object 'Excel.Worksheet xl = CreateObject("Excel.Application")  wb = xl.Workbooks.Open("C:\abc.xls") xl.Visible = True ws = wb.Worksheets("Sheet1") 配列(1, 1, 1) = xl.Cells(2, 1).Value ←ここでエラーが出る 配列(1, 1, 2) = xl.Cells(2, 2).Value 配列(1, 1, 3) = xl.Cells(2, 3).Value 状態表示テキストボックス.Text = "配列(1, 1, 1) = " & 配列(1, 1, 1) & "と" _ & "配列(1, 1, 2) = " & 配列(1, 1, 2) & "と" _ & "配列(1, 1, 3) = " & 配列(1, 1, 3) xl = Nothing wb = Nothing ws = Nothing End Sub End Class -------------------- 回答よろしくお願いします。

noname#70167
noname#70167

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.5

こんにちは ********引用******* の部分で「型excel.Applicationが定義されていません」というエラーが出てしまいます。 ******************* 私の場合、参照設定が、上手くいっていないと このエラーが出るみたいです。 プロジェクトのプロパティを見て、 参照設定を見て、エクセルのオブジェクトライブラリーが追加されているか?? 確認してみてください。

noname#70167
質問者

お礼

ありがとうございます! 結局csvを読み込んで配列に格納する方法をとることになりました。 この方法でも少し無理はあるのですが… お礼が遅くなってしまい、もうしわけありませんでした。 また回答よろしくお願いいたします!

その他の回答 (5)

  • Kuppycat
  • ベストアンサー率50% (109/216)
回答No.6

Private xlApp As Excel.Application ↓ Private xlApp As Excel.ApplicationClass に変えてみてください。 COMを追加した際、参照設定に追加されるライブラリは ・Excel ・Microsoft.Office.Core ・stdole ・VBIDE のようです。

noname#70167
質問者

お礼

ありがとうございます! 結局csvを読み込んで配列に格納する方法をとることになりました。 この方法でも少し無理はあるのですが… お礼が遅くなってしまい、もうしわけありませんでした。 また回答よろしくお願いいたします!

noname#70167
質問者

補足

Private xlApp As Excel.Application ↓ Private xlApp As Excel.ApplicationClass に変えてみてもエラー内容が「型Excel.ApplicationClassが定義されていません」に変わるだけでした。 参照設定に ・Excel ・Microsoft.Office.Core ・stdole ・VBIDE が追加されているので参照はうまくいっているように思えるのですが… 現在はcsvに変換してから処理する方法を考慮中です。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.4

こんにちは エクセルのデータをA1:A10に以下のように設定して aa bb cccc ddd eee fff gggg hhhhhhh ii jjjjjjjj 以下の様なコードを実行すると Public Class Form1 Private xlApp As excel.Application Private xlBook As excel.Workbook Private xlSheet1 As excel.Worksheet Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer = 0 xlApp = CreateObject("Excel.Application") xlBook = xlApp.Workbooks.Open("C:\test1.xls") xlSheet1 = xlBook.Worksheets("Sheet1") For i = 1 To 11 Debug.WriteLine(i.ToString & xlSheet1.Cells(i, 1).Value) Next End Sub End Class 実行結果 1aa 2bb 3cccc 4ddd 5eee 6fff 7gggg 8hhhhhhh 9ii 10jjjjjjjj 11 になりました。 参考まで

noname#70167
質問者

補足

private xlApp As excel.Application の部分で「型excel.Applicationが定義されていません」というエラーが出てしまいます。 モジュールの一番上に Option Explicit On Imports Microsoft.Office.Interop を追加し、 ↓を参考にして「Microsoft Excel 11.0 ObjectLibrary」を参照に追加したのですが、どうもうまくいってないようです… http://support.microsoft.com/default.aspx?scid=kb;ja;301982

回答No.3

>'System.NullReferenceException' のハンドルされていない例外が > 重度障害者用入力装置自動選択システム.exe で発生しました。 このエラーがでるということは、 ・[C:\abc.xls]Sheet1!A2が空になっている。 ・配列が宣言されていない。 のいずれかだと思います。 配列のデータ型をObject型にしてNullも代入可能にしたらどうでしょうか?

noname#70167
質問者

お礼

ありがとうございます! 結局csvを読み込んで配列に格納する方法をとることになりました。 この方法でも少し無理はあるのですが… お礼が遅くなってしまい、もうしわけありませんでした。 また回答よろしくお願いいたします!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

私も、 ws.Cells(2,1).value だと思います。 >オブジェクト参照がオブジェクト インスタンスに設定されていません。 ws がちゃんと設定されているか調べてみたらどうでしょう? 例えばws.Name が"Sheet1"になっていますか?

noname#70167
質問者

お礼

ありがとうございます! 結局csvを読み込んで配列に格納する方法をとることになりました。 この方法でも少し無理はあるのですが… お礼が遅くなってしまい、もうしわけありませんでした。 また回答よろしくお願いいたします!

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、 >配列(1, 1, 1) = xl.Cells(2, 1).Value ←ここでエラーが出る xlだと、どのシートのデータか解らないので、 ws.Cells(2,1).Valueになるような気がします。

noname#70167
質問者

補足

回答ありがとうございます。 xlをwsにした場合、以下のようなエラーが出てしまいます。 'System.NullReferenceException' のハンドルされていない例外が 重度障害者用入力装置自動選択システム.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 xl.wb.ws.Cells(2, 1).Valueにした場合と xl.wb.Cells(2, 1).Valueにした場合は 'System.MissingMemberException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。 追加情報 : 型 'ApplicationClass' でパブリック メンバ 'wb' が見つかりません。 というエラーが出て、 xl.ws.Cells(2, 1).Valueにした場合は 'System.MissingMemberException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。 追加情報 : 型 'ApplicationClass' でパブリック メンバ 'ws' が見つかりません。 というエラーが出てしまいます… 解決法はないでしょうか…?

関連するQ&A

  • Excelにおけるセルの値をVB2005に配列として取り込みたい

    Excelのセルの値をVB2005に配列として取り込みたいのですが、Excel.Rangeと配列の整合性が取れず困っています。 なんらかヒントになるような助言をお願いします。 以下は今までに作成中のコードです。 Public Class Form1 Dim xlsapp As New Excel.Application Dim xlsbook As Excel.Workbook Dim xlssheet As Excel.Worksheet Dim fn As String = "sample.xls" Dim Q(,,) As Double Dim i, j, x, y, z As Integer Dim k As Double Dim w(i), v(i), u(i) As Double Dim As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xlsbook = xlsapp.Workbooks.Open(fn) xlssheet = xlsbook.Worksheets(1) k = 1 w(i) = xlssheet.Cells(1, 3) v(i) = xlssheet.Cells(1, 2) u(i) = xlssheet.Cells(1, 1) For x = 2 To 11 If w(i) = 1 Then For y = 2 To 11 If v(i) = 1 Then Q(1, 1, k) = u(i) k = k + 1 End If Next End If Next z = k For k = 1 To z TextBox1.Text = Q(1, 1, k) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() xlsapp.DisplayAlerts = False xlssheet = Nothing xlsbook.Close() xlsbook = Nothing xlsapp.Quit() xlsapp = Nothing End Sub End Class

  • エクセルとVB6

    環境は OS XP Visual Basic 6 Excel 2003 です。 エクセルを扱うについては、今回初めてです。 ソースです----------------------------------- Dim ex As Object ' Excel.Application Dim wb As Object ' Excel.Workbook Dim ws As Object ' Excel.Worksheet Set ex = CreateObject("Excel.Application") ex.Visible = True 'エクセルを表示する Set wb = ex.Workbooks.Add '空白の新しいブックを追加 Set ws = wb.Worksheets.Add '新しいシートを追加 ws.Name = "XXX " 'シートの名前を設定 'シートのセルに書き込む '構文:Cells(行, 列).Value = 値 ws.Cells(1, 1).Value = "ID" ws.Cells(1, 2).Value = "PS" III% = 2 For x% = 0 To 135 III% = III% + 1 ws.Cells(1, III%).Value = 問D$(x%, 0) Next x% ----------------------------------- エクセルが起動し、挿入されます。 質問1 シート XXXはsheet3としてに挿入され、それ以外にsheet1 sheet2もできています。 これはなぜですか。 質問2 sheet1 sheet2を生成しないようにできますか。 できないようにするには、どうすればいいですか。 全くエクセルは詳しくありません。 お詳しい方、よろしくお願いします。

  • visual basic 2005 express edition でエクセル操作ってできます?

    もともとエクセルマクロを使用して 業務ツールを作っていたのですが、 visual basic2005になって無料版がでたのでそちらに移行しようかと考えている者です。 ひとつ確認させてください。 VB2005expressでエクセルのセル値を変更するコードを書いたのですが、 "range"や"cell"の頭部分が大文字になりません。 自動表示(?プルダウンで表示される機能)にも、"range""cell"等の出力はされないのですが、 なぜか、小文字のままでも動作はします。 express editionでは、オフィスの操作は正式対応していないのでしょうか? Dim xl As Object 'Excel.Application Dim wb As Object 'Excel.Workbook Dim ws As Object 'Excel.Worksheet xl = CreateObject("Excel.Application") wb = xl.Workbooks.Open(ファイル名) xl.Visible = True ws = wb.Worksheets("Sheet1") ' シート内のセルに文字を書き込む ws.cells(1, 1).Value = "hogehoge" ws.range("A1").offset(1, 2).value = "gogo"

  • vb2008で操作中のエクセルが解放されてない?

     質問させていただきます.どうぞよろしくお願いします.  vb2008で,エクセル操作をするアプリケーションの作成を試みております. コードの流れとしましては,  エクセル操作   ↓  オブジェクト・アプリケーション解放   (自分的にはここでタスクマネージャからExcel.exeが              消えると思うのですが,残ります)   ↓  メッセージボックス「終了」   ↓  アプリケーションを右上の×マークで閉じる   (タスクマネージャからExcel.exeが消えます) となります.  色々なページを参考にさせていただいて,Excelが解放されるように したつもりなのですが,VBアプリケーション終了ギリギリまで 存在し続けるという事は,うまく解放できていないということなのでしょうか?  作成したコードは以下のようになります. (バグ取り中に,エクセル操作部分のコードはほとんど消去してみました. しかしまだ上記のような現象になっております) Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click Dim N_e As Integer Call Excel一括置換(N_e) MsgBox("終了" ) End Sub Private Sub Excel操作(ByRef N As Integer) Dim xlApp As New Excel.Application Dim xlBooks As Object Dim WB As Object Dim Rng As Object '================== 終了処理 ===================== Rng = Nothing : MRComObject(Rng) WB = Nothing : MRComObject(WB) xlBooks = Nothing : MRComObject(xlBooks) xlApp.Quit() : xlApp = Nothing : MRComObject(xlApp) End Sub Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) Debug.WriteLine(count) End If End If Finally objCom = Nothing End Try End Sub  何か些細なことでもご指摘いただければ非常に助かります. どうぞよろしくお願いたします.

  • datagridviewからエクセルへ出力する際のエラーについて

    datagridviewからエクセルへ出力する際のエラーについて いつもお世話になります。 datagridviewに表示されたデータをエクセルへ出力したく以下のコードを書きました。 Imports System.IO Imports System.Data Imports System.Data.SqlClient Imports Microsoft.Office.Interop Public Class form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2008\コピー ~ 社会保険計算.mdb;") End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click Dim xlapp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet 'Excelを開く xlapp = CreateObject("Excel.Application") xlapp.Visible = True xlapp.Workbooks.Add() xlBook = xlapp.ActiveWorkbook xlSheet = xlBook.ActiveSheet 'シートの編集 ☆ xlSheet.Cells(1, 1).Value = DataGridView1(1, 1).Value.ToString  xlSheet.Cells(2, 1).Value = DataGridView1(2, 1).Value.ToString xlBook.Close() xlapp.Quit() xlBook = Nothing xlapp = Nothing End Sub ☆マークで止まってしまいます。 argumentoutofrangeexceptionがハンドルされませんでした。 インデックスが範囲を超えています。負でない値でコレクションのサイズよりも小さくなければなりません。 パラメータ名:index と表示されます。 環境は、VB.NET2008     XP(SP3)     Excel2007 になります。 上記のエラーで止まり、エクセルも立ち上がりぱなしです。 お忙しい所お手数をお掛けしますが、ご教授下さい。

  • Excel.Rangeで取得した値を配列に格納するには?

    プログラミング初心者です。 VB.NET でExcelからデータを取得したのですが、配列等に格納したいのですが、うまくできなくて困っています。どなたか教えてください。 例)以下のデータを取得する場合 セルA(列)1(行)からA5まで セルB1からB5まで セルC1からC5まで Dim xl_APP As Excel.Application Dim xl_Book AS Excel.Workbook Dim xl_Sheet As Excel.Seets = xl_Book.Worksheets Dim xl_W_Sheet As Excel.Worksheet = CType(xl_W_Sheet.Item(1),Excel.Worksheet) 中略 Dim range_data As Excel.Range Dim i Integer Dim j Integer Dim strCel As String For i = 1 To 5 For j = 1 To 3 range_data = CType(xl_W_Sheet.Cells(i,j),Excel.Range) strCel = CStr(range_data.Value)  ↑String型変数に格納していますが、多次元配列?に格納して取り出せるようにしたいのですが、どうしたらよいのでしょうか? Next Nest <range_dataに格納されるデータ> A1:氏名 B1:学年 C:1 年齢 以下同上 ・・・・のように取り出したいと考えています。 よろしくお願いします。

  • 配列にすると変数が入らない

    お世話になっています MS Excel2003のVBAで質問です find関数の結果を オブジェクト型変数だと入るのに、オブジェクト型配列だと入らない、 そういう仕様なんでしょうか? 成功 Dim result As Object Set result = wb2.Worksheets(1).Range(Cells(2, num), Cells(500, num)).Find(key) 実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです Dim result(10) As Object '検索結果 Set result(0) = wb.Worksheets(1).Range(Cells(i, num), Cells(500, num)).Find(key)

  • VB2008とExcel2003連携

    VB2008とExcel2003連携 VBでExcelの操作を、VBのボタン操作でOPEN処理、CEL操作、CLOSE処理をそれぞれ単独に処理したいのですが方法がわかりません。以下の記述では、OPEN処理後、CEL操作のため再度呼び出すと、前回呼び出したOPEN処理の内容が残っていません。VBAはある程度理解していますが、VBのCLASS等の概念が良く理解できていません。できれば、OPEN処理、CELの処理、CLOSE処理を別々のSUBにしたいので、その方法を優先して教えていただければ幸いです。 宜しくお願いします。 Public Class Form1 Public Sub xlsAccess(ByVal xlPrc As String) Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim strFilename As String = "C:\TEST\SAMPLE.xls" 'ファイル名(フルパス)をセット Dim strSheetName As String = "Sheet1" 'シート名/シート名をセット ‘【EXCELファイルを開く】 If xlPrc = "OPEN" Then xlApp = CreateObject("Excel.Application") 'Application生成 xlApp.Workbooks.Open(Filename:=strFilename, UpdateLinks:=0) 'EXCELを開く xlApp.Visible = True 'EXCELの表示 xlBook = xlApp.Workbooks(Dir(strFilename)) 'Workbook xlSheet = xlBook.Worksheets(strSheetName) 'Worksheet xlSheet.Cells(1, 1).Value = "HELLO" End If '【EXCEL セル操作】 If xlPrc = "R/W" Then For k = 2 To 10 Step 1 xlSheet.Cells(k, 2).Value = xlSheet.Cells(1, 1).Value Next k End If ‘【EXCELファイル終了処理】 If xlPrc = "CLOSE" Then xlBook.Close(SaveChanges:=True) 'ブックを保存して終了 xlApp.Quit() 'EXCELを閉じる xlSheet = Nothing 'オブジェクトの解放 xlBook = Nothing 'オブジェクトの解放 xlApp = Nothing 'オブジェクトの解放 End If End Sub ‘【ボタン操作OPEN】 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xlsAccess("OPEN") MsgBox("Open Excuted") End Sub ‘【ボタン操作、CEL操作】 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click xlsAccess("R/W") MsgBox("R/W Excuted") End Sub ‘【ボタン操作、CLOSE】 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click xlsAccess("CLOSE") MsgBox("CLOSE Excuted") End Sub End Class

  • VB.NETからEXCELの起動が、うまくいかない

    3回目の同じ質問になってしまうのですがよろしくお願いいたします。 下記のようなソースでEXCELファイルを作成し、その後ファイルを開くという処理をしています。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlRange As Excel.Range Dim xlCells As Excel.Range = xlSheet.Cells xlRange = xlCells(1, 10) xlRange.Value = "--" xlRange = xlCells(1, 5) xlCells.EntireColumn.AutoFit() xlBook.SaveAs(sPath & "\" & sFileName, Excel.XlFileFormat.xlWorkbookNormal) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlCells) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets) xlCells = Nothing xlRange = Nothing xlSheet = Nothing xlSheets = Nothing xlBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks) xlBook = Nothing xlBooks = Nothing xlApp.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) xlApp = Nothing GC.Collect() System.Diagnostics.Process.Start(sPath & "\" & sFileName) ある特定のPCでのみEXCELのメニューバーとステータスバーのみしか表示されない状態です。 起動部分(Process.Start)をコメントアウトして確認したところ GC.COLLECTでEXCELが終了することなく、アプリの終了時にEXCELが終了する 状態にあります。 これはオブジェクトの開放がうまくいっていないのでしょうか? よろしくお願いいたします。

  • 【VB】タスクマネージャでEXECELが残る件

    VisualBasic2008で、ボタンを押すとTest.xlsを開いて閉じるという簡単なプログラムを作成しています。 ワークブックのCloseとアプリケーションのQuitをしているのも関わらず ボタンを押す度に、タスクマネージャに『EXCEL.EXE』が増え、消えない状態です。 フォームを閉じると『EXCEL.EXE』は消えるのですが、 フォームを閉じない状態で、『EXCEL.EXE』を消すことはできないのでしょうか? 以下、コードです。 ----------------------------------------------- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim AAA As Excel.Application Dim BBB As Excel.Workbook Dim CCC As Excel.Worksheet AAA = CreateObject("Excel.Application") BBB = XL.Workbooks.Open("C:\Work\Test") CCC = XM.Worksheets(1) CCC = Nothing BBB.Close(SaveChanges:=False) BBB = Nothing AAA.Quit() AAA = Nothing End Sub ----------------------------------------------- 終了処理のコードが間違っていましたらご指摘ください。 わかる方いらっしゃいましたら、是非お願い致します。