2016-11-10 202 views
2

我有一个用vb.net编写的看起来像这样的Datepicker。GetActiveObject从Excel的工作簿

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的应用低于:

这就是我如何打开vb.net应用在Excel中:

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 

回答

1

通常的方式很可能是通过进程ID,或Application.Hwnd,甚至是危险的ActiveWindow.Caption,但我认为只是完整的外部地址,就足以找到Excel实例。例如在VB中。净(未测试):

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

+0

谢谢。这正是我需要的!并感谢您与Chr(0)的提示。而且我已经对命令行中的空格产生了问题。我只是做了一个搜索和替换的解决方法。 – Moosli

1

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

也许你应该改变:

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

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

至少你会引用当前正在运行的代码的工作簿因为你可能有多个工作簿打开,可以改变ActiveWorkbook当你在他们之间导航时。

HTH)

+0

感谢您的回答。但这不会改变任何事情。我认为这部分的问题:** bjExcel = System.Runtime.InteropServices.Marshal.GetActiveObject(“Excel.Application”)**其中我得到对象 – Moosli

+0

谢谢您的反馈,但我无法帮助您那部分,因为我没有关于特定对象创建代码知识: -/ – RCaetano

+0

我会考虑'Target.Worksheet.Parent.FullName'更可靠的一点点,因为在一些非常罕见的情况下'ThisWorkbook'可能不是什么预期。 – Slai