DOBON.NETプログラミング道掲示板

■35487 / 親記事)  vb.netでのExcelファイルそうさ
  
□投稿者/ 独学学生 一般人(1回)-(2023/08/18(Fri) 19:37:57)
  • アイコン環境/言語:[Windows10] 
    分類:[.NET] 

    vb.netで下記プログラムを実行するとバックグラウンドプロセスにタスクが必ず残ってしまいます。
    フォームアプリを終了するとプロセスが消えるのですがバックグラウンドプロセスに残らない方法はありますか?

    private sub btn作成_Click(sender as object,e as eventargs)handles btn作成.click
    If txtpath.text =“” then
    exit sub
    end if

    btn作成.enabled =false

    dim str as string =“”
    dim strcount =0

    dim ex as new
    Microsoft.office.interop.Excel.application
    dim sh as Microsoft.office.interop.Excel.worksheet
    dim wb as Microsoft.office.interop.Excel.workbook
    dim range as Microsoft.office.interop.Excel.range

    For rw as integer =0 to dgv.rowcount -1
    if dgv.rows(rw).cells(“選択”).value=1 then
    str=dgv.row(rw).cells(“品名”).value & vbcrlf
    str &= dgv.row(rw).cells(“数量”).value & vbcrlf
    str &= dgv.row(rw).cells(“単位”).value & vbcrlf

    if strcount =0 then
    wb=ex.workbooks.open (txtpath.text)
    sh=ex.worksheets(“発注”)

    dim strarry() as string =str.split({environment.newline},stringsplitoptions.none)
    dim arrycount =0

    range = sh.range(“B” & 5 + strcount & “:I” & 5 + strcount)

    for col as integer =1 to range.columns.count
    range.cells(1,col).value =strarry(arrycount)
    system.runtime.InteropService.Marshal.release comobject(range.cells(1,col))
    arrycount =arrycount + 1
    next

    strcount =strcount + 1

    end if
    next

    wb.save()
    we.close(false)
    ex.quit()

    system.runtime.InteropService.Marshal.release comobject(range)
    system.runtime.InteropService.Marshal.release comobject(sh)
    system.runtime.InteropService.Marshal.release comobject(wb)
    system.runtime.InteropService.Marshal.release comobject(ex)

    Range=nothing
    Sh=nothing
    Wb=nothing
    Ex=nothing

    gc .Collect()
    gc.waitforpendingfinalizers()

    btn作成.enabled =true

    Msgbox(“作業完了”)
    end sub

マルチポストを報告
違反を報告
引用返信 削除キー/
■35488 / ResNo.1)  Re[1]: vb.netでのExcelファイルそうさ
□投稿者/ Hongliang 大御所(644回)-(2023/08/18(Fri) 20:11:07)
  • アイコン> wb=ex.workbooks.open (txtpath.text)
    Workbooksオブジェクトが解放漏れ
    > for col as integer =1 to range.columns.count
    columnsであるRangeオブジェクトが解放漏れ
    > range.cells(1,col).value =strarry(arrycount)
    cells(,)が返すRangeオブジェクトが解放漏れ
    他にもあるかもしれませんがとりあえず目についただけ。
    hoge.fuga.piyoのようにピリオドが1文に2個存在してたら漏れてると考えたほうがいいです。

    > system.runtime.InteropService.Marshal.releasecomobject(range.cells(1,col))
    意味がないです。
    上と合わせてrange.cells(,)を2回取って1回分だけ解放している計算です。
    取得したオブジェクトは変数に確保しておき、それに対してReleaseComObjectする必要があります。

    まともにReleaseComObjectを考えると正直切りがないんで、Excel操作だけを別のexeとして作成し、そっちに全部任せちゃうってのもありかもしれませんね。
    DataGridのデータを読み取って、いったんファイルに書き込んで、操作用exeはファイルから読み込んでExcelをいじる、みたいな。

    あとは、単純にセルの中身をいじるだけならClosedXmlみたいなライブラリを使用するとか。
違反を報告
引用返信 削除キー/
■35489 / ResNo.2)  Re[1]: vb.netでのExcelファイルそうさ
□投稿者/ KOZ 一般人(22回)-(2023/08/18(Fri) 20:16:52)
  • アイコンNetOffice Framework を使ったらどうでしょう?
    https://netoffice.io/

違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -