Quiero ejecutar un procedimiento si la celda de destino está en columnas específicas.

Estoy usando números de columna para determinar esto. Si se agregan columnas adicionales a la tabla, el sistema se cae.

Mi codigo esta abajo;

  • los nombres de las columnas son "Actividad", "Recursos" y "Partes interesadas" (en la tabla "Programa");
  • las columnas son 5, 7 y 17, en la línea If Target.Column = 5 Or Target.Column = 7 Or Target.Column = 17 Then
If Target.Count > 1 Then GoTo exitHandler

On Error Resume Next
Set rngDV = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitHandler

If rngDV Is Nothing Then GoTo exitHandler

If Intersect(Target, rngDV) Is Nothing Then
   'do nothing
Else
    Application.EnableEvents = False
    newVal = Target.Value
    Application.Undo
    oldVal = Target.Value
    Target.Value = newVal
    If Target.Column = 5 Or Target.Column = 7 Or Target.Column = 17 Then
        If oldVal = "" Then
            'do nothing
        Else
            If newVal = "" Then
                'do nothing
            Else
                lUsed = InStr(1, oldVal, newVal)
                If lUsed > 0 Then
                    If Right(oldVal, Len(newVal)) = newVal Then
                        Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2)
                    Else
                        Target.Value = Replace(oldVal, newVal & ", ", "")
                    End If
                Else
                    Target.Value = oldVal _
                      & ", " & newVal
                End If
            End If
        End If
    End If
End If

exitHandler:
  Application.EnableEvents = True
-1
beelzabud 17 oct. 2018 a las 02:31

2 respuestas

La mejor respuesta

Puede usar las propiedades de una tabla, por lo tanto.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim c As Long

With ActiveSheet.ListObjects("Table1")
    c = Target.Column - .ListColumns(1).Range.Column + 1
    If Intersect(Target, .DataBodyRange) Is Nothing Then Exit Sub
    If .HeaderRowRange(c).Value = "Resources" Or _
       .HeaderRowRange(c).Value = "Activity" Or _
       .HeaderRowRange(c).Value = "Stakeholders" Then
            MsgBox "Yes"
    End If
End With

End Sub
0
SJR 17 oct. 2018 a las 08:37

Puede usar rangos con nombre para evitar errores en caso de que alguien agregue columnas a la hoja.
Por ejemplo, la columna "5" es la columna "E". Entonces, en la celda "E1", crea un rango con nombre como "ActivityCol" y hace lo mismo para otras columnas (usando nombres diferentes, por supuesto)
Luego, en su código, podría hacer algo como

Option Explicit

Sub Test()  
    Dim ActivityColNo as Long, ResourcesColNo as Long, StakeholdersColNo as Long 
    ......
    With Thisworkbook.sheets("Your sheet name") 
        ActivityColNo  = .range("ActivityCol").Column
        ResourcesColNo  = .range("Some name").Column 
        StakeholdersColNo  = .range("Some other name").Column 
    End With
    ........
    If Target.Column = ActivityColNo Or Target.Column = ResourcesColNo Or _ 
        Target.Column = StakeholdersColNo Then
    .........

End Sub 
0
Sphinx 17 oct. 2018 a las 08:44