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

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

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

Re[15]: DataGridからエクセル出力でエラー


(過去ログ 72 を表示中)

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

■42422 / inTopicNo.1)  DataGridからエクセル出力でエラー
  
□投稿者/ ダメッス (1回)-(2009/10/15(Thu) 15:36:48)

分類:[.NET 全般] 

開発環境:WinXP SP3
開発言語:VB2003

クライアント:Win2000 SP4

DataGridのデータをエクセルに出力したいのですが、開発環境(WinXP)では問題なく
処理できるのですが、クライアント(Win2K)ではエラー「HRESULT からの例外です : 0x800A03EC」
が発生します。
いろんなサイトを探していじってみましたが、いまだ解決しません。。。

皆さんのお助けお願いします。
↓↓↓ソース

        Dim objExcel As Object
        Dim objExcelBooks As Object
        Dim objExcelBook As Object
        Dim objExcelSheets As Object
        Dim objExcelSheet As Object
        Dim intRowCnt, intColCnt As Integer
        Dim Range As Object
        Dim i, j As Integer

        objExcel = CreateObject("Excel.Application")
        objExcelBooks = objExcel.workbooks
        objExcelBook = objExcelBooks.add
        objExcelSheets = objExcelBook.worksheets
        objExcelSheet = objExcelSheets.item(1)

            Me.dgdWillDelay.Select()
            Dim dt As DataTable = CType(dgdWillDelay.DataSource, DataTable)
            Dim dtRow As DataRow
            Dim dtColumn As DataColumn
            'DataArray定義
            Dim DtArCol, DtArRow As Double
            DtArCol = 0
            For Each dtColumn In dt.Columns
                DtArCol = DtArCol + 1
            Next
            DtArRow = 0
            For Each dtRow In dt.Rows
                For i = 0 To dt.Columns.Count - 1
                    DtArRow = DtArRow + 1
                Next
            Next
            Dim DataArray(DtArRow, DtArCol) As Object

            '列名を格納
            j = 0
            For Each dtColumn In dt.Columns
                DataArray(0, j) = dtColumn.ColumnName
                j = j + 1
            Next

            '明細を格納
            j = 0
            For Each dtRow In dt.Rows
                j = j + 1
                For i = 0 To dt.Columns.Count - 1
                    DataArray(j, i) = dtRow(i)
                Next
            Next
            'タイトル
            objExcelSheet.range("A1") = Me.lblTitle.Text
            objExcelSheet.range("C1") = Me.cboClass.Text
            objExcelSheet.range("E1") = "出荷日:" & Me.DateTimePicker1.Text

            'DataArrayをExcelSheetに貼り付け
            Range = objExcelSheet.range("A2", Reflection.Missing.Value)
            Range = Range.resize(DtArRow, DtArCol)
            Range.value = DataArray

            'Excelを可視状態にする
            objExcel.Application.Visible = True
            objExcel.UserControl = True

引用返信 編集キー/
■42424 / inTopicNo.2)  Re[1]: DataGridからエクセル出力でエラー
□投稿者/ ごう (61回)-(2009/10/15(Thu) 16:36:20)
クライアントと、開発環境とそれぞれで使っているExcelのバージョンは何ですか?
引用返信 編集キー/
■42425 / inTopicNo.3)  Re[2]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (2回)-(2009/10/15(Thu) 16:51:11)
No42424 (ごう さん) に返信
> クライアントと、開発環境とそれぞれで使っているExcelのバージョンは何ですか?

開発環境:EXCEL2003
クライアントは、EXCEL2002です。

補足ですが、
OS WinXP 、EXCEL2002なら問題なし。
OS WinXP 、EXCEL2000なら問題なし。
OS Win2k 、EXCEL2002だとエラーです。

宜しくお願いします。
引用返信 編集キー/
■42429 / inTopicNo.4)  Re[3]: DataGridからエクセル出力でエラー
□投稿者/ ごう (62回)-(2009/10/15(Thu) 17:14:28)
問題を切り分けて考えていきましょう。

エラー「HRESULT からの例外です : 0x800A03EC」が
「タイトル」の書き込みでおきているか、
「DataArrayをExcelSheetに貼り付け」のところで起きているか、判別できますか?

もし、後者の場合
DtArRowとDtArColのサイズが気になりますが、それぞれ最大どれぐらいの大きさになりそうですか?

また、このプログラムを連続で動作させていたりすることはありませんか?
(Excelオブジェクトを開放している部分がこのソースにはなかったため、Excelプロセスが残っているのは問題だと思ったので、念のため)
引用返信 編集キー/
■42430 / inTopicNo.5)  Re[4]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (4回)-(2009/10/15(Thu) 17:35:50)
No42429 (ごう さん) に返信
> 問題を切り分けて考えていきましょう。
>
> エラー「HRESULT からの例外です : 0x800A03EC」が
> 「タイトル」の書き込みでおきているか、
> 「DataArrayをExcelSheetに貼り付け」のところで起きているか、判別できますか?
>
> もし、後者の場合
> DtArRowとDtArColのサイズが気になりますが、それぞれ最大どれぐらいの大きさになりそうですか?
>
> また、このプログラムを連続で動作させていたりすることはありませんか?
> (Excelオブジェクトを開放している部分がこのソースにはなかったため、Excelプロセスが残っているのは問題だと思ったので、念のため)

・エラーの発生箇所は、DataArrayをExcelSheetに貼り付けるところで発生しております。

・DtArRowとDtArColのサイズですが、
DtArRow:大体500〜600
DtArCol:12

・Excelオブジェクトですが、プロジェクト終了時に開放しております。
※エラー発生時には、タスクマネージャより手で終了させておりました。。。^^;
引用返信 編集キー/
■42431 / inTopicNo.6)  Re[5]: DataGridからエクセル出力でエラー
□投稿者/ ごう (63回)-(2009/10/15(Thu) 17:47:17)
2009/10/15(Thu) 17:47:38 編集(投稿者)
> 'DataArray定義
> Dim DtArCol, DtArRow As Double
> DtArCol = 0
> For Each dtColumn In dt.Columns
>     DtArCol = DtArCol + 1
> Next
> DtArRow = 0
> For Each dtRow In dt.Rows
>     For i = 0 To dt.Columns.Count - 1
>         DtArRow = DtArRow + 1
>     Next
> Next

このループが気になりますね。
仮にですが、500行12列のデータとして考えます。

DtArCol(列数)は12って求められるけど、
DtArRow(行数)は二重ループになってるから、12×500=6000になりますよね。
1行目に列名を入れる行が必要だとしても、500+1=501行でいいのでは?
(配列が12列分用意されていて、その配列一つ一つにデータを区切って代入しているわけですから)

というわけで、Rangeを確保しているこの処理
>Range = Range.resize(DtArRow, DtArCol)
Range = Range.resize(6000, 12) になってしまってます。

DataArrayは501行分, 12列分のデータしか入力してないから、
「宣言はしたけど、値がない」DataArrayが存在するのがもしかして原因の一つかもしれません。


>Excelオブジェクト
了解です!

引用返信 編集キー/
■42433 / inTopicNo.7)  Re[6]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (6回)-(2009/10/15(Thu) 17:56:05)
No42431 (ごう さん) に返信
> 2009/10/15(Thu) 17:47:38 編集(投稿者)
>
> > 'DataArray定義
>>Dim DtArCol, DtArRow As Double
>>DtArCol = 0
>>For Each dtColumn In dt.Columns
>> DtArCol = DtArCol + 1
>>Next
>>DtArRow = 0
>>For Each dtRow In dt.Rows
>> For i = 0 To dt.Columns.Count - 1
>> DtArRow = DtArRow + 1
>> Next
>>Next
>
> このループが気になりますね。
> 仮にですが、500行12列のデータとして考えます。
>
> DtArCol(列数)は12って求められるけど、
> DtArRow(行数)は二重ループになってるから、12×500=6000になりますよね。
> 1行目に列名を入れる行が必要だとしても、500+1=501行でいいのでは?
> (配列が12列分用意されていて、その配列一つ一つにデータを区切って代入しているわけですから)
>
> というわけで、Rangeを確保しているこの処理
> >Range = Range.resize(DtArRow, DtArCol)
> Range = Range.resize(6000, 12) になってしまってます。
>
> DataArrayは501行分, 12列分のデータしか入力してないから、
> 「宣言はしたけど、値がない」DataArrayが存在するのがもしかして原因の一つかもしれません。
>
>
> >Excelオブジェクト
> 了解です!
>

すいません、説明不足でした。
500〜600と書いたのは、12×40行〜50行の値です。。。

