2010-04-12 59 views
0

這就是我需要做的:Excel/VB - 我如何遍歷每行/列並根據值進行格式化?

1)循環遍歷每個單元格在工作表中 2)請根據值的格式更改(粗體等)相對於每個字段的字段

我的意思如果一個字段的值爲「foo」,我想讓它的字段(-1,-3)爲粗體,等等。我試圖用下面的腳本來做到這一點,但沒有運氣。

感謝 約翰尼

僞代碼來說明:

For Each Cell in WorkSheet 
    If Value of Cell is 'Subtotal' 
     Make the cell 2 cells to the left and 1 cell up from here bold and underlined 
    End If 
End ForEach 

失敗的宏(我真的不知道VB的話):

Sub Macro2() 
' 
' 
' 
Dim rnArea As Range 
Dim rnCell As Range 

Set rnArea = Range("J1:J2000") 

    For Each rnCell In rnArea 
     With rnCell 
      If Not IsError(rnCell.Value) Then 
       Select Case .Value 
        Case "000 Total" 
         ActiveCell.Offset(-1, -3).Select 
         ActiveCell.Font.Underline = XlUnderlineStyle.xlUnderlineStyleSingleAccounting 
       End Select 
      End If 
     End With 
    Next 
End Sub 

回答

1
Option Explicit 

Private Sub macro2() 
    Dim rnArea As Range 
    Dim rnCell As Range 

    ' you might need to change the range to the cells/column you want to format e. g. "G1:G2000" ' 
    Set rnArea = Range("J1:J2000") 

    For Each rnCell In rnArea 
     With rnCell 
      If isBold(.Offset(1, 3).Value) Then 
       .Font.Bold = True 
      End If 
      If isUnderlined(.Offset(1, 3).Value) Then 
       'maybe you want this: .Font.Underline = xlUnderlineStyleSingle ' 
       .Font.Underline = xlUnderlineStyleSingleAccounting 
      End If 
     End With 
    Next 
End Sub 

Private Function isBold(cellValue As Variant) As Boolean 
    Dim myList() As Variant 
    Dim listCount As Integer 
    Dim i As Integer 

    myList = Array("Totals", "FooTotal", "SpamTotal") 
    listCount = 3 

    isBold = False 
    For i = 0 To listCount - 1 
     If cellValue = myList(i) Then 
      isBold = True 
      Exit Function 
     End If 
    Next i 
End Function 

Private Function isUnderlined(cellValue As Variant) As Boolean 
    Dim myList() As Variant 
    Dim listCount As Integer 
    Dim i As Integer 

    myList = Array("FooTotal", "SpamTotal") 
    listCount = 2 

    isUnderlined = False 
    For i = 0 To listCount - 1 
     If cellValue = myList(i) Then 
      isUnderlined = True 
      Exit Function 
     End If 
    Next i 
End Function 

我加兩個函數,但它也應該與廣泛的if/else if/else一起工作。

+0

@marg +1如果我想這樣做到20個不同的值(例如,「小計」,「總計」,「FooTotal」,「SpamTotal」等)。有沒有一種方法可以在每次單元迭代期間循環遍歷字符串列表,並且如果單元格的值在標誌值列表中,那麼執行字體粗體等等? – 2010-04-12 21:59:00

+0

你想以相同的方式或單獨格式化它們嗎? – marg 2010-04-12 22:01:09

+0

完全相同,但我將有2個不同的列表(一個標記爲粗體,一個標記爲粗體和下劃線)。 – 2010-04-12 22:08:47

1

基於上面的解決方案的意見,我認爲這可能是有益的

Sub FormatSpecialCells() 
    Dim SearchRange As Range 
    Dim CriteriaRange As Range 

    Set SearchRange = Range("A2:A24") 
    Set CriteriaRange = Range("C2:C5") 

    Dim Cell As Range 

    For Each Cell In SearchRange 
    TryMatchValue Cell, CriteriaRange 
    Next 


End Sub 

Private Sub TryMatchValue(CellToTest As Range, CellsToSearch As Range) 
    Dim Cell As Range 

    For Each Cell In CellsToSearch 
     If Cell.Value = CellToTest.Value Then 
      Cell.Copy 
      CellToTest.PasteSpecial xlPasteFormats, xlPasteSpecialOperationNone, False, False 
     End If 
    Next 
End Sub 

這並不能完全實現你的目標。它所做的是搜索指定的單元格列表,並將它們與單獨的單元格列表進行匹配。如果它匹配這些值,它將使用第二個單元格列表的FORMAT,並將其應用到它在第一個單元格列表中匹配的單元格。您可以通過更改TryMatchValue函數來修改此操作,以便與其匹配CellToTest而不是匹配CellToTest,它將格式粘貼到另一個單元格上,該單元格爲2和1。

這樣做的好處是,如果你想添加更多的值和不同的格式,你只需要去你的Excel工作表並添加更多的值。你也只需要改變該值的格式。

一個例子是...

有您搜索A1單元格:D1000 細胞中有下列值E2:E6 ... 小計(這是粗體和下劃線) 總(其中大膽,下劃線,斜體) 網(這是粗體下劃線和紅色) 等等

那麼當它碰到小計,它會改變細胞大膽和下劃線。 當它擊中總計它會改變細胞大膽下劃線和斜體 等等...

希望這有助於

相關問題