我有一个用vb.net编写的Datepicker,看起来像这样。
我必须这样做,因为我们有一些安全设置。因此,Excel中的Build in Datepicker有时会生成错误。
如果仅打开一个Excel应用程序,则日期选择器可以正常工作。当打开多个Excel应用程序时,问题就会出现。
代码只采用第一个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
答案 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