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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 >>
■1625  Re[1]: Accessデータベースから
□投稿者/ R・田中一郎 -(2007/02/28(Wed) 20:31:14)
>
    No1624 (yamato さん) に返信

    > ネットで色々検索して探したんですがデータベースと接続がなかなかできません。
    > ツールボックスのodbcConnectionとか色々ありますが使いかたがわかりません。

    取りあえず、この辺りが参考になると思いますので、ご一読してみて下さい。
    http://park5.wakwak.com/~weblab/tocUpdate.html
記事No.1624 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1541  COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 15:22:11)

    分類:[C# (Windows)] 

    初めて投稿させて頂きます。

    COMオブジェクトを使用して、EXCELを出力している機能で、
    OSがXPの場合、正常に動作するのですが、Win2000(SP4)の場合、

    HRESULTからの例外です:0x800A03EC。

    というエラーが発生します。

    使用しているライブラリはMicrosoft Excel 9.0 Object Libraryです。

    ソースを下記に添付致します。
    宜しくお願い致します。

    Excel.Application xlApplication = null;
    Excel.Workbooks xlWorkbooks = null;
    Excel._Workbook xlWorkbook = null;
    Excel.Sheets xlSheets = null;
    Excel._Worksheet xlWorkSheet = null;
    Excel.Range xlRange = null;
    // Excel作成
    try
    {
    // 新しいbookを作る
    try
    {
    xlApplication = new Excel.Application(); // Excelアプリケーション
    xlApplication.DisplayAlerts = false;

    try
    {
    xlWorkbooks = xlApplication.Workbooks;

    try
    {
    xlWorkbook = null;

    if (rdo_Syain.Checked == true)
    {
    xlWorkbook = xlWorkbooks.Add(CMArea.NEXTUserFileTemplatePath);
    }
    else if (rdo_Sosiki.Checked == true)
    {
    xlWorkbook = xlWorkbooks.Add(CMArea.NEXTGroupFileTemplatePath);
    }
    else if (rdo_Yaku.Checked == true)
    {
    xlWorkbook = xlWorkbooks.Add(CMArea.NEXTPostFileTemplatePath);
    }

    try
    {
    xlSheets = xlWorkbook.Worksheets;

    try
    {
    xlWorkSheet = (Excel._Worksheet)xlSheets.get_Item(1);
    xlRange = null;

    try
    {
    // 範囲を獲得
    long lRowCnt = insData.GetLength(0);
    long lColCnt = insData.GetLength(1);
    xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    xlRange = xlRange.get_Resize(lRowCnt, lColCnt);

    // 値を代入
    xlRange.Value = insData;

    //保存
    xlWorkbook.SaveAs(txt_FilePath1.Text,
    Excel.XlFileFormat.xlWorkbookNormal,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Excel.XlSaveAsAccessMode.xlNoChange,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    }
    finally
    {
    if (xlRange != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange); //COM オブジェクト解放
    }
    }
    finally
    {
    if (xlWorkSheet != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet); //COM オブジェクト解放
    }
    }
    finally
    {
    if (xlSheets != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets); //COM オブジェクト解放
    }
    }
    finally
    {
    try
    {
    xlWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
    }
    finally
    {
    if (xlWorkbook != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook); //COM オブジェクト解放
    }
    }
    }
    finally
    {
    try
    {
    xlWorkbooks.Close();
    }
    finally
    {
    if (xlWorkbooks != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbooks); //COM オブジェクト解放
    }
    }
    }
    finally
    {
    try
    {
    // Excel を終了する
    xlApplication.Quit();
    }
    finally
    {
    if (xlApplication != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication); //COM オブジェクト解放
    }

    }
    bRtn = true;
    }
    catch (Exception exc)
    {
    MessageBox.Show("Excel作成時にエラーが発生しました。\n\n" + exc.Message
    , lbl_Title.Text , MessageBoxButtons.OK, MessageBoxIcon.Error);
    bRtn = false;
    }
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■1542  Re[1]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Blue -(2007/02/27(Tue) 15:27:44)
    2007/02/27(Tue) 15:32:57 編集(投稿者)

    とりあえず、どこでエラーが発生しているのか特定できますか?
    また

    insData

    に関して何も触れられていないようですが、何者なんでしょうか?


    >OSがXPの場合、正常に動作するのですが、Win2000(SP4)の場合、
    これは同じバージョンのExcelを利用していますか?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1544  Re[2]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 15:41:24)
    早速の返信ありがとうございます。


    > とりあえず、どこでエラーが発生しているのか特定できますか?
    開発環境がWinXPなので、特定できてはおりませんが、
    このソースのどこかでエラーが発生していることは分かっています。
    Win2000環境を作成して、エラー箇所を特定してみます。

    > また
    >
    > insData
    >
    > に関して何も触れられていないようですが、何者なんでしょうか?>

    すいません。
    引数で、string[,] insData として渡ってきます。


    > >OSがXPの場合、正常に動作するのですが、Win2000(SP4)の場合、
    > これは同じバージョンのExcelを利用していますか?

    同じバージョンです。ちなみに共にEXCEL2000(SP3)を使用しております。

    宜しくお願い致します。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1547  Re[3]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 15:55:09)
    エラーの場所が特定できました。

    // 範囲を獲得
    long lRowCnt = insData.GetLength(0);
    long lColCnt = insData.GetLength(1);
    xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    → xlRange = xlRange.get_Resize(lRowCnt, lColCnt);

    上記の "→" でエラーが発生していました。
    OSに依存するものなのでしょうか?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1550  Re[4]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Blue -(2007/02/27(Tue) 16:01:16)
    No1547 (ぴんちはちゃんす さん) に返信
    > エラーの場所が特定できました。
    >
    > // 範囲を獲得
    > long lRowCnt = insData.GetLength(0);
    > long lColCnt = insData.GetLength(1);
    > xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    > → xlRange = xlRange.get_Resize(lRowCnt, lColCnt);
    >
    > 上記の "→" でエラーが発生していました。
    ちなみに、このときのlRowCnt,lColCntはいくつになっていましたか?


    それと、多分この書き方だと、Excelのプロセスが残っちゃうでしょう。
    (xlWorkSheet.get_Range("A3", Type.Missing);で取得したものを上書きしちゃっているので
    ReleaseComObjectできない)
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1559  Re[5]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 16:30:40)
    No1550 (Blue さん) に返信
    >>エラーの場所が特定できました。
    >>
    >> // 範囲を獲得
    >> long lRowCnt = insData.GetLength(0);
    >> long lColCnt = insData.GetLength(1);
    >> xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    >> → xlRange = xlRange.get_Resize(lRowCnt, lColCnt);
    >>
    >>上記の "→" でエラーが発生していました。
    > ちなみに、このときのlRowCnt,lColCntはいくつになっていましたか?

    466, 5になっています。

    > それと、多分この書き方だと、Excelのプロセスが残っちゃうでしょう。
    > (xlWorkSheet.get_Range("A3", Type.Missing);で取得したものを上書きしちゃっているので
    > ReleaseComObjectできない)

    タスクマネージャーを観察してますけど、プロセスは残ってないように思えます。
    書き方がまずいんですね。。。

    上書きしないように、
    xlRangeと同じ定義をしたxlRangeValを宣言して以下のようにしてみました。

    xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    xlRangeVal = xlRange.get_Resize(lRowCnt, lColCnt);

    しかし、get_Resizeでエラーになります。
    そういう問題じゃないんですかね・・・?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1549  Re[4]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ 未記入 -(2007/02/27(Tue) 16:00:30)
    No1547 (ぴんちはちゃんす さん) に返信
    > エラーの場所が特定できました。
    >
    > // 範囲を獲得
    > long lRowCnt = insData.GetLength(0);
    > long lColCnt = insData.GetLength(1);
    > xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    > → xlRange = xlRange.get_Resize(lRowCnt, lColCnt);
    >
    > 上記の "→" でエラーが発生していました。
    > OSに依存するものなのでしょうか?

    そもそもここが、WindowsやOfficeのバージョンがどうであれまずいです。
    xlRangeの参照が解放される前に、また突っ込み直しているのはダメです。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1552  Re[5]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Blue -(2007/02/27(Tue) 16:03:57)
    No1549 (未記入 さん) に返信
    >xlRangeの参照が解放される前にまた突っ込み直しているのはダメです。
    そういうことなんですね。
    やったことないのでそんな動きになるのは知らなかったです。


    # 私ならば、なるべく get_Range で済ませるように書くようにする。
    # (強引に RC 形式から A1形式に文字列を作る。)
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1555  Re[6]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ 未記入 -(2007/02/27(Tue) 16:19:32)
    No1552 (Blue さん) に返信
    > そういうことなんですね。
    > やったことないのでそんな動きになるのは知らなかったです。

    環境によっては問題にならないとは思いますけどね。

    > # 私ならば、なるべく get_Range で済ませるように書くようにする。
    > # (強引に RC 形式から A1形式に文字列を作る。)

    私も同じです。get_Resizeは使わない方が良いです。
    でも、get_Rangeもあまり推奨できたものじゃないので。
    プロパティのRangeを通した方がたぶんいいです。

    VBA自体はあんまり詳しくないけど。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1560  Re[5]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 16:42:01)
    No1559で Blue さんに返信した内容と同じで恐縮ですが、

    上書きしないように、
    xlRangeと同じ定義をしたxlRangeValを宣言して以下のようにしてみました。

    xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    xlRangeVal = xlRange.get_Resize(lRowCnt, lColCnt);

    しかし、get_Resizeでエラーになります。
    そういう問題じゃないんですかね・・・?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1562  Re[6]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Blue -(2007/02/27(Tue) 16:50:40)
    No1560 (ぴんちはちゃんす さん) に返信
    > しかし、get_Resizeでエラーになります。
    > そういう問題じゃないんですかね・・・?
    まさかとは思うけど、結合セルはありませんよね?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1563  Re[7]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 16:57:12)
    No1562 (Blue さん) に返信
    > ■No1560 (ぴんちはちゃんす さん) に返信
    >>しかし、get_Resizeでエラーになります。
    >>そういう問題じゃないんですかね・・・?
    > まさかとは思うけど、結合セルはありませんよね?

    はい、ありません。
    関係ありませんが、WEB徘徊をしていると、
    私と同じようにrangeに重複している人たちがたくさんいましたwww。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1567  Re[1]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ よねKEN -(2007/02/27(Tue) 17:03:20)
