我正在尝试使用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:s
与hh:mm:ss
之间的时间,因此我认为很难正确捕获此值。
当选择时间与其他类型之一时,有没有办法准确确定无需用户干预?确定百分比值与0<x<1
十进制值也很不错,但不是必需的。
我可以使用其他选项,例如忽略最终输出中的格式(真的不可取)或明确要求用户识别类型(但这不是我想要的干净或自动)。 / p>
答案 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
<强>截图强>
您可以进一步修改它以在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