2016-11-10 203 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