>
    > // 範囲を獲得
    > long lRowCnt = insData.GetLength(0);
    > long lColCnt = insData.GetLength(1);
    > xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    > xlRange = xlRange.get_Resize(lRowCnt, lColCnt);

    はずしているかもしれませんが、lRowCnt, lColCntがlong型なのが気になります。
    C#のlong型(8バイト)に対応するExcel VBAの型はないのでどのようにマーシャリングされるのだろうか?
    という疑問がふと沸きました。

    Resizeプロパティの両引数はVariant型ですが、その中に入るのはExcelVBA上に存在する型だけですから、
    8バイト整数はないので、Currency型に解釈されるのか、CDec関数でのみ作成できる十進型と解釈されるのか、
    あるいはExcelVBAのLong型(4バイト)として、上位4バイトは闇に葬られるのか?読めません。

    xlRange = xlRange.get_Resize((int)lRowCnt, (int)lColCnt);
    としてみるとどうでしょうか?
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1571  Re[2]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ ぴんちはちゃんす -(2007/02/27(Tue) 17:26:23)
    No1567 (よねKEN さん) に返信
    >> // 範囲を獲得
    >> long lRowCnt = insData.GetLength(0);
    >> long lColCnt = insData.GetLength(1);
    >> xlRange = xlWorkSheet.get_Range("A3", Type.Missing);
    >> xlRange = xlRange.get_Resize(lRowCnt, lColCnt);
    >
    > はずしているかもしれませんが、lRowCnt, lColCntがlong型なのが気になります。
    > C#のlong型(8バイト)に対応するExcel VBAの型はないのでどのようにマーシャリングされるのだろうか?
    > という疑問がふと沸きました。
    >
    > Resizeプロパティの両引数はVariant型ですが、その中に入るのはExcelVBA上に存在する型だけですから、
    > 8バイト整数はないので、Currency型に解釈されるのか、CDec関数でのみ作成できる十進型と解釈されるのか、
    > あるいはExcelVBAのLong型(4バイト)として、上位4バイトは闇に葬られるのか?読めません。
    >
    > xlRange = xlRange.get_Resize((int)lRowCnt, (int)lColCnt);
    > としてみるとどうでしょうか?

    おおっ?!通りました!
    ありがとうございました。

    最終的には、

    // 範囲を獲得
    int iRowCnt = insData.GetLength(0);
    int iColCnt = insData.GetLength(1);
    xlRange = xlWorkSheet.get_Range("A3", Type.Missing).get_Resize(iRowCnt, iColCnt);

    と致しました。long型が悪さしていたようですね…。
    long → int に変更し、
    get_Range、get_Resizeを同時に実行するようにすれば、
    プロセス残の心配もなくなるかなと思っております。

    ですが、あまりいい実装ではないようなので、
    他の実装方法を考えていこうと思います。

    皆様、ありがとうございました。

記事No.1541 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■1565  Re[8]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ 未記入 -(2007/02/27(Tue) 17:00:59)
    No1563 (ぴんちはちゃんす さん) に返信
    > はい、ありません。
    > 関係ありませんが、WEB徘徊をしていると、
    > 私と同じようにrangeに重複している人たちがたくさんいましたwww。

    いるでしょうね。ここの管理人さんがあれだけ注意を促していてもまだ@ITには湧いてきていますから。
    で、resizeは使わない方がいいですよ。Office PIAって使えないメンバもある上に、使えても特定環境化でHRESULTからの例外が帰る場合もあります。
    後者の場合は実装の問題でないこともありますゆえ。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1573  Re[9]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Blue -(2007/02/27(Tue) 17:33:36)
    2007/02/27(Tue) 17:34:22 編集(投稿者)

    >get_Range、get_Resizeを同時に実行するようにすれば、
    >プロセス残の心配もなくなるかなと思っております。
    これはだめでしょう。

    基本的に . が2つ横に並ぶようなのは暗黙的にCOMオブジェクト(?)を取得しているので
    別々に分けないといけないことになります。
    (暗黙的に取得したものはReleaseComObjectできない)


    Resize,Offset,Cellsと便利なものがあるけと、オブジェクトの管理が面倒なので
    なるべーく、Rangeで取れるように文字列を変換させる、、、と。
