DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33512 / inTopicNo.1)  VB.NETからエクセル(アクティブセル)への画像挿入
  
□投稿者/ BAKIN 一般人(1回)-(2016/11/16(Wed) 17:08:12)
  • アイコン環境/言語:[Windows7、 64bit、VB.NET] 
    分類:[.NET] 

    2016/11/16(Wed) 17:22:42 編集(投稿者)
    2016/11/16(Wed) 17:18:27 編集(投稿者)

    VB.NET初心者です。よろしくお願いします。

    エクセルに画像を挿入できるのですが・・・
    開いているエクセル(例えば保存済みのTEST.xlsや新規作成したBook1.xls)のSHEET1には、画像を挿入できる状態です。
    やりたいことは、複数のsheetを使用している中で、作業している(アクティブな)SHEET(例えばSHEET7など)だけに画像を挿入したいのです。

    現状はButton1のクリックでListBox1にエクセルファイル名(TEST.xls)を取得し、
    ListBox1のクリックでTEST.xls の sheet1に画像が挿入できます。

    Imports Microsoft.Office.Core
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.Excel
    Public Class Form1
    'ボタン1でリストボックスにファイル名を取得
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim xlApp As Object
    Dim xlBook As Object
    Dim xlSheet As Object 'Excel.sheet

    ListBox1.Items.Clear()
    xlApp = GetObject(, "Excel.Application")
    For Each xlBook In xlApp.Workbooks
    ListBox1.Items.Add(xlBook.Name)
    Next

    For Each xlSheet In xlApp.sheets
    ListBox2.Items.Add(xlSheet.Name)
    Next

    End Sub

    'リストボックスをクリックで作業中のブック、シート1に画像挿入)
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    Dim xlApp As Object 'Excel.Application
    Dim xlBook As Object 'Excel.Workbook
    Dim xlSheet As Object 'Excel.sheet


    If ListBox1.Text <> "" Then
    xlApp = GetObject(, "Excel.Application")
    xlBook = xlApp.Workbooks.Item(ListBox1.Text)
    End If

    xlSheet = xlBook.Worksheets(1)
    Debug.WriteLine(xlSheet.Cells(1, 1).Value)
    xlSheet.Shapes.AddPicture("C:\Users\admin\Desktop\999.png", MsoTriState.msoFalse, MsoTriState.msoTrue, 35.0F, 35.0F, 35.0F, 35.0F)

    End Sub
    End Class


    以上、よろしくお願いします。
引用返信 削除キー/
■33515 / inTopicNo.2)  Re[1]: VB.NETからエクセル(アクティブセル)への画像挿入
□投稿者/ 魔界の仮面弁士 大御所(1050回)-(2016/11/18(Fri) 10:53:12)
  • アイコンNo33512に返信(BAKINさんの記事)
    > やりたいことは、複数のsheetを使用している中で、作業している(アクティブな)SHEET(例えばSHEET7など)だけに画像を挿入したいのです。

    Excel の Application オブジェクトが持つ、ActiveSheet プロパティを
    利用してみてください。

    このとき、ActiveSheet が返すオブジェクトを、一旦 Object 型変数に
    受け取った後で、その中身が Worksheet 型であるかどうかも、
    確認するようにすると良いでしょう。
    →TypeOf で確認するか、Type プロパティ(XlSheetType 列挙型)を判定。


    > xlApp = GetObject(, "Excel.Application")
    Excel が単一起動である場合は問題無いですが、
    Excel.exe が複数起動されていた場合、どのインスタンスが
    拾われるかは曖昧になりますね。

    複数の Excel インスタンスを識別したいケースは稀とは思いますが、
    もしも 起動済みの Excel を列挙する必要があるのなら、
    IRunningObjectTable を通じて取得することができます。


    > xlBook = xlApp.Workbooks.Item(ListBox1.Text)

    xlBooks = xlApp.Workbooks
    xlBook = xlBooks.Item(ListBox1.Text)

    のように、COM オブジェクトごとに変数に保持し、
    処理完了後、適宜終了させる事をお奨めします。
    http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm

    COM オブジェクトに対して、
     オブジェクト.プロパティ.メソッド(引数)
     オブジェクト.プロパティ.プロパティ
    のように、「.」が複数連続する表記法を用いると、
    リソースの解放が遅延する要因になりえますので。
    (名前空間の後の「.」や、列挙型の「.」は問題ありませんが)


    > xlSheet = xlBook.Worksheets(1)
    > Debug.WriteLine(xlSheet.Cells(1, 1).Value)
    > xlSheet.Shapes.AddPicture(…)
    このあたりも同様で、
     xlSheets = xlBook.Worksheets
     xlSheet = xlSheets(1)

     xlRange1 = xlSheet.Cells
     xlRange2 = xlRange1(1, 1)
     Debug.WriteLine(xlRange2.Value)

     xlShapes = xlSheet.Shapes
     xlShape = xlShapes.AddPicture(…)
    のように、COM オブジェクトごとに受け取っておき、
    処理が終わったところで、Marhal.ReleaseComObject で
    解放した方がよろしいかと。



    > For Each xlBook In xlApp.Workbooks

    For Each で列挙した場合、IEnumVARIANT の解放が
    難しくなる事がありますので、ご注意下さい。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=54129&KLOG=91#5
