EXCEL VBA:根据值范围格式化现有数字单元格

Posted

技术标签:

【中文标题】EXCEL VBA:根据值范围格式化现有数字单元格【英文标题】:EXCEL VBA: Format existing numeric cells based on value range 【发布时间】:2018-08-10 16:42:37 【问题描述】:

我正在尝试在某些列(例如:M、N、U、V...)上运行 VBA,以根据它们的范围设置值的格式。

我目前有:

    Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("U:W")) Is Nothing Then
    If Target.Value < -1000000 Then
        Target.NumberFormat = "#,###.0,, ""M"""
    ElseIf Target.Value <= -1000 Then
        Target.NumberFormat = "#,###.0, ""K"""
    ElseIf Target.Value < 1000 Then
        Target.NumberFormat = "### """""
    ElseIf Target.Value < 1000000 Then
        Target.NumberFormat = "#,###.0, ""K"""
    ElseIf Target.Value < 1000000000 Then
      Target.NumberFormat = "#,###.0,, ""M"""
    ElseIf Target.Value < 1000000000000# Then
      Target.NumberFormat = "#,###.0,,, ""B"""

    End If
  End If
End Sub

很遗憾,这不适用于已输入的值。但是,如果我单击每个单元格然后按回车键,则格式正确。

问题:我将如何格式化已经存在的值?

谢谢

【问题讨论】:

【参考方案1】:

看起来Target 只是改变的范围: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/worksheet-change-event-excel

您可能必须编写一个循环遍历其他数据的子程序,或者只需“编辑”一次单元格,然后宏将继续工作。

编辑:

如何遍历列并调用你的函数?:

Sub OneTimeLoop()
    Dim rng as Range, cell as Range

    set rng = Range("U:V")

    For Each cell in rng
        Worksheet_Change cell
    Next cell
End Sub

【讨论】:

有没有办法在每个单元格中放置一个“硬返回”,以便当前宏运行?或者,它有更好的工作方式?我在工作表中有很多值。 @ETedford 我添加了一个子程序,它将为列中的每个单元格调用您的函数。 警告它需要很长时间才能运行,所以你只需要运行一次,可能会限制更多的范围。即Range("U1:V1000")【参考方案2】:

我认为,您需要Precedents 属性,它将检索当前单元格所依赖的所有单元格。

说,你有:

    在 A1 单元格中:1 在 A2 单元格中:=A1+1

那么下面的代码就会显示$A$1

Sub F()
    MsgBox Range("A2").Precedents(1).Address
End Sub

【讨论】:

以上是关于EXCEL VBA:根据值范围格式化现有数字单元格的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL VBA - 根据单元格范围和字符串创建动态下拉列表[关闭]

excel用vba自动提取某个ini文件中的数字到制定单元格

Excel vba 将数字转换成字符串的函数是哪个

EXCEL根据单元格名称改变后自杀,求VBA代码!

如何使用 vba 在 Excel 2007 中找到条件格式单元格的填充颜色值?

Excel中怎样通过vba快速标注哪些单元格的数据发生变化?