tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルエクセルのプロセス(シート名変更)終了できない
記事No11536
投稿日: 2015/12/08(Tue) 14:33
投稿者SUZUKI
vb6.0からvb2005移行に挑戦しています
掲示板等を読んでいるのですがどうしても解決できずよろしくお願いします
HYOSIというシートがありコピーしてシート名を変えたいと思っています
OS WINDOWS7 EXCEL2003 です
      oSheets("HYOSI (2)").Select()
      oSheets("HYOSI (2)").Name = kanri_no.Value
を追加した途端制御できなくなってしましました


  Sub HYOSIEXCEL()

        Dim oExcel As Object = CreateObject("Excel.Application")
        oExcel.Visible = True
        Dim oBooks As Object = oExcel.Workbooks
        XlsFileName = GetAppPath() & "\EXCEL\SHYOSI.xls"
        Dim oBook As Object = oBooks.open(XlsFileName)
        Dim oSheets As Object = oBook.Worksheets
        Dim oSheet As Object = oSheets.Item(1) 'Sheet1
        oSheets("HYOSI").Select()
        oSheets("HYOSI").Copy(after:=oBook.sheets(1))
        'GoTo label1 ここまではうまくいく
        oSheets("HYOSI (2)").Select()
        oSheets("HYOSI (2)").Name = kanri_no.Value
      '上記2行を加えた途端プロセス終了してくれない
       GoTo label1 
        'Excelファイル操作

label1:
        MRComObject(oSheet, True)
        MRComObject(oSheets, True)
        oBook.Close(False)
        MRComObject(oBook, True)
        MRComObject(oBooks, True)
        oExcel.Quit()
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcel)
        MRComObject(oExcel, True)
        ProcessCheck()
    End Sub

[ツリー表示へ]
タイトルRe: エクセルのプロセス(シート名変更)終了できない
記事No11537
投稿日: 2015/12/08(Tue) 21:25
投稿者花ちゃん
>         Dim oExcel As Object = CreateObject("Excel.Application")
>         oExcel.Visible = True
>         Dim oBooks As Object = oExcel.Workbooks
>         XlsFileName = GetAppPath() & "\EXCEL\SHYOSI.xls"
>         Dim oBook As Object = oBooks.open(XlsFileName)
>         Dim oSheets As Object = oBook.Worksheets
>         Dim oSheet As Object = oSheets.Item(1) 'Sheet1
>         oSheets("HYOSI").Select()
>         oSheets("HYOSI").Copy(after:=oBook.sheets(1))
>         'GoTo label1 ここまではうまくいく

そもそも oSheets.Item(1) と oSheets("HYOSI") は別のシートですか?
別のシートなら Dim oSheet1 As Object = oSheets("HYOSI") のようにして使用しないと

oSheets("HYOSI").Copy(after:=oBook.sheets(1))

oBook.sheets(1) これもおかしいのでは?  oSheet の事じゃないのですか

又、.Copy を使った場合参照カウントが余分に増えるようです。

>         oSheets("HYOSI (2)").Select()
>         oSheets("HYOSI (2)").Name = kanri_no.Value

kanri_no.Value は数値 ですか? 文字ですか?

ご自分で問題点が解らないようなら、いきなり参照設定なしのコードで作成せず
参照設定して動作確認したコードを書き換えるようにして下さい
      

[ツリー表示へ]
タイトルRe^2: エクセルのプロセス(シート名変更)終了できない
記事No11538
投稿日: 2015/12/09(Wed) 01:35
投稿者花ちゃん
下記なら一応解放されます。(カウントが 0 になるので)
但し、after:= の部分の処理はどのようにすべきか解らないので取りあえずこのままで

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim oExcel As Object = CreateObject("Excel.Application")
        oExcel.Visible = True
        Dim oBooks As Object = oExcel.Workbooks
        Dim XlsFileName As String = "g:\Test.xls"
        Dim oBook As Object = oBooks.open(XlsFileName)
        Dim oSheets As Object = oBook.Worksheets
        Dim oSheet As Object = oSheets("HYOSI")
        oSheet.Copy(after:=oSheet)  'この処理は正しいとは言えません。
        Dim oSheet1 As Object = oSheets("HYOSI (2)")
        oSheet1.Name = CStr(123)

        'これだけカウントが余計に上がるので
        Dim cu As Integer = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheet)
        Console.WriteLine(cu.ToString)

        cu = System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet1)
        Console.WriteLine(cu.ToString)
        cu = System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheets)
        Console.WriteLine(cu.ToString)
        oBook.Close(False)
        cu = System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
        Console.WriteLine(cu.ToString)
        cu = System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
        Console.WriteLine(cu.ToString)
        oExcel.Quit()
        cu = System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
        Console.WriteLine(cu.ToString)
    End Sub

[ツリー表示へ]
タイトルRe^3: エクセルのプロセス(シート名変更)終了できない
記事No11539
投稿日: 2015/12/09(Wed) 11:18
投稿者SUZUKI
花ちゃん、早急のアドバイスありがとうございます
ようやく解放されました
Dim osheet1 As Object = oSheets("HYOSI (2)")
がポイントですね
ありがとうございます

疑問点を指摘されていましたので記述します

1.HYOSIと osheets.item(1) は同じシートをイメージしています

2.kanri_no  vb6.0   as string*10
  kanri_no  vb2005  as New VB6.FixedLengthString(10)

自分では文字型です kanri_no.value と自動変換
されていますが tostring の方かも知れません

3.COPY文行は後々問題起こすかも知れませんが
  とりあえず様子を見る事とします

今後共、よろしくお願いします

[ツリー表示へ]