0

私は7つの動的依存リストを使用していますが、プロセスを自動化し、リストを変更した場合に将来何も配置しないようにするための最良の方法はVBAコードであると考えました。

私が作業を開始したVBAコードは、次のサイトに掲載されています:VBAの個別のワークシートの動的依存リスト

そのコードは、最初の2つのリスト専用です。

それが私が持っているメインテーブルです。黄色の列のみの最初の行の選択リストが必要です。

ここに画像の説明を入力してください

それは私がリストを持っているテーブルです(それらは動的でなければなりません):

ここに画像の説明を入力してください

私のリスト間の関係は次のとおりです。

  • 責任者リストとサイトリストはプロジェクトリストに関連しています。
  • 他のリストはサイトリストに関連しています。
4

1 に答える 1

0

わかった。私はあなたが探しているものを持っています。私はこの問題を数か月前に別のプロジェクトで解決しました。基本的に、間接は動的な名前付き範囲では機能しないため、ここでは適切ではありません。実際の結果は生成されず、数式参照のみが生成されるためです。

まず、このようにシートに名前付き範囲を設定します。名前付き範囲に名前を付けることは、私が説明した方法で行うことが非常に重要です。これにより、動的リストを作成するためのコードが提供されます。また、私はX1とT2のSamplePointsのみを書き出したことに注意してください。他のオプションを選択した場合、それらの名前付き範囲をに追加するまで、コードは機能しません。

Dnyamic名前付き範囲

次に、入力シートが次のように設定されていると仮定します。

入力シート

このコードを入力シートのワークシート変更イベントに配置します。1つのセルで選択された値を取得し、適切な列名を追加してそのリストにフィードします。したがって、プロジェクトAが選択され、プロジェクトAの責任者を選択する場合は、Range( "B(現在の行)"の検証がA_Responsibleに設定され、そのリストが提供されます。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim wks As Worksheet
Dim strName As String, strFormula
Dim rng As Range

Set wks = ActiveSheet

With wks

    If Target.Row = 1 Then Exit Sub

    Select Case Target.Column

        Case Is = .Rows(1).Find("Project", lookat:=xlWhole).Column

            Set rng = Target.Offset(, 1)

            strName = Target.Value
            strFormula = "=" & Replace(strName, " ", "_") & "_Responsible"

            AddValidation rng, 1, strFormula

            'add any more cells that would need validation based on project selection here.

        Case Is = .Rows(1).Find("Responsible", lookat:=xlWhole).Column

            Set rng = Target.Offset(, 1)

            strName = Target.Value
            strFormula = "=" & Replace(strName, " ", "_") & "_SamplePoint"

            AddValidation rng, 1, strFormula

            'add any more cells that would need validation based on responsible selection here.

        'Case Is = add any more dependenices here ... and continue with cases for each one

    End Select

End With

この関数は、ワークブックのどこかにある標準モジュールでも必要になります。

Function AddValidation(ByVal rng As Range, ByVal iOperator As Integer, _
    ByVal sFormula1 As String, Optional iXlDVType As Integer = 3, _
    Optional iAlertStyle As Integer = 1, Optional sFormula2 As String, _
    Optional bIgnoreBlank As Boolean = True, Optional bInCellDropDown As Boolean = True, _
    Optional sInputTitle As String, Optional sErrorTitle As String, _
    Optional sInputMessage As String, Optional sErrorMessage As String, _
    Optional bShowInput As Boolean = True, Optional bShowError As Boolean = True)

'==============================================
'Enumaration for ease of use
'XlDVType
'Name Value Description
'xlValidateCustom 7 Data is validated using an arbitrary formula.
'xlValidateDate 4 Date values.
'xlValidateDecimal 2 Numeric values.
'xlValidateInputOnly 0 Validate only when user changes the value.
'xlValidateList 3 Value must be present in a specified list.
'xlValidateTextLength 6 Length of text.
'xlValidateTime 5 Time values.
'xlValidateWholeNumber 1 Whole numeric values.

'AlertStyle
'xlValidAlertInformation 3 Information icon.
'xlValidAlertStop 1 Stop icon.
'xlValidAlertWarning 2 Warning icon.

'Operator
'xlBetween 1 Between. Can be used only if two formulas are provided.
'xlEqual 3 Equal.
'xlGreater 5 Greater than.
'xlGreaterEqual 7 Greater than or equal to.
'xlLess 6 Less than.
'xlLessEqual 8 Less than or equal to.
'xlNotBetween 2 Not between. Can be used only if two formulas are provided.
'xlNotEqual 4 Not equal.
'==============================================

With rng.Validation
    .Delete ' delete any existing validation before adding new one
    .Add Type:=iXlDVType, AlertStyle:=iAlertStyle, Operator:=iOperator, Formula1:=sFormula1, Formula2:=sFormula2
    .IgnoreBlank = bIgnoreBlank
    .InCellDropdown = bInCellDropDown
    .InputTitle = sInputTitle
    .ErrorTitle = sErrorTitle
    .InputMessage = sInputMessage
    .ErrorMessage = sErrorMessage
    .ShowInput = bShowInput
    .ShowError = bShowError
End With


End Function
于 2012-05-16T14:22:59.250 に答える