1

我正在尝试使用 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%vs.0.000%或时间列为h:m:svs. hh:mm:ss,因此我认为很难正确捕获此值。

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

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

4

3 回答 3

3

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

我的数据库中有这段代码,它是从这里获取的,我对其进行了修改以满足您的需要。

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

于 2013-04-12T20:52:28.340 回答
2

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

TypeName(vCell.Value)

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

您可能需要添加一些 if/then 逻辑来捕获“百分比”,因为这些是双精度类型的值——“%”部分只是单元格格式,因此您可以只检查Right(vCell.NumberFormat,1) = "%".

于 2013-04-12T20:49:11.777 回答
1

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

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

Ex1:用来写如果。

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
于 2019-11-14T12:50:42.557 回答