Estou tendo problemas para descobrir uma maneira de forçar um determinado formato em uma coluna específica.
Estou lidando com uma planilha que uso para rastrear estoque. Ela é usada por várias pessoas e, como resultado, os formatos de localização são inconsistentes.
(ex.: A1, A01, A-1, A-01)
Isso torna a classificação um pouco complicada, tendo A1 acima de A10, em vez de A1, A2. Quero corrigi-lo para que, independentemente do que for digitado, seja corrigido para um formato de letra + número de 2 dígitos (A01).
desde já, obrigado
Responder1
Isso não é possível na coluna de digitação.
- Você poderia adicionar umcoluna extra (auxiliar)que contém a fórmula que divide as partes da sua string, formata cada uma de acordo e as junta perfeitamente.
- se todas as suas strings começarem com A, você poderia simplesmente dizer a todos paradeixe cair o A(e o travessão) e simplesmente insira um número (mas talvez você tenha apenas dado um exemplo)
- Você pode terdoiscolunas, uma para a parte alfa e outra para o número
- você poderia escrever ummacroque analisa tudo o que eles digitam e faz a classificação. Mas, por experiência própria, não existe nenhuma macro no mundo que possa lidar com todas as variações absurdas que um usuário poderia criar - eles sempre encontrarão uma variação que a quebra.
Responder2
Você também pode usar a validação de dados, com prompts e mensagens compreensíveis. A fórmula de validação de dados (supondo que você queira letras maiúsculas) seria:
=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)
Responder3
Coloque a seguinte macro de eventos na área de código da planilha:
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
Este exemplo de macro monitora e corrige entradas na colunaB. Se as entradas forem válidas, elas serão deixadas em paz. Se uma entrada for inválida, ela será substituída porA00.
Responder4
Se você quisesse apenas verificar o valor e a lógica de verificação não fosse muito complexa, isso poderia ser feito com a validação de dados padrão do Excel. No entanto, como deseja reformatar o valor para que fique correto, você precisará usar o VBA ou o Visual Studio Tools for Office. A seguir está uma macro VBA simples que faz o que você deseja.
A magia acontece quando oPlanilha_Alterarevento é disparado. Para fins de exemplo, presumo que você esteja inserindo valores únicos na primeira coluna. OCorretoPartNofunção faz o trabalho pesado. Ele analisa o valor inserido e retorna um valor formatado corretamente ou nada que indique que houve um erro de validação (verifica apenas o comprimento máximo). O processamento funciona com o seu exemplo, mas provavelmente é simples demais para o mundo real. Poderia ser facilmente aprimorado com expressão regular ou outro processamento igualmente poderoso.
O manipulador de eventos continua atualizando a célula com o número de peça formatado corretamente ou torna o valor inserido pelo usuário em negrito e vermelho para indicar um erro.
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