检查范围中的数据类型

时间:2013-04-12 20:40:04

标签: excel vba excel-vba excel-2010

我正在尝试使用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十进制值也很不错,但不是必需的。

我可以使用其他选项,例如忽略最终输出中的格式(真的不可取)或明确要求用户识别类型(但这不是我想要的干净或自动)。 / p>

3 个答案:

答案 0 :(得分:3)

试试这个。将其粘贴到模块中。然后,您可以将其用作工作表公式。

我的数据库中有这个代码,是从here获取的,我根据您的需要对其进行了修改。

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

<强>截图

enter image description here

您可以进一步修改它以在IF内添加Case IsNumeric(c): CellType = "Value"子句以使用INSTR

检查小数,科学记数法等

答案 1 :(得分:1)

声明vCell as Range,然后进行检查:

TypeName(vCell.Value)

这将准确地捕捉你的日期。

你可能需要添加一些if / then逻辑来捕获“百分比”,因为这些是双类型值 - “%”部分仅仅是单元格格式化,所以你可以只检查{{1 }。

答案 2 :(得分:0)

VarType功能 返回一个整数,指示变量的子类型或对象的默认属性的类型。

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function

Ex1:用来写if。

Function DataType(x As Variant) As String
  If VarType(x) = vbDate Then
    DataType = "Date"
  ElseIf VarType(x) = vbString Then
    DataType = "String"
  '.....
  End If
End Function

Ex2:连接具有值的范围内的单元格。

Function ConcatenateRange(cellRange As Range) As String
      Dim cel As Range, temp As String
      temp = ""
      For Each cel In cellRange
    'use VarType to check if the cell is empty.
    'if the cell is not empty concatinate it.

        If VarType(cel) <> vbEmpty Then 
             temp = temp & cel
    End If
      Next
      ConcatenateRange = temp
End Function