Excel宏单元格地址增加

时间:2016-02-25 03:36:58

标签: excel vba excel-vba macros

我可以使用宏来增加单元格地址吗? 我正在实现excel cell颜色匹配功能。

实施例: 当我将单元格“A1”更改为红色时,单元格“D1”将变为红色。 如果将“C1”改为红色,“F1”也会变为红色。所有都需要增加3列。

现在我只需要将“c.Address”修改为+ 3,这样单元格就会执行D1。 我尝试使用c.Address + 3但它无法正常工作。 任何帮助将不胜感激!

谢谢!

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

For Each c In Worksheets("Sheet1").Range("A1:C1").Cells

    If c.Interior.Color = 255 Then
    Sheet1.Range(c.Address + 3 ).Interior.Color = 255  <<-- Can't work

    Else
    Sheet1.Range(c.Address + 3 ).Interior.Color = white <<-- Can't work

    End If

Next c

End Sub

3 个答案:

答案 0 :(得分:2)

改变这个:

100 * SUM(order_lines.accounting_total) /
    (SELECT SUM(accounting_total) FROM order_lists) AS Order_Percentage

到此

Sheet1.Range(c.Address + 3 )

虽然我不知道你为什么需要Sheet1.Range(c.Address).offset(0,3) 而不仅仅是c,但是c是一个范围吗?如果是这样,你可以Sheet1.Range(c.Address)

答案 1 :(得分:0)

我真的希望,Sixthsense会编辑他的答案,所以我可以给他+1,但它看起来不会发生:(左 仍然知道他想要实现的目标,我至少会展示一些有效的代码并对其进行解释。首先要做的是:代码:

Option Explicit

Dim rngHolder As Range

Private Sub Worksheet_Activate()
  If rngHolder Is Nothing Then Set rngHolder = Intersect(Selection, Range("A1:C1"))
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not rngHolder Is Nothing Then
    Dim rngRunner As Variant
    For Each rngRunner In rngHolder.Cells
      rngRunner.Offset(0, 3).Interior.Color = IIf(rngRunner.Interior.Color = 255, 255, xlNone)
    Next
  End If
  Set rngHolder = Intersect(Target, Range("A1:C1"))
End Sub

rngHolder(与来自Sixthsense的sPrev一样重要,因为更改选择,不会返回&#34; old&#34;选择。如果您选择A1并更改颜色,则不会激活触发器,因此我们将使用Worksheet_SelectionChange。在更改之后,我们选择D19并且没有任何内容会告诉我们A1已被更改。但是,我们也不希望每次选择更改时都运行所有更改。出于这个原因,&#34;最后&#34;选择将存储在rngHolder

我跳过了一些部分并直接推送选定的范围,这些范围穿过我们需要在变量中查看的单元格(如果没有找到交叉则没有任何内容)。

如果rngHolder在我们选择不同的单元格时不为空,它将运行rngHolder中的所有单元格,将所需单元格的背景颜色更改为右侧3列。 (这种方式也可以同时更改多个单元格)并且还可以在rngHolder中推送新的相交。

我正在抱怨Sixthsense的解决方案:
如果您执行的第一个选择是......请说X7 ...然后选择A3会将AA7的背景颜色更改为与X7相同的背景颜色。由于条件格式和类似的东西,这可能不会被注意到。错误&#34;突出显示&#34;然而,以后可能会导致用户错误(你也可能会注意到它已经被大量的单元格改变了)

然而,问题只是针对&#34; Offset&#34; -function已经以正确的方式回答;)

答案 2 :(得分:-1)

用以下代码替换当前代码。

Dim sPrev As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If sPrev = "" Then sPrev = Target.Address

If Target.Cells.Count = 1 Then
    If Target.Column = Range("A:A").Column Then
        With Range(sPrev)
            .Offset(, 3).Interior.Color = .Interior.Color
        End With
        sPrev = Target.Address
    End If
End If

End Sub