使用Excel VBA格式化单元格

时间:2012-02-16 18:42:49

标签: excel excel-vba vba

如果单元格值不为空而不是0.我试图添加0.00我正在尝试但不工作的代码:

 For x = 1 To ActiveWorkbook.Sheets.Count Step 1
    With ActiveWorkbook.Worksheets(x).Range("A1:Z30")
      Set FinColumn = .Find(What:="price", AFter:=.Cells(1, 1), LookIn:=xlValues, LookAt _
          :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
          False, SearchFormat:=False)
      If FinColumn Is Nothing Then
      Else
        I = FinColumn.Row + 1
        c = FinColumn.Column
    **problem with below Do loop,no clues how to do**
        **Do Until .Cells(I, c).Value <> "" And .Cells(I, c).Value <> 0
          .Cells(I, c).NumberFormat = "0.00"
          I = I + 1
        Loop**
      End If
    End With
  Next x

请提供符合以下条件的代码:  我希望代码在2007年的早期版本中都能使用,并且必须符合以下条件:

如果excel中的数据如下所示:

Emp Name  Emp id  Empsal

Jhon      1        

steve     2        2

mike      3        3.5

paul      4        0

gabriel   5        0.00

bush      6        null

如果我运行宏,数据应该在Empsal列中转换为以下格式:

Emp Name  Emp id  Empsal

Jhon      1        0

steve     2        2

mike      3        3.50

paul      4        0

gabriel    5       0.00

bush       6      0 

谢谢,

Chaitu

5 个答案:

答案 0 :(得分:4)

我建议不使用VBA使用自定义数字格式,例如:

[=0]0;0.00

或者如果你也想要很好的大数字:

[=0]0;[>=1000]# ### ###;0.00

答案 1 :(得分:1)

经过测试和测试(最快的方法)

此代码使用条件格式。唯一的缺点是此代码将在Excel 2007之后起作用:P因此,如果您使用的是Excel 2003,那么这将无效。

Option Explicit

Sub Sample()
    Dim x As Long
    Dim FinColumn As Range

    For x = 1 To ActiveWorkbook.Sheets.Count
        With ActiveWorkbook.Worksheets(x).Range("A1:Z30")
            Set FinColumn = .Find(What:="price", AFter:=.Cells(1, 1), _
            LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

            If Not FinColumn Is Nothing Then
                With Worksheets(x).Columns(FinColumn.Column)
                    .NumberFormat = "General"
                    .FormatConditions.Delete
                    .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
                    Formula1:="=0"
                    .FormatConditions(1).NumberFormat = "0.00"
                    .FormatConditions(1).StopIfTrue = True
                End With
            End If
        End With
    Next x
End Sub

答案 2 :(得分:0)

我认为你的意思是你希望"0.00"作为数值输入,但格式化为“0.00”?在这种情况下......

.Cells(I, c).Value = 0
.Cells(I, c).NumberFormat = "0.00"

答案 3 :(得分:0)

你的循环:

     Do Until .Cells(I, c).Value <> "" And .Cells(I, c).Value <> 0
      .Cells(I, c).Value = "0.00"
      I = I + 1
    Loop

循环,直到找到非null /非零值,并在此无条件地将每个空单元格设置为0:

.Cells(I, c).Value = "0.00"

(使用新工作表上的常规格式化,此值将显示为0,而不是0.00,除非您要么重新使用工作表或更改了默认格式。)

如果您只想设置非空值,则需要更改循环的限制条件与辅助非null / null单元格测试不冲突。 在该循环内(即搜索非null),独立执行某些操作以检查每个单元格是否为空。 (比如if / then / else设置其值)。

答案 4 :(得分:0)

好的,我想我现在知道你的意思了。问题是您输入了一个不可能的Do Until语句,因为您的单元格值永远不会同时为空AND 0,因此您可能会获得无限循环

下面,我只是将您的AND替换为OR

Do Until .Cells(I, c).Value <> "" Or .Cells(I, c).Value <> 0
  .Cells(I, c).Value = "0.00"
  I = I + 1
Loop

或者,如果仍然没有覆盖它,请尝试使用<> Empty,因为Empty将涵盖0和“”

Do Until .Cells(I, c).Value <> Empty
  .Cells(I, c).Value = "0.00"
  I = I + 1
Loop