Excel工作簿

时间:2016-11-10 09:58:58

标签: vb.net excel-vba vba excel

我有一个用vb.net编写的Datepicker,看起来像这样。

enter image description here

我必须这样做,因为我们有一些安全设置。因此,Excel中的Build in Datepicker有时会生成错误。

如果仅打开一个Excel应用程序,则日期选择器可以正常工作。当打开多个Excel应用程序时,问题就会出现。

enter image description here

代码只采用第一个Excel应用程序,但我想获得名为“测试”的Excel工作簿。

我认为问题在于这句话:

objExcel = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")

为了更好地理解Excel中的代码和DatePicker应用程序如下:

这就是我在Excel中打开vb.net应用程序的方式:

Set wsh = VBA.CreateObject("WScript.Shell")
arg = ActiveWorkbook.Path & ";" & ActiveWorkbook.Name & ";" & ActiveSheet.Name & ";" & Target.Address
' Wait for the shelled application to finish:
errorCode = wsh.Run(strPathDatePicker & " " & arg, windowStyle, waitOnReturn)

DatePciker的代码是:

Public Sub frmDatePicker_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim Par() As String
    Dim strTemp As String

    Try
        Dim arg = Environment.GetCommandLineArgs
        strTemp = arg(1) 
        Par = Split(strTemp, ";")

        'Split arg, to get the Information from the Excel Workbook
        strWbPath = Par(0)
        strWbName = Par(1)            
        strWsName = Par(2)            
        strAdresse = Par(3)            

    Catch ex As Exception            
        Me.Close()
    End Try
End Sub

如果您现在点击日期,vb.net应用程序将运行此代码以将所选日期插入Excel:

Private Sub MonthCalendar1_DateSelected(sender As Object, e As DateRangeEventArgs) Handles MonthCalendar1.DateSelected        
    Dim objExcel As Excel.Application
    Dim wb As Excel.Workbook
    Dim ws As Excel.Worksheet

    Try
        'Get the Excel Object
        objExcel = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")


        For Each wb In objExcel.Workbooks
            If wb.Name = strWbName Then
                ws = wb.Sheets(strWsName)
                ws.Range(strAdresse.ToString).Value = e.Start()
                Me.Close()
            End If

        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Me.Close()
    End Try

End Sub

2 个答案:

答案 0 :(得分:1)

注意: 这不是解决方案,但我在此处发布以避免评论中的长代码(以提高可读性)。我将在此留下这个答案,因为OP对此答案的评论提供了有关他的问题的更多信息。

也许你应该改变:

arg = ActiveWorkbook.Path & ";" & ActiveWorkbook.Name & ";" & ActiveSheet.Name & ";" & Target.Address

arg = ThisWorkbook.Path & ";" & ThisWorkbook.Name & ";" & ActiveSheet.Name & ";" & Target.Address

至少您正在引用当前正在运行代码的工作簿,因为您可能打开了多个工作簿,这些工作簿可能会在您在它们之间导航时更改ActiveWorkbook

HTH;)

答案 1 :(得分:1)

通常的方法可能是传递流程ID,Application.Hwnd,甚至是风险ActiveWindow.Caption,但我认为只需完整的外部地址即可找到Excel实例。例如在VB.Net(未测试)中:

Dim o As Object = GetObject("Book 1.xls")
Dim wb As Excel.Workbook = TryCast(o, Excel.Workbook)

请注意,;是文件,工作簿,工作表和命名范围名称中的有效字符,因此我建议您查找其他分隔符。例如,Chr(0)等不可打印的字符可能有用,或者只使用完整的外部地址Target.Address(,,,1)

如果参数包含空格且未被Environment.GetCommandLineArgs(1)包围,则

"会导致问题:https://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs