2017-08-08 123 views
0

我想僅在單元格範圍內根據文本創建數據驗證列表。從範圍獲取文本-VBA(Excel)

我搜索了配方,但我沒有找到任何東西,所以我決定做我自己的功能,但它不工作。

我試圖這些代碼:

代碼1:

Function ListFromRange(rng As Range) As Range 

    Dim cl As Range 
    Dim entry As Range 

    For Each cl In rng 
     If Not IsNumeric(cl.Value) Or cl.Value = "" Then 
      If entry Is Nothing Then 
       Set entry = cl 
      Else 
       Set entry = Union(entry, cl) 
      End If 
     End If 
    Next 

    Set ListFromRange = entry 
End Function 

代碼2:

Function ListFromRange2(rng As Range) As Variant 

    Dim cl As Range 
    Dim i As Integer 
    Dim entry() As String 
    ReDim entry(rng.Count) 

    For Each cl In rng 
     If Not IsNumeric(cl.Value) Or cl.Value = "" Then 
      entry(i) = cl.Value 
      i = i + 1 
     End If 
    Next 

    ListFromRange2 = entry 
End Function 

第二代碼工作,但是當我與定義的名稱,並使用該定義使用數據驗證列表的名稱它告訴我,在驗證列表源中存在錯誤,但是當我使用帶有索引的函數時,它返回所需的結果。

另外一些圖片來解釋更多:

Source Range

我想要從包含文本單元列表,並在應用它:

Target List

但是,如果沒有數量值。

+0

我想你想讓你'如果'語句實際上是'如果不是數字(cl.Value)而不是cl.Value =「」然後'。如果你不包括你的邏輯,那麼'Not'單獨適用於每個語句。在第一行也返回'Range'而不是'Variant'。最後,*你想要做什麼**做***?你其實沒有說過。目前你的函數返回一個包含非數字值的單元格區域......爲什麼這是錯誤的/你還希望它做什麼? – Wolfie

+0

驗證列表對我的UDF不起作用,您在圖像中看到的是對整行的驗證,因此包含數值。 – Tima

+0

好的,你是否按照上面的建議更新了你的邏輯?那你確定你正在清理並更新下拉列表中的值嗎?IsNumeric(「12,300」)沒有辦法返回false,所以你的邏輯沒問題,它必須是你沒有顯示哪個失敗的其他代碼。 – Wolfie

回答

1

問題是結果範圍是多列,不能用作數據驗證列表的來源。如果您不能更改選項表的設計以使其只是一列,則需要找到設置驗證列表的另一種方式。

這是一個使用VBA的解決方案。我把它放在一個可以按需運行的子宏中,但可以將它放到工作表事件中,當工作表上的數據發生變化或發生其他事件時觸發。

這隻會創建驗證列表,直到列A中存在數據爲止。您可能希望將其進一步細化,或者如上所述,將其放入工作表事件中,以便更新添加驗證列表作爲新行。

我按照如下方式設置了我的工作表,但您也可以下載我的示例here

Basic Price

Example

Option Explicit 

Sub Create_Validation_List() 
    Dim rngList As Range, cl As Range 
    Dim rngValidationList As Range 
    Dim strList As String 

    Set rngList = Worksheets("BasicPrice").Range("A2:F3") 
    strList = "" 
    For Each cl In rngList 
     If Not IsNumeric(cl.Value) And Not cl.Value = "" Then strList = strList & "," & cl.Value 'Add to our Validation List 
    Next cl 
    strList = Mid(strList, 2) 'Chop off leading comma 

    'Apply Data Validation to this Range (starting at cell C2 and ending at the last row with data in column A) 
    Set rngValidationList = Range("C2:C" & Cells(Rows.Count, "A").End(xlUp).Row) 

    Application.EnableEvents = False 
    With rngValidationList.Validation 
     .Delete 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:=strList     'Pass in Validation List created above 
     .IgnoreBlank = True 
     .InCellDropdown = True 
     .InputTitle = "" 
     .ErrorTitle = "" 
     .InputMessage = "" 
     .ErrorMessage = "" 
     .ShowInput = True 
     .ShowError = True 
    End With 
    Application.EnableEvents = True 
End Sub 

讓我知道如果您有任何問題。

+0

這很有趣,但我不能將'基本價格 - 品牌'範圍放在另一張表中,實際上這個範圍必須與我試圖製作數據的表格相鄰驗證列表和它們的行數是相同的,同樣,表中的每一行都有一個數據驗證列表,用於「基本價格 - 品牌」範圍內同一行中的品牌,而不是整行範圍內的行,無論如何,我明白了您的觀點代碼並將根據我的需要進行一些調整。謝謝 – Tima

+1

當然,您可以將基本價格品牌範圍放在任何需要的地方,只需將範圍重定向到代碼中的該位置即可。讓我知道你是否需要任何幫助。 –