多种格式的小数位

Decimal places for multiple formats

我正在尝试找到一种方法来为选定范围(一个或多个可能具有多种不同格式的单元格)设置 increase/decrease 个小数位。

目前我的代码如下:

Dim myformat As String
Dim cell As Range
Dim val As Variant

For Each cell In Selection
    val = cell.Value
    myformat = cell.NumberFormat

    If IsDate(val) = False Then
        If InStr(1, myformat, ".") > 0 Then
            myformat = myformat & "0"
        Else
            myformat = "0.0"
        End If
    End If
        cell.NumberFormat = myformat
Next cell

总的来说,它有效,但不是全部。我需要它做的是处理百分比、一般、数字格式以及公式(不是直接输入单元格值)和自定义格式(无论我多么努力,我都无法绕过它......)。 当代码看到该单元格包含 time/date 格式(我设法做到了)时,代码不应该工作(应该退出 sub 或什么都不做)。

您将在下面找到我正在开发宏的格式类型:

如您所见,我的编码方式(我正在努力学习)是通过读取现有格式并根据需要更改它来简单地编辑 NumberFormat。这适用于简单格式,但与自定义格式结合使用时呢?就是不行。

有没有人知道我该如何继续我的想法?任何帮助深表感谢! 提前感谢任何愿意帮助我的人。随着每一天的过去,我的 VBA 越来越好,但还没有那么好 ;)

对于已经包含小数点的自定义格式,而不是:

myformat = myformat & "0"

使用会比较靠谱:

myformat = replace(myformat,".",".0")

这将确保在所有小数点后添加一个额外的 0,包括具有多个部分的自定义数字格式,例如:

#,##0.00;[Red]-#,##0.00

在没有小数点的数字上加上小数点,而不是:

myformat = "0.0"

使用:

myformat = replace(myformat,"0","0.0")

请注意,它仍然不会处理所有可能的自定义数字格式,这需要大量的解析,但它应该按照您的示例处理标准类型的格式。

要删除小数点,执行相反的操作:

myformat = replace(myformat,".0",".")

这会在删除所有零后留下小数点,但是这可以通过检查数字格式是否包含后面没有跟零的小数点来处理:

If InStr(myformat, ".") > 0 and InStr(myformat, ".0") = 0 then
    myformat = replace(myformat,".","")
End if