VBA用于替换格式但保留单元格值:部分解决

时间:2016-07-07 16:54:07

标签: excel vba excel-vba

我正在尝试将VBA放在一起搜索特定的单元格格式,然后更改该单元格格式。我从这篇文章(Excel VBA value remains string format after replacment)中获得了灵感,并希望从这篇文章中得到更多信息(Excel VBA - add a custom number format)但是不能做到这一点。

我想要替换的单元格格式是格式化的一般,有以下6种类型:

  1. < 0
  2. < 0.1
  3. < 0.01
  4. < 0.001
  5. < 0.0001
  6. < 0.00001
  7. 我想用正确的数字格式替换它们("< 0","< 0.0"等)并删除文字符号"< ;"这样它们就显示为"< 0"但存储为数字以供计算使用。

    到目前为止我的方法是VBA替换功能。对于给定的范围,我一直尝试为6种不同的格式运行6种不同的替换,然后删除"<"的所有文本符号,但我仍然坚持用它自己的值替换单元格值:当前所有单元格都替换为相同的值(范围中第一个单元格的值)。

    到目前为止我开发的代码是:

    Private Sub CommandButton6_Click()
    
    Dim range1 As Range
    
    With ActiveWorkbook.Worksheets("Sheet1")
        Set range1 = .[B2:B7]
    End With
    
    For Each cell In range1.Cells
        Dim Original0value As String
        Original0value = cell.Value
        Application.findformat.NumberFormat = "General"
        Application.ReplaceFormat.NumberFormat = "< 0"
        With range1
            .Replace What:="< ?", Replacement:=Original0value, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchFormat:=True, ReplaceFormat:=True
        End With
    Next cell
    
    For Each cell In range1.Cells
        Dim Original1value As String
        Original1value = cell.Value
        Application.findformat.NumberFormat = "General"
        Application.ReplaceFormat.NumberFormat = "< 0.0"
        With range1
            .Replace What:="< ???", Replacement:=Original1value, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchFormat:=True, ReplaceFormat:=True
        End With
    Next cell
    
    For Each cell In range1.Cells
        Dim Original2value As String
        Original2value = cell.Value
        Application.findformat.NumberFormat = "General"
        Application.ReplaceFormat.NumberFormat = "< 0.00"
        With range1
            .Replace What:="< ????", Replacement:=Original2value, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchFormat:=True, ReplaceFormat:=True
        End With
    Next cell
    
    ' et cetera - I have only include the first 3 blocks of a possible 6
    
        Cells.Replace What:="<", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    End Sub
    

    这给了我结果:

    1. &LT; 0
    2. &LT; 0.0
    3. &LT; 0.00
    4. 0.001
    5. 0.0001
    6. 0.00001
    7. 即,前3个项目格式正确但值已全部更改为0.正如我正在使用&#34; cell.Value&#34;在每个街区,我怀疑这是我的问题的根源,但无法弄明白。任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

您可以在自定义Range.NumberFormat property中拥有两个条件和一个默认值。您需要使用符号来允许其他小数位的可能性。使用自定义数字格式

With ActiveWorkbook.Worksheets("Sheet1")
    .range("B2:B7").NumberFormat = "[>1]< 0;[>0]< 0.0####; 0; @"
    'maybe that should have been
    '.range("B2:B7").NumberFormat = "[>1]< 0;[>0]< 0.0####;< 0; @"
End With

B2:B7中的值应仅为数字;请勿键入&lt; 符号。

cnf_decimals

答案 1 :(得分:0)

由于Vincent G的帮助,以前的问题已经解决了。

然而,在扩展这个问题时,我遇到了另一个问题:对于需要重新格式化的多个单元格实例,VBA的工作方式与自定义格式相同&#34;&lt; 0.0&#34;通过&#34;&lt; 0.00000&#34;,但由于某种原因,它为&#34;&lt; 0&#34;的第一个实例复制了相同的值。它会遇到此格式的所有其他实例。

描述有点痛苦,请查看my example spreadsheet on Dropbox:表格包含测试数据,VBA和问题描述。

干杯, 基督教