【问题标题】:Excel Macro for data validation modification用于数据验证修改的 Excel 宏
【发布时间】:2017-05-12 04:46:54
【问题描述】:

在单元格 A5 中,填充了列表验证(Cat A、Cat B 和 Cat C)。当用户选择类别 A 时,单元格 C5 将由一个公式填充,该公式告诉用户填写单元格。一旦用户转到单元格 C5,就没有公式,只有下拉列表或列表验证(是或否)。

如果用户随后返回单元格 A5 并选择类别 C,则单元格 C5 将填充原始公式,该公式将用户再次输入单元格。用户转到单元格 C5 后,再次没有公式,只有下拉列表或列表验证(是/否)

是否可以为此编写一个简单的宏?请问有人吗?太感谢了。

我想我知道怎么做,但需要更多想法。

【问题讨论】:

  • 我添加了一个[excel-vba]标签,否则没人会看到问题。但是,在人们尝试提供帮助之前,他们会希望看到您说您认为可行的代码。
  • 我会说不可能为此编写 simple 宏,但使用 VBA 绝对可以。您需要使用 worksheet_change 和 worksheet_selectionchange 事件来响应用户的操作。

标签: list excel filter vba


【解决方案1】:

这是非常简单的代码,但如果您以前没有编写过 VBA,则不容易弄清楚。它将需要两个子例程。在您的 VBE 中,双击您希望它存在的“项目 - VBAProject”窗格中的工作表。我正在为选项卡“Sheet1”中的工作簿“Book1.xls”构建

我们将使用基于工作表事件的子程序。事件是发生在前端的事情(比如选择一个单元格),在 VBA 中触发代码。

  1. SelectionChange - 只要用户更改单元格/范围选择,就会触发此工作表事件。我们将使用它来检测用户是否切换到单元格 C5

  2. 更改 - 当有人更改单元格的值时会触发此工作表事件。我们用它来查看A5是否改变了

在 VBE 的代码编辑器窗格中,放置以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)     
    'This subroutine fires when a cell value changes in this worksheet.

    'did someone change something specifically in cell A5?
    If Not Intersect(Target, Sheet1.Range("A5")) Is Nothing Then

        'Is the value A or C?
        If Sheet1.Range("A5").Value = "A" Or Sheet1.Range("A5").Value = "C" Then
            'Remove any data validation for this cell:
            Sheet1.Range("C5").Validation.Delete

            'and change the value of C5 to "Fill in this cell"
            Sheet1.Range("C5").Value = "Fill in this cell"

        End If
    End If              
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'This subroutine fires when a user selects a different cell or range.
    'So... it fires ALL The time so the next line is super important.

    'Did someone change selection specifically to cell C5?
    If Not Intersect(Target, Sheet1.Range("C5")) Is Nothing Then

        'Is the value currently "Fill in this cell"?
        If Sheet1.Range("C5").Value = "Fill in this cell" Then

            'Empty the cell
            Sheet1.Range("C5").Value = ""

            'Add data validation to some list somewhere
            With Sheet1.Range("C5").Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="=$J$1:$J$4"  'This the range that the list exists in
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        End If
    End If
End Sub

我已经注意到 cmets 的重要内容。您可能需要稍微调整一下才能满足您的需求。最值得注意的是单元格验证代码。目前 C5 的数据验证设置为J1:J4。更改它以满足您的需求。

【讨论】:

  • 非常感谢。这很有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多