0

我使用 Visual Studio 2010 Express 编写了一个 vb.net 程序来打开和操作 Excel 工作簿。我有 MS Office 2010,我的程序在我的电脑上运行良好。当我尝试在我妻子的电脑上运行它时......什么也没有。我没有收到任何错误消息...什么也没有。她和我有相同版本的 Office,但她有 Windows XP,我有 Vista,她的计算机比我的计算机具有更多的安全协议,但我的另一个程序,它不导入任何 Office 命名空间,在她的计算机上运行良好。

当我查看她计算机上的任务管理器时,“应用程序”选项卡下没有任何内容,但在“进程”选项卡下,我看到了 Excel.exe 的一个实例,如果我再次尝试运行该程序,应用程序下仍然没有任何内容,但还有另一个进程下的 Excel.exe 实例。

我曾尝试使用 Click-Once 技术安装我的程序,并且在 Rebuild 后仅使用 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

有任何想法吗??

4

1 回答 1

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
于 2013-04-15T14:33:56.680 回答