2011-08-09 52 views
0

我正在VIsusal工作室应用程序上工作。我试图打开excel并读取data.and将excel保存到不同的位置。excel正在被其他用户修改。打开为只读

然后当我打破/结束的applcation并重新运行它说:“Excel是被另一个user.Open修改为只读”

当我去prcoess和使用杀了它“任务管理器”,它的工作原理再次。

所以,我没有通过代码:

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 

它毕竟是抛出了同样的信息“创先争优正被另一个user.Open修改为只读”

请帮什么需要为此做。

+0

你只是想要的东西,使您的调试过程更精简的吧? –

+0

您的问题可能来自Excel的开放部分,并且没有正确关闭(在VBA中,您会将对象设置为“Nothing”)。你能告诉我们这部分代码吗? (虽然我不是.net专家,但它可以帮助) – JMax

回答

1

Excel中自动化的一大问题是,您需要确保每当使用它们时(通过调用ReleaseComObject)关闭每一个引用。

例如,下面的代码将导致Excel保持打开状态:

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

这是因为还有一个来自呼叫遗留拿到范围“A1”的参考。

因此,我建议围绕Excel类编写一个包装程序,以便任何对范围的访问(例如,范围)都可以在访问新范围之前释放以前访问的任何范围。

仅供参考,这里是我用来释放在我写的类COM对象的代码:

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 
相关问题