何かヒントでもあればいいのですが・・・
引用返信 編集キー/
■42434 / inTopicNo.8)  Re[7]: DataGridからエクセル出力でエラー
□投稿者/ ごう (64回)-(2009/10/15(Thu) 18:03:44)
> すいません、説明不足でした。
> 500〜600と書いたのは、12×40行〜50行の値です。。。


それでも、
DtArCol(列数)は12
DtArRow(行数)は12×50=600ですよね。

実際に代入する値は12列51行分で、600行も要らないよね。
確認してみた?
引用返信 編集キー/
■42436 / inTopicNo.9)  Re[8]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (8回)-(2009/10/15(Thu) 18:15:32)
No42434 (ごう さん) に返信
>>すいません、説明不足でした。
>>500〜600と書いたのは、12×40行〜50行の値です。。。
>
>
> それでも、
> DtArCol(列数)は12
> DtArRow(行数)は12×50=600ですよね。
>
> 実際に代入する値は12列51行分で、600行も要らないよね。
> 確認してみた?

確認してみました。。

実際の行数は43で、Jに43がセットされております。
objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
ここでエラーですぅ。。。
引用返信 編集キー/
■42437 / inTopicNo.10)  Re[9]: DataGridからエクセル出力でエラー
□投稿者/ ごう (65回)-(2009/10/15(Thu) 18:19:59)
2009/10/15(Thu) 18:20:28 編集(投稿者)

> 確認してみました。。
>
> 実際の行数は43で、Jに43がセットされております。
> objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
> ここでエラーですぅ。。。

>Jに43がセットされております
細かいことですが・・・「j」に43ですね。

AからLは12列分
2行目から43行目まで42行分


DataArrayは何行何列作ったの?

Rangeに指定してる範囲に対して、DataArrayが大きすぎではないですかね?

引用返信 編集キー/
■42439 / inTopicNo.11)  Re[10]: DataGridからエクセル出力でエラー
□投稿者/ ごう (66回)-(2009/10/15(Thu) 18:25:18)
No42437 (ごう さん) に返信
> 2009/10/15(Thu) 18:20:28 編集(投稿者)
>
>>確認してみました。。
>>
>>実際の行数は43で、Jに43がセットされております。
>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
>>ここでエラーですぅ。。。
>
> >Jに43がセットされております
> 細かいことですが・・・「j」に43ですね。
>
> AからLは12列分
> 2行目から43行目まで42行分
>
>
> DataArrayは何行何列作ったの?
>
> Rangeに指定してる範囲に対して、DataArrayが大きすぎではないですかね?

たとえば・・・(42行12列のデータを考える)
'DataArrayをExcelSheetに貼り付け
Range = objExcelSheet.range("A2", Reflection.Missing.Value)
Range = Range.resize(42, 12)' A2から42行12列分の範囲を選択
Range.value = DataArray '←DataArrayは(42, 12)の大きさですか?

引用返信 編集キー/
■42441 / inTopicNo.12)  Re[10]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (9回)-(2009/10/15(Thu) 18:58:53)
No42437 (ごう さん) に返信
> 2009/10/15(Thu) 18:20:28 編集(投稿者)
>
>>確認してみました。。
>>
>>実際の行数は43で、Jに43がセットされております。
>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
>>ここでエラーですぅ。。。
>
> >Jに43がセットされております
> 細かいことですが・・・「j」に43ですね。
>
> AからLは12列分
> 2行目から43行目まで42行分
>
>
> DataArrayは何行何列作ったの?
>
> Rangeに指定してる範囲に対して、DataArrayが大きすぎではないですかね?
>

言われて気付いたところがありました。
> AからLは12列分
> 2行目から43行目まで42行分
jが43だとして、
>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
Range("A2:L43")となってるので、データが2行分欠落してました^^;
objExcelSheet.Range("A2:L" & CStr(j+2)).Value = DataArray
に変更しました。

> DataArrayは何行何列作ったの?
ですが、43行12列でした。

