2013-04-15 82 views
0

我使用Visual Studio 2010 Express编写了一个vb.net程序来打开和操作Excel工作簿。我有MS Office 2010,我的程序在我的电脑上正常工作。当我试图在我妻子的电脑上运行它时......什么都没有。我没有收到任何错误信息。她与我的Office版本相同,但是她拥有Windows XP,而且我拥有Vista,而且她的电脑拥有比我的安全协议更多的安全协议,但是我的其他程序(不导入任何Office命名空间)在她的计算机上运行良好。我的用于Excel的vb.net程序不会在其他计算机上运行

当我看到她的计算机上的任务管理器没有什么应用程序选项卡下,但进程选项卡下,我看到EXCEL.EXE的实例,如果我尝试再次运行程序,在应用程序仍然一无所获,但在进程下的另一个Excel.exe实例。

我试图使用Click-Once技术安装我的程序,并在重建之后安装Release文件夹。

我也试着在2.0,3.0等版本下编译它......没什么。

下面是一些相关的代码:

Public Class CleanUpDataForm 
    Dim m_objExcel As New Excel.Application 
    Dim m_rngRange, m_rngEnd As Excel.Range 
    Dim m_blnEntireRow, m_blnCancel As Boolean 
    Dim m_strRange, m_strSearch, m_strLogFrameCode As String 
    Const c_strCode As String = "log" 
    Friend Const c_intScrollBarWidth As Integer = 30 

Private Sub CleanUpDataForm_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 
    m_objExcel = Nothing 
    Dispose() 
End Sub 

Private Sub tsbOpen_Click(sender As System.Object, e As System.EventArgs) Handles tsbOpen.Click 

    ofdGetWorksheet.Title = "Select Worksheet" 
    ofdGetWorksheet.Filter = "All Excel Files (*.xl*)|*.xl*|(*.xlsx)|*.xlsx|(*.xlsm)|*.xlsm|(*.xlsb)|*.xlsb|(*.xlam)|*.xlam|(*.xltx)|*.xltx|(*.xltm)|*.xltm|(*.xls)|*.xls|(*.xla)|*.xla|(*.xlt)|*.xlt|(*.xlm)|*.xlm|(*.xlw)|*.xlw" 
    ofdGetWorksheet.FileName = "" 
    If ofdGetWorksheet.ShowDialog <> System.Windows.Forms.DialogResult.Cancel Then 
     Me.Text = ofdGetWorksheet.FileName 
     m_objExcel.Workbooks.Open(Me.Text) 
     tsbCopySheet.Enabled = True 
     tsbFindRows.Enabled = True 
     tsbClose.Enabled = True 
     m_objExcel.Visible = True 
    Else 
     Me.Text = "" 
    End If 

    Me.Activate() 

End Sub 

任何想法?

+0

这是不可能的指导或排除故障查看你的代码。 –

+0

听起来像一个DLL可能会丢失,但正如Jusin Satyr所说,如果您不提供代码,我们无法帮助您...... – Sam

回答

0

我相信我也有这个问题,但是这行代码(在你的m_objExcel.visible语句之后)是修复它(从内存中去掉)的东西。你可能想看看

m_objExcel.Windows(1).Visible = True 

的一件事是在InteropServices库Marshal.BindToMoniker方法。我发现这非常有用。如果该文件未打开,则会打开它。如果它已经打开,那么它将使用该实例。像这样...

wb = System.Runtime.InteropServices.Marshal.BindToMoniker(fileName) 'open the file. If the file is already open, then this uses the open file instead of trying to open again 
exApp = wb.Parent 

WB是我的工作簿中的变量,exApp是我的Excel变量。

另一件事;以确保Excel是关闭的,并从任务管理器中删除那些讨厌的进程

Private Sub KillExcel() 
    For Each RunningProcess In Process.GetProcessesByName("Excel") 
     RunningProcess.Kill() 
    Next 
End Sub 
相关问题