2017-08-08 23 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:私は、定義された名前で使用して使用するときに、第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 

データ検証リストの名前は、検証リストのソースにエラーがあることを示しますが、この関数をindexで使用して目的の結果を返すとエラーが発生します。

また、いくつかの画像は、より多くを説明する。しかし、数なし

Target List

を:

Source Range

が、私はテキストが含まれている細胞からのリストを作成し、ここでそれを適用したいです値。

+0

If If IsNumeric(cl.Value)ではなく、cl.Value = "" Thenであることを実際に 'If'ステートメントにしたいと思います。ロジックを括弧で囲まないと、「Not」が個々のステートメントに個別に適用されます。また、最初の行に 'Variant'ではなく' Range'を返します。最後に、何をしようとしていますか?あなたは実際には言っていない。現在のところ、関数は数値以外の値を含むセルの範囲を返します...なぜそれが間違っているか/それ以外に何をしたいのですか? – Wolfie

+0

検証リストが自分のUDFで機能していないため、イメージに表示されるのは行全体の検証であり、数値の値が含まれています。 – Tima

+0

さて、上記のようにロジックを更新しましたか?次に、ドロップダウンで値をクリアして更新していますか?'IsNumeric(" 12,300 ")がfalseを返すようなことはありませんので、あなたのロジックは大丈夫です。それはあなたが失敗している他のコードでなければなりません。 – Wolfie

答えて

1

結果の範囲が複数の列であり、データ検証リストのソースとして使用できないという問題があります。オプションの表の設計を変更して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

これは興味深いですが、実際には、この範囲はデータを作成しようとしているテーブルに隣接していなければなりません検証リストとその行数は同じです。また、テーブルの各行には、「Basic Price-Brand」の範囲内の同じ行にあるブランドのデータ検証リストが含まれています。コードと私のニーズに合わせていくつかの調整を行います。ありがとう – Tima

+1

絶対に、必要な場所で基本価格ブランドの範囲を設定し、Rangeをコード内のその場所にリダイレクトするだけです。助けが必要な場合は教えてください。 –

関連する問題