2016-02-04 111 views
1

我正在嘗試使用vba代碼創建數據驗證列表。該數組根據許多變量生成自身。使用vba數組驗證列表

這裏是我使用

  For iter4 = 2 To nbWsheet 

      If Wsheet.Cells(iter4, 2) = Cat And Wsheet.Cells(iter4, ColMod) = "x" And Wsheet.Cells(iter4, ColStd) = "oui" Then 

       TableValue = Wsheet.Cells(iter4, 4).Value & " - " & Wsheet.Cells(iter4, 7).Value 
       Table = Table & "," & TableValue 

      End If 

     Next iter4 

     'Ajout de la list 
     With Cells(iGlob, 5).Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
      xlBetween, Formula1:=Table 
      .IgnoreBlank = True 
      .InCellDropdown = True 
      .InputTitle = "" 
      .ErrorTitle = "" 
      .InputMessage = "" 
      .ErrorMessage = "" 
      .ShowInput = "" 
      .ShowError = "" 
     End With 

這段代碼的問題的代碼,是在表中的文本包含「」。當生成的數據驗證列表,每次都看到「」它把文本在新行...

有沒有一種方法,以保持「」表

爲例內我想顯示:123456 - 發動機,300馬力

希望我是清楚的,

感謝,

+0

你幾乎清楚...但你能顯示你嘗試使用的數據嗎?可能是一個截圖。 –

+0

我知道這樣做的唯一方法是將您的列表輸出到一個單元格區域,然後設置Formula1以引用該單元格區域。您可以隱藏單元格,或將其放入隱藏的工作表中。 – tigeravatar

+0

查看[這裏](http://stackoverflow.com/questions/30724178/create-data-validation-list-when-some-of-the-values-have-commas)爲同一個問題和一些創新的答案。 – tigeravatar

回答

0

替換 「」 與CHR(44)。 Chr函數返回一個基於VBA字符代碼的字符串。我發現它也派上用場,當你想插入一個雙引號(Chr(34)的雙引號)。

+0

這仍然會導致被問到相同的問題。OP的數據需要在下拉列表的單行中,但該數據包含一個逗號(例如:'123456 - Engine,300HP')。但是,逗號會導致驗證列表將條目拆分爲兩個('123456 - Engine'和'300HP',當它應該是單個條目時,用'Chr(44)'替換逗號將導致同樣的問題。這不會回答或解決問題。 – tigeravatar

2

我不認爲有自定義列表中逗號的轉義字符。根據MSDN Validation.Add,逗號總是分隔條目。

一種解決方法是使用動態命名範圍。

  1. 在隱藏工作表中使用備用列或某個地方,讓使用列用於演示
  2. 在A1,放在 「DV_ListTable」,名稱爲DV_ListTable
  3. 選中A列定義單元格,把它定義爲DV_ListColumn
  4. 定義使用名稱管理器作爲DV_List與引用關聯另一名
    =OFFSET(DV_ListTable,1,0,IF(COUNTA(DV_ListColumn)-1=0,1,COUNTA(DV_ListColumn)-1))
    ResultingNameManager

現在數據有效性將(細胞D1):
DV

然後宏改變該動態範圍的內容將是:

Option Explicit 

Sub ChangeDataValidationList() 
    Dim i As Long, Table As String, TableValue As String 
    Dim oRng As Range, oValues As Variant 

    With ThisWorkbook 
     ' Build up the new table list 
     Table = .Names("DV_ListTable").RefersToRange.Value ' Header 
     ' For Demo, the data is from Columns next to the DV_ListTable 
     Set oRng = .Names("DV_ListTable").RefersToRange.Offset(0, 1) 
     Do Until IsEmpty(oRng) 
      TableValue = oRng.Value & " - " & oRng.Offset(0, 1).Value 
      Table = Table & vbCrLf & TableValue 
      Set oRng = oRng.Offset(1, 0) 
     Loop 
     Set oRng = Nothing 
     ' Clear the contents in the column 
     .Names("DV_ListColumn").RefersToRange.ClearContents 
     ' Paste in the values separated by vbCrLf 
     oValues = Application.Transpose(Split(Table, vbCrLf)) 
     .Names("DV_ListTable").RefersToRange.Resize(UBound(oValues)) = oValues 
     Set oValues = Nothing 
    End With 
End Sub 

樣本屏幕截圖 「ChangeDataValisationList」 後執行:
screenshot

希望這可以幫助你在正確的工作方向。