【问题标题】:Apply VBA script, to format cells, to multiple rows and cells应用 VBA 脚本,格式化单元格,多行和单元格
【发布时间】:2021-01-25 11:30:56
【问题描述】:

我设法得到了这个代码:

Sub ColorChange()

Dim ws As Worksheet
Set ws = Worksheets(2)

clrOrange = 39423
clrWhite = RGB(255, 255, 255)

If ws.Range("D19").Value = "1" And ws.Range("E19").Value = "1" Then
    ws.Range("D19", "E19").Interior.Color = clrOrange
ElseIf ws.Range("D19").Value = "0" Or ws.Range("E19").Value = "0" Then
    ws.Range("D19", "E19").Interior.Color = clrWhite
End If

End Sub

这可行,但现在我需要此代码在 50 行和 314 个单元格中工作,但每次只在两个单元格上工作,例如 D19+E19、D20+E20 等。端点是 DB314+DC314。
有没有办法,无需复制粘贴此代码并手动替换所有行和单元格?

如果两个单元格中的值不是 1+1,则单元格颜色会变回白色。

编辑:感谢@VBasic2008 的解决方案。
我在工作表的代码中添加了以下内容,以使解决方案自动工作:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D19:DC314")) Is Nothing Then
    Call ColorChange
End If
End Sub

因为 Interior.Color 移除了边框,所以我添加了以下子项:

Sub vba_borders()

Dim iRange As Range
Dim iCells As Range

Set iRange = Range("D19:DC67,D70:DC86,D89:DC124,D127:DC176,D179:DC212,D215:DC252,D255:DC291,D294:DC314")

For Each iCells In iRange
    iCells.BorderAround _
      LineStyle:=xlContinuous, _
      Weight:=xlThin
Next iCells

End Sub

排除某些行的范围有点不同。

【问题讨论】:

  • 您可以通过条件格式来实现这一点。这里不需要 VBA?
  • 我试过了,但找不到适合我想要的东西。您认为我应该使用哪一个?
  • Home | Conditional Formatting | Use a Formula
  • 好的,找到了使用条件格式的解决方案,但现在我需要将它应用于我需要它工作的所有行和单元格。
  • 选择整个范围以应用格式。试一试,如果您遇到困难,请发布您尝试过的内容,我们会从那里拿走?

标签: excel vba


【解决方案1】:

比较列对的两个单元格中的值

Option Explicit

Sub ColorChange()
    
    Const rgAddress As String = "D19:DC314"
    Const Orange As Long = 39423
    Const White As Long = 16777215
    
    Dim wb As Workbook ' (Source) Workbook
    Set wb = ThisWorkbook ' The workbook containing this code.
    
    Dim rg As Range ' (Source) Range
    Set rg = wb.Worksheets(2).Range(rgAddress) ' Rather use tab name ("Sheet2").

    Dim cCount As Long ' Columns Count
    cCount = rg.Columns.Count
    
    Dim brg As Range ' Built Range
    Dim rrg As Range ' Row Range
    Dim crg As Range ' Two-Cell Range
    Dim j As Long ' (Source)/Row Range Columns Counter
    
    For Each rrg In rg.Rows
        For j = 2 To cCount Step 2
            Set crg = rrg.Cells(j - 1).Resize(, 2)
            If crg.Cells(1).Value = 1 And crg.Cells(2).Value = 1 Then
                If brg Is Nothing Then
                    Set brg = crg
                Else
                    Set brg = Union(brg, crg)
                End If
            End If
        Next j
    Next rrg
    
    Application.ScreenUpdating = False
    rg.Interior.Color = White
    If Not brg Is Nothing Then
        brg.Interior.Color = Orange
    End If
    Application.ScreenUpdating = True

End Sub

【讨论】:

  • 哇。非常感谢你花时间做这个。我不知道如何以及为什么,但是,这有效!我只需将 Private Sub Worksheet_Change 添加到特定工作表即可调用 Colorchange 以使其自动工作。这正常吗?
  • 就是这样。您可以使用一种解决方案来检查每个更改的单元格的奇数列和偶数列,但如果代码没有显着减慢您的工作表,您不必这样做。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多