Formato de letra más número de Excel

Formato de letra más número de Excel

Tengo problemas para encontrar una manera de forzar un formato determinado en una columna específica.

Lo que estoy tratando es una hoja de cálculo que uso para realizar un seguimiento del inventario. La utilizan varias personas y, como resultado, los formatos de ubicación son inconsistentes.

(por ejemplo: A1, A01, A-1, A-01)

Esto hace que ordenar sea un poco complicado, ya que A1 está por encima de A10, en lugar de A1, A2. Quiero que lo arregle para que, sin importar lo que se escriba, se corrija a un formato de letra + número de 2 dígitos (A01).

gracias de antemano

Respuesta1

Esto no es posible dentro de la columna de escritura.

  • Podrías agregar uncolumna adicional (ayudante)que contiene la fórmula que divide las partes de su cadena, formatea cada una en consecuencia y las une muy bien.
  • Si todas tus cadenas comienzan con A, podrías decirles a todos quesuelta la A(y el guión), y simplemente ingresa un número (pero tal vez acabas de dar un ejemplo)
  • Podrías tenerdoscolumnas, una para la parte alfa y otra para el número
  • podrías escribir unmacroque analiza todo lo que escriben y realiza la clasificación. Pero por experiencia, no existe ninguna macro en el mundo que pueda manejar todas las variaciones absurdas que se le puedan ocurrir a un usuario; siempre encontrará una variación que la rompa.

Respuesta2

También puede utilizar la Validación de datos, con indicaciones y mensajes comprensibles. La fórmula de validación de datos (suponiendo que desee mayúsculas para las letras) sería:

=AND(CODE(A1)>=65,CODE(A1)<=90,CODE(MID(A1,2,1))>=48,CODE(MID(A1,2,1))<=57,CODE(MID(A1,3,1))>=48,CODE(MID(A1,3,1))<=57)

Respuesta3

Coloque la siguiente macro de evento en el área de código de la hoja de trabajo:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim B As Range, s As String
    Set B = Range("B:B")
    If Intersect(Target, B) Is Nothing Then Exit Sub
    s = Target.Value
    If Len(s) <> 3 Then GoTo fixit
    If Not Left(s, 1) Like "[A-Z]" Then GoTo fixit
    If Not IsNumeric(Mid(s, 2, 2)) Then GoTo fixit
    Exit Sub
fixit:
    Application.EnableEvents = False
        Target.Value = "A00"
    Application.EnableEvents = True
End Sub

Esta macro de ejemplo monitorea y corrige las entradas de la columna.B. Si las entradas son válidas, se dejan en paz. Si una entrada no es válida, se reemplaza porA00.

Respuesta4

Si solo desea verificar el valor y la lógica de verificación no es demasiado compleja, puede hacerlo con la validación de datos estándar de Excel. Sin embargo, dado que desea reformatear el valor para que sea correcto, deberá utilizar VBA o Visual Studio Tools para Office. La siguiente es una macro VBA simple que hace lo que usted quiere.

La magia ocurre cuando elHoja de trabajo_cambiarel evento se despide. Por el bien del ejemplo, asumo que ingresa valores únicos en la primera columna. ElCorrectoPartNoLa función hace el trabajo pesado. Analiza el valor ingresado y devuelve un valor formateado correctamente o nada que indique que hubo un error de validación (solo verifica la longitud máxima). El procesamiento funciona con su ejemplo, pero probablemente sea demasiado simple para el mundo real. Podría mejorarse fácilmente con expresiones regulares u otro procesamiento igualmente poderoso.

El controlador de eventos continúa actualizando la celda con el número de pieza con el formato correcto o coloca el valor ingresado por el usuario en negrita y rojo para indicar un error.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim NewValue As String

    If (Target.Column = 1 And Target.Count = 1) Then
        Application.EnableEvents = False
        NewValue = CorrectPartNo(Target.Value)
        If (Len(NewValue) = 0) Then
            Target.Font.Color = vbRed
            Target.Font.Bold = True
        Else
            Target.Value = NewValue
        End If
        Application.EnableEvents = True
    End If
End Sub

Function CorrectPartNo(PartNo As String)
    Dim StartPartNo As String
    Dim EndPartNo As String
    Dim EndPartNoPosition As Integer

    StartPartNo = Left(PartNo, 1)
    If (Mid(PartNo, 2, 1) = "-") Then
        If (Len(PartNo) > 4) Then
            CorrectPartNo = ""
            Exit Function
        Else
            EndPartNoPosition = 3
        End If
    Else
        If (Len(PartNo) > 3) Then
            CorrectPartNo = ""
            Exit Function
        Else
            EndPartNoPosition = 2
        End If
    End If
    EndPartNo = Right("0" + Mid(PartNo, EndPartNoPosition), 2)

    CorrectPartNo = StartPartNo + EndPartNo
End Function

información relacionada