我正在尝试使用 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
十进制值也很好,但不是必需的。我可以使用其他选项,例如忽略最终输出中的格式(真的不可取)或明确要求用户识别类型(但这既不像我想要的那样干净也不自动)。
最佳答案
尝试这个。将其粘贴到模块中。然后,您可以将其用作工作表公式。
我的数据库中有此代码,该代码取自 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
检查小数、科学记数法等
关于vba - 检查范围内的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980484/