Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据给定的数据类型验证输入的单元格值_Vba_Excel_Excel 2007 - Fatal编程技术网

Vba 根据给定的数据类型验证输入的单元格值

Vba 根据给定的数据类型验证输入的单元格值,vba,excel,excel-2007,Vba,Excel,Excel 2007,我使用Excel宏创建新的工作簿,其中包含给定csv文件的数据。其中一列可供用户输入某些属性值。这些值必须适合另一个处理系统接受的数据类型和特定格式,以下是一些示例: 值A:格式为“@”的字符串值 值B:整数值格式为“#” 值C:浮点值格式为“#.##0,0###” 值D:格式为“#.##0,0”的十进制值 现在,我想添加一个验证,以检查键入的输入值是否可以处理或必须更改,例如: 不能在十进制字段中输入字符串值 并非所有数字格式字段都接受负值 如何设置此验证?我对VBA(而不是舒尔)是个

我使用Excel宏创建新的工作簿,其中包含给定csv文件的数据。其中一列可供用户输入某些属性值。这些值必须适合另一个处理系统接受的数据类型和特定格式,以下是一些示例:

  • 值A:格式为“@”的字符串值
  • 值B:整数值格式为“#”
  • 值C:浮点值格式为“#.##0,0###”
  • 值D:格式为“#.##0,0”的十进制值
现在,我想添加一个验证,以检查键入的输入值是否可以处理或必须更改,例如:

  • 不能在十进制字段中输入字符串值
  • 并非所有数字格式字段都接受负值
如何设置此验证?我对VBA(而不是舒尔)是个新手,不知道最好的方法是什么。到目前为止我发现的可能性:

  • 通过Worksheet.Range.validation添加验证,但我不知道如何设置公式1以检查正确的值

  • 关于工作表更改,这里的问题是,我创建的新工作簿显然不包含我在程序代码中编写的工作表更改,因为它是一个新工作簿


  • 那么,最好的方法是什么呢?

    在没有VBA的情况下,您可以在工作簿端进行大量的数据验证。例如,对于值C,您可以将格式(浮点值格式为“#.###0,0####”)设置为该单元格的自定义数字格式,然后应用数据验证以确保只在您想要的范围内输入数字。

    您可以在工作簿端进行大量数据验证,而无需VBA。例如,对于值C,您可以将格式(浮点值格式为“#.####0,0####”)放入该单元格的自定义数字格式中,然后应用数据验证以确保仅在您想要的范围内输入数字。

    使用Worksheet.range.validation不是很节省,因为如果用户从剪贴板粘贴数据,它不会触发

    去换工作表。在此处执行验证并将工作簿另存为模板

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Debug.Assert (Format(Target.Value, "#.##0,0#") = Target.Value)
    End Sub
    
    如果使用此方法,请确保所有单元格都格式化为文本。否则,Target.Value将为您提供一个插值

    然后稍后打开模板并将CV导入其中:

    wb = Application.Workbooks.Add("path-to-template.xslm")
    Application.EnableEvents = false ' You don't want to trigger change events during import
    myimport(wb)
    Application.EnableEvents = true
    
    使用工作表.Range.Validation不是很好的保存方法,因为如果用户从剪贴板粘贴数据,则不会触发该操作

    去换工作表。在此处执行验证并将工作簿另存为模板

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Debug.Assert (Format(Target.Value, "#.##0,0#") = Target.Value)
    End Sub
    
    如果使用此方法,请确保所有单元格都格式化为文本。否则,Target.Value将为您提供一个插值

    然后稍后打开模板并将CV导入其中:

    wb = Application.Workbooks.Add("path-to-template.xslm")
    Application.EnableEvents = false ' You don't want to trigger change events during import
    myimport(wb)
    Application.EnableEvents = true
    

    正则表达式?大概但我不认识任何正则表达式…正则表达式?大概但我不知道任何正则表达式对我来说都很好,我不得不添加一个附加的工作簿\u SheetSelectionChange函数,带有某种信号量来存储原始单元格值,如果它无效,则替换它。谢谢此外:必须通过CStr()转换目标值以进行比较!对我来说效果很好,我不得不添加一个附加的带有某种信号量的工作簿\u SheetSelectionChange函数来存储原始单元格值,以便在无效时替换它。谢谢此外:必须通过CStr()转换目标值以进行比较!