引用返信 削除キー/
■33521 / inTopicNo.3)  Re[2]: VB.NETからエクセル(アクティブセル)への画像挿入
□投稿者/ BAKIN 一般人(2回)-(2016/11/18(Fri) 15:02:58)
  • アイコン仮面弁士さん、ありがとうございます。

    > Excel の Application オブジェクトが持つ、ActiveSheet プロパティを
    > 利用してみてください。
    > このとき、ActiveSheet が返すオブジェクトを、一旦 Object 型変数に
    > 受け取った後で、その中身が Worksheet 型であるかどうかも、
    > 確認するようにすると良いでしょう。
    > →TypeOf で確認するか、Type プロパティ(XlSheetType 列挙型)を判定。

    この辺りの理解が中途半端で、どのようにすれば良いか解りません。
    具体的な例文があれば、教えて下さい。

    よろしくお願いします。



    > 複数の Excel インスタンスを識別したいケースは稀とは思いますが、
    > もしも 起動済みの Excel を列挙する必要があるのなら、
    > IRunningObjectTable を通じて取得することができます。

    上記の状態は確認できました。
    次回のステップで挑戦させていただきます。


引用返信 削除キー/
■33524 / inTopicNo.4)  Re[3]: VB.NETからエクセル(アクティブセル)への画像挿入
□投稿者/ 魔界の仮面弁士 大御所(1057回)-(2016/11/18(Fri) 19:46:29)
  • アイコンNo33521に返信(BAKINさんの記事)
    >>ActiveSheet プロパティを利用してみてください。
    > この辺りの理解が中途半端で、どのようにすれば良いか解りません。

    大雑把に言えば、
     xlSheets = xlBook.Worksheets
     xlSheet = xlSheets(1)
    のかわりに
     xlSheet = xlBook.ActiveSheet
    もしくは
     xlSheet = xlApp.ActiveSheet
    というコードを使う、ということです。あとは一緒。


    >>→TypeOf で確認するか、Type プロパティ(XlSheetType 列挙型)を判定。
    xlSheet.Type が &HFFFFEFB9 を返した場合、
    その ActiveSheet はワークシートだということになります。

    グラフシート等を使っていないのなら、
    そこまでチェックする必要は無いかも知れませんけど。

    ※Type プロパティを持たないシートもありますので(ダイアログシート)、
     実際に判定する場合は、例外処理も必要です。
引用返信 削除キー/
■33529 / inTopicNo.5)  Re[4]: VB.NETからエクセル(アクティブセル)への画像挿入
□投稿者/ BAKIN 一般人(3回)-(2016/11/21(Mon) 10:43:31)
  • アイコンお世話になります。

    >  xlSheet = xlBook.ActiveSheet
    > もしくは
    >  xlSheet = xlApp.ActiveSheet
    > というコードを使う、ということです。あとは一緒。

    解決できました。ありがとうございます。

    > →TypeOf で確認するか、Type プロパティ(XlSheetType 列挙型)を判定。
    > xlSheet.Type が &HFFFFEFB9 を返した場合、
    > その ActiveSheet はワークシートだということになります。

    再度、チャンレジしてみます。
    本当にありがとうございました。
解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -