检查数据类型的范围(Checking Data Types in a Range)

2019-10-17 23:58发布

我试图验证在用户选择的范围内的所有单元的数据类型相同,采用了VBA功能。 我有以下代码(简化),它适用于大部分:

Dim vTempRange As Variant
Dim vCell As Variant

    vTempRange = DataRange.Value

    For Each vCell In vTempRange
        If Len(vCell) > 0 Then
            'Use TypeName(vCell)
            'Complete validation here
        End If
    Next vCell

有时,用户可以选择百分比的列,有时十进制值的列,有时一个时间值(不与日期相关联)。 VBA似乎看到所有这三个作为Double ,这在技术上是不是不正确。 的问题是,选择的格式将被用作最终的输出的一部分,所以12:00:00应显示为这样的,而不是0.50 ,这是目前的情况。

我看着结合使用是这样的:

Dim vCell As Variant

    For Each vCell In DataRange
        If Len(vCell) > 0 Then
            'Use vCell.NumberFormat
            'Complete validation here
        End If
    Next vCell

NumberFormat并不一致。 例如,用户可以具有百分之所列0%0.000%或时间作为h:m:shh:mm:ss ,所以把它看作是难以正确地捕获此值。

有没有一种方法,无需用户干预 ,以准确地确定在选择时间与其他类型的呢? 确定百分比值与一个0<x<1十进制值也将是很好的,但不是必需的。

我已经在我手上其他选项,如忽略了最终的输出格式(实在不可取的)或明确要求用户识别的类型(但这是既不干净也不是自动的,我想)。

Answer 1:

尝试这个。 在模块中粘贴此。 然后,您可以使用它作为一个工作表公式。

我在我的数据库,从拿起这个代码在这里 ,我修改,以满足您的需求。

Public Function CellType(c)
    Application.Volatile
    Select Case True
        Case IsEmpty(c): CellType = "Blank"
        Case Application.IsText(c): CellType = "Text"
        Case Application.IsLogical(c): CellType = "Logical"
        Case Application.IsErr(c): CellType = "Error"
        Case IsDate(c): CellType = "Date"
        Case InStr(1, c.Text, ":") <> 0: CellType = "Time"
        Case InStr(1, c.Text, "%") <> 0: CellType = "Percentage"
        Case IsNumeric(c): CellType = "Value"
    End Select
End Function

截图

您可以进一步修改,添加一个IF内条款Case IsNumeric(c): CellType = "Value"来检查小数,科学记数法等使用INSTR



Answer 2:

声明vCell as Range ,然后做你的检查:

TypeName(vCell.Value)

这将准确地抓住你的日期。

您可能需要添加一些的if / then逻辑捕捉“百分比”,因为这些都是翻番式的价值观-在“%”的部分仅仅是单元格的格式,所以你可以只检查Right(vCell.NumberFormat,1) = "%"



文章来源: Checking Data Types in a Range