2015-08-21 29 views
1

我有我的自定義函數在Excel(VBA),但我試圖做類似的細胞功能內的列表:VBA定製Excel函數與下拉列表

嘗試在Excel中:

= CELL(資訊類型[然後在這裏出現的下拉列表]

所以,我想:

= MyFunction的(my_variable [這裏我的自定義下拉列表]

列表應該出現在Excel中,而不是在VBA窗口。

有誰知道如何做到這一點?

對不起,我不能發佈圖片。

+0

[VBA函數參數列表選擇](http://stackoverflow.com/questions/5340002/vba-function-argument-list-select) –

+0

的可能的重複看看那裏的鏈接;似乎有你在找什麼。 –

+0

它密切是什麼,我正在尋找,但名單應在Excel中,而不是在VBA窗口。如果您有Excel,打開它,並鍵入「= CELL(」,然後你會看到該列表。我以前讀該職位的時刻。 – dsegovia

回答

0

這是可能的工作笨重的方法。我們的想法是使用Worksheet_Change事件捕捉,你進入你的函數的不完整版本的實例在哪個階段顯示在單元格爲您提供可能的方式來完成功能的開即時數據驗證下拉列表。然後,再次使用Worksheet_Change,檢測完成的版本,轉換爲公式,並刪除數據驗證。

由於概念證明 - 我寫了一個版本的sin它允許用戶選擇「度」或「弧度」:

Function Sine(ParamArray args() As Variant) As Variant 
    On Error GoTo err_handler 
    If args(1) = "Degrees" Then 
     Sine = Sin(args(0) * Application.WorksheetFunction.Pi()/180) 
    Else 
     Sine = Sin(args(0)) 
    End If 
    Exit Function 
err_handler: 
    Sine = "=Sine(" & args(0) & "," 
End Function 

此,如果用戶沒有在拋出一個未捕獲錯誤至少給一個角度。

然後,在Worksheet_Change我用:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim choices As String, angle As String, tval As String 

    On Error GoTo err_handler 
    tval = Target.Value 
    If tval Like "=Sine(*," Then 
     angle = Mid(tval, 7) 
     angle = Left(angle, Len(angle) - 1) 'get rid of comma 
     choices = angle & " Degrees, " & angle & " Radians" 
     Target.Validation.Add xlValidateList, Formula1:=choices 
     Target.Select 
    ElseIf tval Like "* Degrees" Then 
     Target.Validation.Delete 
     Target.Formula = "=Sine(" & Val(tval) & ", ""Degrees"")" 
     Target.Offset(1).Select 
    ElseIf tval Like "* Radians" Then 
     Target.Validation.Delete 
     Target.Formula = "=Sine(" & Val(tval) & ", ""Radians"")" 
     Target.Offset(1).Select 
    End If 
err_handler: 
End Sub 

它的工作原理是這樣的。在A1(比如說)輸入=Sine(45並回車。您將看到以下內容(點擊下拉箭頭後):

enter image description here

然後,例如選擇後「45度」,在A1中的公式變爲

=sine(45, "Degrees") 

並顯示值(0.707107),和數據驗證已被刪除。

的想法,可能是更靈活的變化是由單元格中顯示一個窗體,而不是依賴此數據驗證破解。

+0

它 - 是 - 太棒了! – dsegovia