記事No.1541 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■1583  Re[2]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ 未記入 -(2007/02/27(Tue) 22:27:41)
    No1567 (よねKEN さん) に返信
    > はずしているかもしれませんが、lRowCnt, lColCntがlong型なのが気になります。

    あー見逃していました。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1626  Re[3]: COMオブジェクトを使用したEXCEL操作で、HRESULT
□投稿者/ Atata!! -(2007/02/28(Wed) 23:21:36)
    Atata!!@COM総合研究所です。

    > はずしているかもしれませんが、lRowCnt, lColCntがlong型なのが気になります。
    > C#のlong型(8バイト)に対応するExcel VBAの型はないのでどのようにマーシャリングされるのだろうか?

    誤解が生じるといかんので・・・
    Windows2000でも、64ビット整数型を保持するVARIANTのマーシャリングは正常に行われます。

    “Windows2000以前ではVariantChangeTypeはVT_I8を処理できない”
    ことが、この問題の原因であると私は考えています。
記事No.1541 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1633  VS2005 IEでファイル内容表示
□投稿者/ MOKO -(2007/03/01(Thu) 11:57:27)

    分類:[VB.NET (ASP.NET)] 

    はじめて投稿させていただきます。

    VS2005 VB.NET ASP.NETでWebアプリケーションを開発しております。

    ファイル出力と出力したファイルを同一イベント内で行えなくて困っています。

    順に書きますと{ボタンイベント}
    1.ファイル出力{ここではExcelとします}
    2.新しいIEを開く{window.open()}
    3.新しく開いたIEがLoadイベント内でResponse.Redirect("ファイルパス")

    1.〜3.までをボタンイベント発生時に行いたいのです。
    1.は問題なくできます。
    2.はonclick=window.open←これがASP:Buttonコントロールではできません。
                    <input id="Button"ではできます。
    3.については別Pageですので問題ありません。

    ↓↓
    1.と2.が同一に行えないというのが困っている内容になると思います。
    ↑↑


    説明をだらだら書いてしまいましたが、不明点があれば答えますのでお力添えをお願いします。

    以上 よろしくお願いします。
親記事 /過去ログ10より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 >>

ヒット件数が多いので過去ログ1〜10 までの検索結果 / 過去ログ11からさらに検索→

パスワード/

- Child Tree -