C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 共通クラスでExcelの読み込み


(過去ログ 134 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■79195 / inTopicNo.1)  共通クラスでExcelの読み込み
  
□投稿者/ Kyan (1回)-(2016/03/15(Tue) 04:15:29)

分類:[VB.NET/VB2005 以降] 

Option Strict On を用いて共通クラスでExcelの読み込みをしたいのですが

Option Strict On
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

Public Class クラス名
    :
    :
Public Function ReadExcelSheet() As Boolean

Dim App As Excel.Application
Dim Book As Excel.Workbook
Dim Sheet As Excel.Worksheet
Dim intX As Integer = 0
Dim intY As Integer = 0
Dim blnFlg As Boolean = False

Try

App = New Excel.Application()
Book = App.Workbooks.Open(パス)        
Sheet = Book.Worksheets(1) <----エラーが出る

intY = Sheet.Cells(10, 1).End(Excel.XlDirection.xlUp).Row <----エラーが出る
intX = Sheet.Cells(1, 7).End(Excel.XlDirection.xlToLeft).Column <----エラーが出る

arrData = Sheet.Range(Sheet.Cells(1, 1), Sheet.Cells(intY, intX)).Value <----エラーが出る

App.Quit() '終了
blnFlg = True

Catch ex As Exception
MsgBox("Excel読み込みに失敗しました" & ex.Message)
Finally
' オブジェクトを解放します。
Sheet = Nothing
Book = Nothing
App = Nothing
End Try

Return blnFlg

End Function




上記の4か所でエラーが出ます
Option Strict On を外すとエラーは消えるのですが
Option Strict Onを外さずエラーを消す方法を教えてください

参照設定には、
Microsoft.Office.core
Microsoft.Office.Interop.Excel があります

OfficeとExcelのオブジェクトライブラリーはそれぞれ15が設定されいます


以上、よろしくお願いします







引用返信 編集キー/
■79208 / inTopicNo.2)  Re[1]: 共通クラスでExcelの読み込み
□投稿者/ Kyan (2回)-(2016/03/16(Wed) 07:33:29)
Option Strict On を用いて共通クラスでExcelの読み込みをしたいのですが
上記の方法ではエラーが出ます

Option Strict On を使用してエラーが出ないExcelを読み込む方法を
ご存知の方よろしくお願いします




引用返信 編集キー/
■79209 / inTopicNo.3)  Re[2]: 共通クラスでExcelの読み込み
□投稿者/ shu (838回)-(2016/03/16(Wed) 08:05:57)
No79208 (Kyan さん) に返信
> Option Strict On を用いて共通クラスでExcelの読み込みをしたいのですが
> 上記の方法ではエラーが出ます
>
> Option Strict On を使用してエラーが出ないExcelを読み込む方法を
> ご存知の方よろしくお願いします
>
エラーが発生している箇所で取得しているものはObject型として返ってくるので
キャストする必要があります。

Excelなどのオブジェクトを使用する場合Marshal.ReleaseComObjectで各オブジェクトを
最後に解放しなければなりません。なので

Sheet = Book.Worksheets(1) とか
intY = Sheet.Cells(10, 1).End(Excel.XlDirection.xlUp).Row

と書かず

Sheets = Book.Worksheets
Sheet = Sheets(1)

cell1 = Sheet.Cells(10,1)
cell2 = cell1.End(Excel.XlDirection.xlUp)
intY = cell2.Row
※キャストは別途行って下さい。

のように1つづつオブジェクト参照を保存するようにして
後ですべて解放出来るようにしておいた方がよいです。


引用返信 編集キー/
■79212 / inTopicNo.4)  Re[3]: 共通クラスでExcelの読み込み
□投稿者/ 魔界の仮面弁士 (669回)-(2016/03/16(Wed) 14:05:42)
No79209 (shu さん) に返信
> エラーが発生している箇所で取得しているものはObject型として返ってくるので
> キャストする必要があります。
具体的には、
 oSheet = DirectCast(oSheets(1), Excel.Worksheet)
といった構文ですね。


> intY = Sheet.Cells(10, 1).End(Excel.XlDirection.xlUp).Row
この場合は、こうなりますね。

 'Cells プロパティは「引数のないプロパティ」で、戻り値は Range 型です。
 oCells = oSheet.Cells

 'Range オブジェクトの「既定のプロパティ」は、2つの省略可能な引数をとりますが、
 '戻り値はバリアント(As Object 相当)なので、キャストが必要です。
 oCell1 = DirectCast(oCells(10, 1), Excel.Range)

 'これでようやく、End プロパティにアクセスできます。
 'End プロパティの戻り値は Range 型です。
 oCell2 = oCell1.End(Excel.XlDirection.xlDown)

 '最後に、Row プロパティにアクセス。
 'Row プロパティの戻り値は Int32 型です。
 intY = oCell2.Row


後は、oCell2 、oCell1 、oCells そして oSheet などを
System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドで
解放してあげてください。
引用返信 編集キー/
■79240 / inTopicNo.5)  Re[4]: 共通クラスでExcelの読み込み
□投稿者/ Kyan (3回)-(2016/03/18(Fri) 04:05:22)
自力で下記の所まで実装しましたが、実行すると←の箇所でおちます。


Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Interop

    Dim App As Excel.Application
Dim Books As Excel.Workbooks = Nothing
Dim Book As Excel.Workbook = Nothing
Dim Sheets As Excel.Sheets = Nothing
Dim Sheet As Excel.Worksheet = Nothing
Dim intX As Integer = 0
Dim blnFlg As Boolean = False

    App = New Excel.Application()
Book = App.Workbooks.Open(strPath) 'ファイルを開く
Sheet = DirectCast(Sheets.Item(1), Excel.Worksheet)    <----おちる

Dim cells = Sheet.Cells
Dim tl = DirectCast(cells(Sheet.Rows.Count, 1), Excel.Range)
Dim br = tl.End(Excel.XlDirection.xlDown)
intY = br.Row
intX = tl.Column
 Dim range = Sheet.Range(tl, br) ' 範囲取得
arrData = DirectCast(range.Value, Object(,))


型がおかしいのでしょうか?
それとも、根本的に間違っているのでしょうか?


よろしくお願いします

引用返信 編集キー/
■79241 / inTopicNo.6)  Re[5]: 共通クラスでExcelの読み込み
□投稿者/ shu (844回)-(2016/03/18(Fri) 07:22:02)
No79240 (Kyan さん) に返信
> 自力で下記の所まで実装しましたが、実行すると←の箇所でおちます。
>
おちるではなくエラーの内容を書くようにされた方がよいです。


> Sheet = DirectCast(Sheets.Item(1), Excel.Worksheet)    <----おちる
>
SheetsがNothingのまま何も設定されていないからかと思います。
Sheets = Book.Worksheets
をこれより前で実行する必要があります。
引用返信 編集キー/
■79324 / inTopicNo.7)  Re[6]: 共通クラスでExcelの読み込み
□投稿者/ Kyan (4回)-(2016/03/21(Mon) 20:16:38)
shuさん、魔界の仮面弁士さん、ありがとうございます。
無事解決しました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -