Cómo alternar celdas en una columna completa con 4 valores diferentes en Excel


3

¿Cómo creamos un código VBA de modo que podamos alternar entre 4 valores para una celda determinada dentro de una columna, y que no haga clic en ningún modo "Editar" después de hacer clic en la celda?

Los 4 valores son: Y, N, L y G.

El único código que podría recopilar (que se muestra a continuación) es problemático, ya que entra en un modo de edición al hacer clic, y no me permite realizar la función de celda de alternancia para una columna completa con el mismo código VBA: enter image description here

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

If Target.Row <> 1 Then Exit Sub

Select Case UCase(Target.Value)

    Case Is = "Y"

        Target.Value = "N"

    Case Is = "N"

        Target.Value = "L"

    Case Is = "L"
        Target.Value = "G"

    Case Is = "G"
        Target.Value = "Y"

End Select

End Sub

----- ¡Gracias por las respuestas! Por favor vea la imagen adjunta. La idea es poder cambiar el estado de cualquier elemento presentado. La columna de estado está en la columna L, y lo necesito para alternar entre Y-N-L-G, en lugar de usar cualquier lista desplegable.

enter image description here


Intenta actualizar tus casos como este Case "Y": Target.CurrentRegion.Columns(Target.Column).Replace "Y", "N"
paul bica

Lo siento, no estoy muy versado con la codificación VBA. ¿Se puede mostrar la pantalla completa con la nueva fórmula posicionada en?
J.C

Respuestas:


1

Prueba este formato


Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

    Const MIN_ROW = 4   'Column Header (Status) is on row 4
    Const COL_L = 12

    If Target.CountLarge = 1 Then           'If a single cell is selected
        If Target.Column = COL_L Then       'If selected cell is in col L
            If Target.Row > MIN_ROW Then    'If selected cell row is 5 or higher
                With Me
                    Dim lr As Long, arr As Variant, i As Long
                    lr = .Cells(Rows.Count, COL_L).End(xlUp).Row  'Last used row in col L
                    If lr > MIN_ROW Then
                        arr = .Range(.Cells(MIN_ROW + 1, COL_L), .Cells(lr, COL_L))
                        For i = 1 To UBound(arr)
                            Select Case UCase(arr(i, 1))
                                Case Is = "Y":  arr(i, 1) = "N"
                                Case Is = "N":  arr(i, 1) = "L"
                                Case Is = "L":  arr(i, 1) = "G"
                                Case Is = "G":  arr(i, 1) = "Y"
                            End Select
                        Next
                        .Range(.Cells(MIN_ROW + 1, COL_L), .Cells(lr, COL_L)) = arr
                    End If
                End With
            End If
        End If
    End If
End Sub

----- ¡Gracias por las respuestas! Por favor vea la imagen adjunta de la sección de preguntas. La idea es poder cambiar el estado de cualquier elemento presentado. La columna de estado está en la columna L, y lo necesito para alternar entre Y-N-L-G, en lugar de usar cualquier lista desplegable.
J.C

Sus requerimientos no son muy claros. En función de la imagen que cargó y su código inicial, no puede simplemente alternar entre 4 valores diferentes; es posible que desee realizar un ciclo de todos ellos al mismo tiempo; de lo contrario, terminará con el problema visible en el Escenario 2. Además, esto evento debe ser activado en base a qué? ¿Al hacer clic en la celda superior de la columna L (L6) y desea cambiar todos los valores basados ​​en la misma celda superior? Sin la imagen tuve la impresión de que desea hacer clic en la FILA 1 de cualquier columna. Por favor, proporcione más detalles y estoy seguro de que podemos encontrar el mejor enfoque
paul bica

1
Hola Paul, no debe haber ningún otro valor como el del escenario 1. El evento solo debe activarse con un solo clic en la celda específica (No en la parte superior de la columna) para que cambie de "Y" a "N" . Si el valor existente es "N", debe cambiar a "L", y si "L" es el valor existente, debe cambiar a "G" y el ciclo se repite de "G" a "Y" nuevamente en una forma Y & gt; N & gt; L & gt; G.
J.C

1
Por favor, ver adjunto última foto. Debería ser más claro con más detalles ahora, con suerte: D
J.C

Hice la actualización. Si funciona, marque una respuesta como aceptada: haga clic en la marca de verificación junto a la respuesta para cambiarla de gris a verde - más detalles aquí
paul bica

-1

Puede probar este código VBA, lo probé antes de que lo haya publicado aquí y esté funcionando.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 If ActiveCell = Range("A2") Then

    If ActiveCell.Value = "Y" Then
      ActiveCell.Value = "N"

        ElseIf ActiveCell.Value = "N" Then
          ActiveCell.Value = "L"

          ElseIf ActiveCell.Value = "L" Then
           ActiveCell.Value = "G"

      ElseIf ActiveCell.Value = "G" Then
          ActiveCell.Value = "Y"

       End If
End If

End Sub

NÓTESE BIEN: Escribe Y (en Capital) y termina con Enter. Luego, cada vez que coloque el puntero de la celda o haga clic en el valor de la celda A2, cambiará de Y a N a L a G a Y.

Espero que esto te ayude.


Simplemente escriba, qué está mal con este código VBA desde que cumplió con el OP por todos los medios.
Rajesh S

Gracias por su edición. Funciona para una celda, pero ¿qué pasa si necesitamos la función de alternar para todas las celdas de, por ejemplo, la columna L?
J.C

Dado que el OP fue solo para la celda, de modo que escribí el código VBA en consecuencia, usted me muestra cómo desea alternar la secuencia de caracteres de la columna y luego le sugiero el código.
Rajesh S

----- ¡Gracias por las respuestas! Por favor vea la imagen adjunta de la sección de preguntas. La idea es poder cambiar el estado de cualquier elemento presentado. La columna de estado está en la columna L, y lo necesito para alternar entre Y-N-L-G, en lugar de usar cualquier lista desplegable.
J.C
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.