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