代码之家  ›  专栏  ›  技术社区  ›  Mr.J

如何删除使用的EXCEL进程VB.NET版[复制]

  •  1
  • Mr.J  · 技术社区  · 6 年前

    oSheet.Rows.Count 但那不管用。你知道吗?

    我的代码如下:

    Dim oExcel As Object
    Dim oBook As Object
    Dim oSheet As Object
    
    oExcel = CreateObject("Excel.Application")
    oBook = oExcel.Workbooks.Add
    
    oSheet = oBook.Worksheets("Sheet")
    
    oSheet.Range("A" & max).Value = "0000111"
    oSheet.Range("B1").Value ="Name"
    
    oBook.SaveAs("C:\New folder\excel\" & datenw & ".xlsx")
    oExcel.Quit()
    
    0 回复  |  直到 8 年前
        1
  •  1
  •   Bugs Manjeet    8 年前

    正如在注释中所说,下面的代码应该为您提供基于 Range :

    Dim rowCount As Integer = oSheet.UsedRange.Rows.Count()
    

    但是我相信你的代码有一点小问题。这可能行不通:

    oSheet = oBook.Worksheets("Sheet")
    

    Workbook . "Sheet1“是的,因此需要将其更改为:

    oSheet = oBook.Worksheets("Sheet1")
    'or
    oSheet = oBook.Worksheets(1) 'remember Excel collections  are one based not zero based
    

    Excel 作为 oExcel.Quit() 可能会使Excel实例继续运行。看看这个 answer 哪个链接到 Siddharth Rout's 一点点 code

    Private Sub ReleaseObject(ByVal obj As Object)
        Try
            Dim intRel As Integer = 0
            Do
                intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            Loop While intRel > 0
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
    

    ReleaseObject(oSheet)
    oBook.Close()
    ReleaseObject(oBook)
    oExcel.Quit()
    ReleaseObject(oExcel)
    

    尽管如此,我还是会考虑使用 Microsoft.Office.Interop.Excel namespace 直接而不是声明对象:

    Imports Microsoft.Office.Interop
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    
            Dim oExcel As New Excel.Application
    
            Dim oWorkbooks As Excel.Workbooks = oExcel.Workbooks
            Dim oWorkbook As Excel.Workbook = oWorkbooks.Add()
    
            Dim oSheets As Excel.Sheets = CType(oWorkbook.Sheets, Excel.Sheets)
            Dim oWorksheet As Excel.Worksheet = CType(oSheets(1), Excel.Worksheet)
    
            Dim oARange As Excel.Range = oWorksheet.Range("A" & max.ToString()) 'Not sure what max is but I took the assumption it's an Integer
            oARange.Value = "0000111"
    
            Dim oBRange As Excel.Range = oWorksheet.Range("B1")
            oBRange.Value = "Name"
    
            Dim oUsedRange As Excel.Range = oWorksheet.UsedRange()
            Dim rowCount As Integer = oUsedRange.Rows.Count()
    
            oWorkbook.SaveAs("C:\Test.xlsx")
    
            ReleaseObject(oUsedRange)
            ReleaseObject(oBRange)
            ReleaseObject(oARange)
    
            ReleaseObject(oWorksheet)
            ReleaseObject(oSheets)
    
            oWorkbook.Close()
            ReleaseObject(oWorkbook)
            ReleaseObject(oWorkbooks)
    
            oExcel.Quit()
            ReleaseObject(oExcel)
    
        End Sub
    
        Private Sub ReleaseObject(ByVal obj As Object)
            Try
                Dim intRel As Integer = 0
                Do
                    intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                Loop While intRel > 0
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub
    
    End Class
    

    我也会看看转弯 Option Strict On

    将隐式数据类型转换限制为仅扩大转换,不允许后期绑定,并且不允许导致对象类型的隐式类型。

        2
  •  0
  •   Bugs Manjeet    8 年前

    将行变量定义为 Long

    Dim lRow as Long = 1
    
    Do until oSheet.Range("A" & lRow).Value=""
      ' increment the loop variable
      lRow+=1
    Loop
    
    ' display the result in a message block
    MsgBox(lRow-1)