【问题标题】:Data validation in excel 2007excel 2007 中的数据验证
【发布时间】:2013-01-12 03:13:16
【问题描述】:

我正在尝试限制我的 excel 工作表中某些单元格的输入,如下所示: 1-7,10,12,表示单元格中只能出现数字09和符号-,。我希望以非基于 vba 的数据验证方式理想地处理它,但即使是基于 vba 的解决方案也可以。

编辑 - 有一个关键字是例外,“固定”,如果我看到这个词,它就会被允许。

【问题讨论】:

  • 您是否手动输入值?
  • 是的,用户将手动输入值。我想限制上面的值,以免用户输入错误的值

标签: excel excel-2007 vba


【解决方案1】:

使用Regex对象的VBA版本:我刚刚写了这个函数。您可以在工作表更改事件中简单地调用此函数。 (就像悉达多的使用方式一样)。还有一件事,每次用户输入错误的字符时,该函数都会将它们全部删除:D ...然后,您需要再次注意,以确保此操作发生在您选择的特定范围内..因为否则它可以擦除任何正在更改的单元格!!!鉴于 Siddtharth 为 infinite loops within this `worksheet change event 发布的帖子,我已经编辑了代码以包含该位。

    Option Explicit

    '-- within sheet change event
    Private Sub Worksheet_Change(ByVal Target As Range)
       On Error GoTo Zoo
       Application.EnableEvents = False
       Call NumbersAndCommaDashOnly(Target)

       GetBack:
       Application.EnableEvents = True
       Exit Sub
   Zoo:
       MsgBox Err.Description
       Resume GetBack
    End Sub

Function NumbersAndCommaDashOnly(ByRef rngInput As Range) As String    
Dim objRegex As Object
Dim strInput As String

Set objRegex = CreateObject("VBScript.RegExp")
objRegex.IgnoreCase = True
objRegex.Global = True
objRegex.Pattern = "^[-,0-9]+$|^[Fixed]$"

If Not IsNull(rngInput.Value) Then
    strInput = rngInput.Value
Else
    NumbersAndCommaDash = "Empty Range"
    rngInput.Value = ""
    Exit Function
End If

If objRegex.Test(rngInput.Value) Then
    NumbersAndCommaDash = objRegex.Replace(rngInput, "")
Else
    NumbersAndCommaDash = "No numbers found"
    rngInput.Value = ""
End If

End Function
  • 对于基于 Excel 公式的解决方案,您可以查看此MSDN article

【讨论】:

  • 我需要做一些额外的步骤来创建VBScript.RegExp 对象吗?
  • 顺便说一句,是否可以通过数据验证应用正则表达式?
  • + 1 表示正则表达式 :) 但是请注意 :) stackoverflow.com/questions/13860894/…(第 2 点和第 3 点)
  • 我实际上是在考虑关闭事件和错误处理:)
  • @SiddharthRout 抱歉,伙计回来晚了。是星期五! ;) 谢谢。
【解决方案2】:

这是一个仅适用于单元格 A1 的 VBA 方法。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long

    On Error GoTo Whoa

    Application.EnableEvents = False

    If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Len(Range("A1").Value) <> 0 Then
            For i = 1 To Len(Range("A1").Value)
                Select Case Asc(Mid(Range("A1").Value, i, 1))
                '~~> Check for 0-9, "," and "-"
                Case vbKey0 To vbKey9, 44, 45
                Case Else
                    Range("A1").ClearContents
                    MsgBox "Invalid Value"
                    Exit For
                End Select
            Next
        End If
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

代码位于Sheet1 代码区。

屏幕截图(实际代码)

跟进问题中最近的编辑

换行

If Len(Range("A1").Value) <> 0 Then

If Len(Range("A1").Value) <> 0 And _
UCase(Range("A1").Value) <> "FIXED" Then 

【讨论】:

  • 我刚刚更新了我的问题,我有一个例外“已修复”,因此唯一需要更改的是 If (Len(Range("A1").Value) &lt;&gt; 0 And Range("A1".Value) = "Fixed") Then。对吗?
  • If Len(Range("A1").Value) &lt;&gt; 0 And UCase(Range("A1").Value) &lt;&gt; "FIXED" Then
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多