2016-02-25 115 views
0

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

示例: 当我将单元格“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 
+0

是否确定要每次在工作表上选择不同的单元格时自动运行此操作?也许你的意思是只要工作表上的值发生变化就会触发它。 – Jeeped

+2

要关闭颜色,请使用'.Interior.Pattern = xlNone'。将填充颜色更改为“vbWhite”(注意:不是“白色”)与删除颜色不同。 – Jeeped

+1

如果此事件宏位于Sheet1代码表中,那么您不需要'工作表(“Sheet1”)'或'表单“。这是一个私人小组,知道它属于谁。这是少数情况下最好使用'Range'而不是'Worksheets(“Sheet1”)。Range或'Sheet1.Range'的场合。 – Jeeped

回答

2

更改此:

Sheet1.Range(c.Address + 3) 

对此

Sheet1.Range(c.Address).offset(0,3) 

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

+0

这实际上是我想要的!简单直接前进!非常感谢! –

-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 
+1

我很困惑...如果Target.Column = Range(“A:A”)。Column Then'?虽然它和'如果Target.Column = 1 Then'是一样的,那不是所期望的。也不需要'.Offset(,3).Interior.Color = .Interior.Color'。此外,您的'预先'会弄乱宏观的工作方式。它看起来像一个复制粘贴某处(只是跳过了一些不需要的部分)。你也没有解释任何事情。请回顾一下你的回答... –

+0

你低估了我的回答,如果你没有理解我的代码的知识,那么让你理解它不是我的责任。 – Sixthsense

+0

Quote:*“用你的当前代码替换下面的代码。”*但你的代码将不会执行OP正在查找的内容......根本就没有。它也可能弄乱他的表格。只是为了这部分,我可能会将你的答案推到-2 –

0

我真的希望,这第六感是要修改他的回答让我可以给他的+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(如sPrev从第六感)是很重要的,因为改变选择,不返回“旧“选择,如果选择A1并更改颜色,则不会触发激活,所以我们将与Worksheet_SelectionChange。现在改变后,我们选择D19,没有任何信息会告诉我们A1已被更改。但我们也不希望每次选择更改时都运行所有更改。为此,“最后”选择将被存储在rngHolder内。

我跳过了一些部分,直接将选中的范围跨过我们需要在变量中查看的单元格(或者如果找不到相交部分,则不需要任何东西)。

如果rngHolder不是我们选择不同的单元格的下一次清空,它会运行所有细胞rngHolder改变所需的细胞3列到右边的背景色。 (这种方式也可以同时改变多个单元格),并且推动新的相交点在rngHolder

为了这我抱怨第六感的解决了这一点:
如果你做的第一选择......可以说,X7 ......然后选择A3事后会的AA7背景颜色更改为相同的像X7有。这可能没有被注意到,因为条件格式和类似的东西。错误的“高亮显示”然而可能会在稍后引发用户错误(您也许会注意到它在很多单元格已被更改)

但是,问题只是针对“Offset”功能而已以适当的方式回答;)