異なるマクロを呼び出す値のハードコーディングを回避するために配列を使用するVBA


1

ワークブックのシート(シート2)の列Dに値があり、その値は数式から導出され、列Cセルの長い値の最終部分のみを取得します。長い値は、ダブルクリックで列Cに自動的に入力されます。別のシート(Sheet5)には、そのシートのC列に値のリストがあります。Sheet2の列Dの値のいずれかがSheet5の列Cの値のいずれかと等しい場合、Sheet2のF列のセルを赤に変更します。Sheet2のF列セルが赤になると、列Dの値に応じて、赤色のセルがクリック可能になり、列Dの値に関連付けられた参照値を一覧表示する別のシートに移動します。以下のコードそれだけです。

   Private Sub Worksheet_Change(ByVal Target As Range)

    Dim c As Range: Set c = Union(Range("D7:D446"), Range("F7:F446"))
    Dim CellF As Range, CellD As Range, Cell As Range

    If Not Application.Intersect(c, Range(Target.Address)) Is Nothing Then

        Set CellF = Range("F" & Target.Row)
        Set CellD = Range("D" & Target.Row)

        If CellF.Value <> "" And getMacroDictionary.Exists(CellD.Text) Then
            CellF.Interior.ColorIndex = 3
        Else
            CellF.Interior.ColorIndex = 0
        End If
    End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim key As String, dic As Object
    Set sourceRange = Nothing
    If Target.Column = 6 And Target.Cells.Count = 1 And Target.Interior.ColorIndex = 3 Then
        Set sourceRange = Target
        Set dic = getMacroDictionary
        key = Target.Offset(0, -2).Value2
        If dic.Exists(key) Then Application.Run dic(key)
    End If

End Sub

Function getMacroDictionary() As Object
    Dim dic As Object
    Set dic = CreateObject("SCripting.Dictionary")
    dic.Add "1000GP", "gotoref1"
    dic.Add "1000MM", "gotoref2"
    dic.Add "19FEST", "gotoref3"
    dic.Add "20IEDU", "gotoref4"
    dic.Add "20ONLC", "gotoref5"
    dic.Add "20PART", "gotoref6"
    dic.Add "20PRDV", "gotoref7"
    dic.Add "20SPPR", "gotoref8"
    dic.Add "22DANC", "gotoref9"
    dic.Add "22LFLC", "gotoref10"
    dic.Add "22MEDA", "gotoref11"
    dic.Add "530CCH", "gotoref12"
    dic.Add "60PUBL", "gotoref13"
    dic.Add "74GA01", "gotoref14"
    dic.Add "74GA17", "gotoref15"
    dic.Add "74GA99", "gotoref16"
    dic.Add "78REDV", "gotoref17"
    Set getMacroDictionary = dic
End Function

ハードコーディングを回避する最善の方法は、配列を作成することだと思いました。最初のサブでは、コメントアウトされたコードのスニペットが表示されますが、それをやろうとしましたが、特定の値に関連付けられているため、さまざまなマクロを呼び出す方法がわかりません。

助けてくれてありがとう!


ワークブック自体の非表示シートに「0GP」、「0MM」、「FEST」などの値を入れて、それを使用してコードを駆動してみませんか?それぞれの隣に、参照コードを配置できます。あなたは、Excelがデータのための場所である、ハードコードデータにする必要はありません
ロブ・セジウィック

@RobSedgwick私はそれを持っています。「0GPのようにリストした各アカウントコードには、多くの潜在的な参照コードがあります。したがって、上記のハードコードした各コードには、多くの参照コードをリストする独自のシートがあります。参照コードはF列のセルに格納されます。目標は、F列のセルを赤に変えて、D列のアカウントコードに参照コードが必要であることを示し、F列のセルが赤になるとクリック可能になり、クリックするとマクロを呼び出して、その値に関連付けられているすべてのアカウントコードを示している非表示のシートへのユーザー。
anve

ワークシートコレクションをループして、すべてのシート名をハードコーディングするのではなく、sheet.Nameを確認できます。私があなたの2番目のサブを理解​​している限り、あなたはその名前のシートに行きたいだけなので、Worksheets(sheet).Activateのようなものがそれをするべきですか?
ロブセジウィック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.