开发者

excel is being modified by another user.Open as readonly

开发者 https://www.devze.com 2023-03-26 16:26 出处:网络
I am working on VIsusal studio application. I am trying to open excel and read the 开发者_StackOverflow社区data.and save the excel to different location.

I am working on VIsusal studio application. I am trying to open excel and read the 开发者_StackOverflow社区data.and save the excel to different location.

Then when i break/end the applcation and re-run it says "excel is being modified by another user.Open as readonly "

When i go to prcoess and kill it using "Task Manager" it works again.

So i did through code:

Private Sub releaseObject(ByVal obj As Object)
    Try
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
        obj = Nothing

        Dim proc As System.Diagnostics.Process
        For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
            proc.Kill()
        Next
    Catch ex As Exception
        obj = Nothing
    Finally
        GC.Collect()
    End Try
End Sub

Still it is throwing the same message "excel is being modified by another user.Open as readonly "

PLease help what need to be done for this.


The big problem with automation in Excel is that you need to ensure you close every single reference whenever you use them (by calling ReleaseComObject on it).

For example, the following code will cause Excel to stay open:

var range;
range = excelApplication.Range("A1");
range = excelApplication.Range("A2");
System.Runtime.InteropServices.Marshal.ReleaseComObject(range)
range = Nothing

This is because there is still a reference left over from the call to get range "A1".

Therefore, I would recommend writing a wrapper around the Excel class so that any access to, e.g., a range frees any previous ranges accessed before accessing the new range.

For reference, here is the code I used to release COM objects in the class I wrote:

Private Sub ReleaseComObject(ByVal o As Object)
    Try
        If Not IsNothing(o) Then
            While System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0
                'Wait for COM object to be released.'
            End While
        End If
        o = Nothing
    Catch exc As System.Runtime.InteropServices.COMException
        LogError(exc) ' Suppress errors thrown here '
    End Try
End Sub
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号