データ欠落箇所修正しましたが、現象変わらずでした。。。;;
引用返信 編集キー/
■42443 / inTopicNo.13)  Re[11]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (10回)-(2009/10/15(Thu) 19:03:18)
No42439 (ごう さん) に返信
> ■No42437 (ごう さん) に返信
>>2009/10/15(Thu) 18:20:28 編集(投稿者)
>>
> >>確認してみました。。
> >>
> >>実際の行数は43で、Jに43がセットされております。
> >>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
> >>ここでエラーですぅ。。。
>>
>>>Jに43がセットされております
>>細かいことですが・・・「j」に43ですね。
>>
>>AからLは12列分
>>2行目から43行目まで42行分
>>
>>
>>DataArrayは何行何列作ったの?
>>
>>Rangeに指定してる範囲に対して、DataArrayが大きすぎではないですかね?
>
> たとえば・・・(42行12列のデータを考える)
> 'DataArrayをExcelSheetに貼り付け
> Range = objExcelSheet.range("A2", Reflection.Missing.Value)
> Range = Range.resize(42, 12)' A2から42行12列分の範囲を選択
> Range.value = DataArray '←DataArrayは(42, 12)の大きさですか?
>

DataArrayは(43,12)でした。。。
引用返信 編集キー/
■42448 / inTopicNo.14)  Re[12]: DataGridからエクセル出力でエラー
□投稿者/ ごう (67回)-(2009/10/15(Thu) 20:54:43)
>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
>Range("A2:L43")となってるので、データが2行分欠落してました^^;
>objExcelSheet.Range("A2:L" & CStr(j+2)).Value = DataArray
>に変更しました。

これだと、j=43のとき、44行12列を選択することになりますよ。

>> DataArrayは何行何列作ったの?
>ですが、43行12列でした。

RangeとDataArrayの大きさが一致してませんね。

もう少し、小さい範囲で考えて、原因を絞っていきましょう。
こちらを参考にして、(5,5)の大きさの配列を作り、5行5列分の範囲を指定してデータを代入することができますか?
http://support.microsoft.com/kb/302094/ja

Dim range As Excel.Range
range = objExcelSheet.Range("A2", Reflection.Missing.Value)
range = range.Resize(5, 5)

'(5,5)の大きさの配列を作り
Dim saRet(5, 5) As Double

'(5,5)の大きさの配列に値を代入する
Dim iRow As Long
Dim iCol As Long
For iRow = 0 To 5
    For iCol = 0 To 5
        'Put a counter in the cell.
        saRet(iRow, iCol) = iRow * iCol
    Next iCol
Next iRow

'Set the range value to the array.
range.Value = saRet

# もしできるようであれば、データの作り方、もしくはRangeの指定の仕方に問題がある可能性があります


引用返信 編集キー/
■42471 / inTopicNo.15)  Re[13]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (11回)-(2009/10/16(Fri) 08:14:40)
No42448 (ごう さん) に返信
> >>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
> >Range("A2:L43")となってるので、データが2行分欠落してました^^;
> >objExcelSheet.Range("A2:L" & CStr(j+2)).Value = DataArray
> >に変更しました。
>
> これだと、j=43のとき、44行12列を選択することになりますよ。
>
> >> DataArrayは何行何列作ったの?
> >ですが、43行12列でした。
>
> RangeとDataArrayの大きさが一致してませんね。
>
> もう少し、小さい範囲で考えて、原因を絞っていきましょう。
> こちらを参考にして、(5,5)の大きさの配列を作り、5行5列分の範囲を指定してデータを代入することができますか?
> http://support.microsoft.com/kb/302094/ja
>
> Dim range As Excel.Range
> range = objExcelSheet.Range("A2", Reflection.Missing.Value)
> range = range.Resize(5, 5)
>
> '(5,5)の大きさの配列を作り
> Dim saRet(5, 5) As Double
>
> '(5,5)の大きさの配列に値を代入する
> Dim iRow As Long
> Dim iCol As Long
> For iRow = 0 To 5
> For iCol = 0 To 5
> 'Put a counter in the cell.
> saRet(iRow, iCol) = iRow * iCol
> Next iCol
> Next iRow
>
> 'Set the range value to the array.
> range.Value = saRet
>
> # もしできるようであれば、データの作り方、もしくはRangeの指定の仕方に問題がある可能性があります
>
>

ごうさんありがとうございます。

言われた通りのコーディングしました。。。

なななんと、できました^^

ですので、もう一度データ作成・Rangeまわりを見直してみます。
やっと光が見えてきました。ありがとうございましたぁm(_ _)m
引用返信 編集キー/
■42472 / inTopicNo.16)  Re[14]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (12回)-(2009/10/16(Fri) 08:14:52)
No42471 (ダメッス さん) に返信
> ■No42448 (ごう さん) に返信
>>>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
>>>Range("A2:L43")となってるので、データが2行分欠落してました^^;
>>>objExcelSheet.Range("A2:L" & CStr(j+2)).Value = DataArray
>>>に変更しました。
>>
>>これだと、j=43のとき、44行12列を選択することになりますよ。
>>
>>>> DataArrayは何行何列作ったの?
>>>ですが、43行12列でした。
>>
>>RangeとDataArrayの大きさが一致してませんね。
>>
>>もう少し、小さい範囲で考えて、原因を絞っていきましょう。
>>こちらを参考にして、(5,5)の大きさの配列を作り、5行5列分の範囲を指定してデータを代入することができますか?
>>http://support.microsoft.com/kb/302094/ja
>>
>>Dim range As Excel.Range
>>range = objExcelSheet.Range("A2", Reflection.Missing.Value)
>>range = range.Resize(5, 5)
>>
>>'(5,5)の大きさの配列を作り
>>Dim saRet(5, 5) As Double
>>
>>'(5,5)の大きさの配列に値を代入する
>>Dim iRow As Long
>>Dim iCol As Long
>>For iRow = 0 To 5
>> For iCol = 0 To 5
>> 'Put a counter in the cell.
>> saRet(iRow, iCol) = iRow * iCol
>> Next iCol
>>Next iRow
>>
>>'Set the range value to the array.
>>range.Value = saRet
>>
>># もしできるようであれば、データの作り方、もしくはRangeの指定の仕方に問題がある可能性があります
>>
>>
>
> ごうさんありがとうございます。
>
> 言われた通りのコーディングしました。。。
>
> なななんと、できました^^
>
> ですので、もう一度データ作成・Rangeまわりを見直してみます。
> やっと光が見えてきました。ありがとうございましたぁm(_ _)m
解決済み
引用返信 編集キー/
■42473 / inTopicNo.17)  Re[15]: DataGridからエクセル出力でエラー
□投稿者/ ダメッス (13回)-(2009/10/16(Fri) 09:07:33)
No42472 (ダメッス さん) に返信
> ■No42471 (ダメッス さん) に返信
>>■No42448 (ごう さん) に返信
> >>>>objExcelSheet.Range("A2:L" & CStr(j)).Value = DataArray
> >>>Range("A2:L43")となってるので、データが2行分欠落してました^^;
> >>>objExcelSheet.Range("A2:L" & CStr(j+2)).Value = DataArray
> >>>に変更しました。
> >>
> >>これだと、j=43のとき、44行12列を選択することになりますよ。
> >>
> >>>> DataArrayは何行何列作ったの?
> >>>ですが、43行12列でした。
> >>
> >>RangeとDataArrayの大きさが一致してませんね。
> >>
> >>もう少し、小さい範囲で考えて、原因を絞っていきましょう。
> >>こちらを参考にして、(5,5)の大きさの配列を作り、5行5列分の範囲を指定してデータを代入することができますか?
> >>http://support.microsoft.com/kb/302094/ja
> >>
> >>Dim range As Excel.Range
> >>range = objExcelSheet.Range("A2", Reflection.Missing.Value)
> >>range = range.Resize(5, 5)
> >>
> >>'(5,5)の大きさの配列を作り
> >>Dim saRet(5, 5) As Double
> >>
> >>'(5,5)の大きさの配列に値を代入する
> >>Dim iRow As Long
> >>Dim iCol As Long
> >>For iRow = 0 To 5
> >> For iCol = 0 To 5
> >> 'Put a counter in the cell.
> >> saRet(iRow, iCol) = iRow * iCol
> >> Next iCol
> >>Next iRow
> >>
> >>'Set the range value to the array.
> >>range.Value = saRet
> >>
> >># もしできるようであれば、データの作り方、もしくはRangeの指定の仕方に問題がある可能性があります
> >>
> >>
>>
>>ごうさんありがとうございます。
>>
>>言われた通りのコーディングしました。。。
>>
>>なななんと、できました^^
>>
>>ですので、もう一度データ作成・Rangeまわりを見直してみます。
>>やっと光が見えてきました。ありがとうございましたぁm(_ _)m

対策とれましたので、ご報告しておきます。
データ内に文字と数値がありましたので、配列の型をObject型にしておりましたが
そこを不本意ながらString型にしたところ問題なく動作するようになりました。
あと、配列の行数の定義も見直しました。

長い間サポートして頂きありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -