簡體   English   中英

使用數組excel vba的下拉列表

[英]Drop down list using arrays excel vba

我正在嘗試使用單元格來選擇不同的數據(來自數據驗證和選擇列表)。 列表中的數據是從一個數據庫中過濾出來的。

我試圖從數據庫中獲取數據並將其放入一個數組中,然后使用該數組來填充列表。

不知道為什么這不起作用所以任何幫助表示贊賞。

Sub filters()

Dim find As String
Dim array1(50)
Dim i As Integer
Dim j As Integer
Dim k As String

Worksheets("Email Address").Select

find = Worksheets("Sheet1").Range("B2").Value
For i = 2 To 400
k = Worksheets("Email Address").Cells(i, 1)
If k = find Then
    array1(j) = Worksheets("Email Address").Cells(i, 2)

Else

End If
Next i

Worksheets("Sheet1").Select
    Range("G10").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:= _
        array1
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Range("G10").Select

End Sub

我不相信您可以將數組設置為數據驗證列表。 我認為它需要一個逗號分隔的字符串。 您可以使用 Join 函數將您的數組組合成一個逗號分隔的字符串,如

Join(array1, ",")

此外,您的循環似乎沒有正確設置數組,因為“j”從未定義或調整過,因此它可能只是一遍又一遍地設置數組的 0 元素。 Join 將包含空數組元素,因此我們希望數組的大小也恰好符合我們的需要。 您可以定義沒有大小的數組,例如:

Dim array1() as String

然后在循環中根據需要調整數組大小:

j = 0
For i = 2 To 400
k = Worksheets("Email Address").Cells(i, 1)
If k = find Then
    ReDim Preserve array1(j)
    array1(j) = Worksheets("Email Address").Cells(i, 2)
    j = j + 1
End If
Next i

如已接受的答案中所述,Validation.Formula1 屬性不直接接受數組,而 join 函數是解決方案

但是,在生成的逗號分隔字符串中的字符數超過 255 個字符的情況下, Join(array1, ",")不起作用,在這種情況下會發出“應用程序定義或對象定義錯誤”

事實上,數據驗證下拉列表的限制如下:

  1. 如果使用命名范圍(來自工作表上的列表)創建,則最多顯示 32,767 個項目
  2. 如果字符串的長度不超過 255 個字符,包括分隔符,則顯示與逗號分隔的字符串中存在的項目一樣多。

使用數組填充下拉列表的更好解決方案是復制工作表列中的數組並將此復制的范圍轉換為命名范圍並在Formula1屬性中使用它。

Dim rangeToCopyTo As Range
Set rangeToCopyTo = ThisWorkbook.Sheets("Sheet1").Range("A1:A" & UBound(array1)) 
rangeToCopyTo = Application.Transpose(array1)
Names.Add "List1", rangeToCopyTo

Worksheets("Sheet1").Select
Range("G10").Select
With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=List1"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
Range("G10").Select

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM