Agregar caracter y que no me modifique algún dato

Necesito una macro que realice lo siguiente, ya pregunte varias veces pero no me acabo de explicar del todo bien, perdon.

A2: si tengo una S y seis números detras que me lo escriba igual en la columna B, ejemplo si tengo S123456, en la columna b pondria lo mismo.

A3 Y A4: si tengo seis números cualquiera que me ponga una S delante de los números, en la columna B, ejemplo si tengo 665588 en la columna b me lo pondría así S665588.

A6 y A7: si ya tengo valores en la columna b, que no me los modifique.

Es un ejemplo, son datos que no van en orden.

Respuesta
1

Esta macro hace una serie de validaciones primero valida que la celda de la columna A no este vacía y la de la columna b no este llena, después de eso valida la longitud de la celda si es mayor o igual a 7 entonces valida que el primer carácter de la celda sea una letra, luego que lo resta del texto sea un numero con longitud mayor a 6, al cumplirse esto se copia el dato a la columna b, de lo cumplirse la condición de largo ser mayor o igual a 7 valida que sea numero y comprueba que el largo sea igual a 6 de cumplirse la condición le añade una ES antes del numero y lo pasa a la columna B, en caso de ya tener información la columna b simplemente la ignorara y pasara a la siguiente columna, en la imagen veras un antes y después de la macro.

Se me paso comentar esta macro es dinámica puedes añadir o quitar información y la macro siempre se ajustara a lo que quede e igual si esta en desorden o tiene espacios vacíos no importa la macro los ignora.

y esta es la macro 

Sub agregar_datos()
ultima = Range("A" & Rows.Count).End(xlUp).Row
Set datos = Range("a1").Resize(ultima, 2)
matriz = datos
With datos
    For i = 2 To ultima
        nombre = matriz(i, 1)
        Data = matriz(i, 2)
        vdata = Data = vbNullString
        vinfo = nombre <> vbNullString And vdata
        If vinfo Then
            inicial = UCase(Left(nombre, 1))
            largo = Len(nombre)
            numero = Right(nombre, largo - 1)
            letra = Asc(inicial)
            vletra = letra >= 65 And letra <= 90
            vlargo = largo >= 7
            vnumero = IsNumeric(numero)
            If vletra And vnumero And vlargo Then
                matriz(i, 2) = nombre
            Else
                vnumero = IsNumeric(nombre) And vlargo = Len(numero) >= 6
                matriz(i, 2) = "S" & nombre
            End If
        End If
    Next i
    Range(datos.Address) = matriz
End With
Set datos = Nothing: Set matriz = Nothing
End Sub

2 respuestas más de otros expertos

Respuesta
3

Podría bastarte con esta fórmula colocada en otra columna y luego pegarla como 'solo valores' sobre A:

=SI(IZQUIERDA(A2;1) ="S";A2;"S" & A2)

Pero, por si en algún caso hubiese un dato solo en B entonces mejor que la fórmula sea esta:

=SI(A2 <> "";SI(IZQUIERDA(A2;1) ="S";A2;"S" & A2);SI(IZQUIERDA(B2;1) ="S";B2;"S" &B2))

Ahora en el caso 7 no tienen S... ¿es posible que entonces solo dejes el número sin S? No quedó claro ese caso. Confirma para ajustar o no la fórmula.

Buenas en el caso 7, como esta solo hay números y ya esta puesto en la columna B, asique hay no se modificada nada porque ya esta puesto.

Lo único que falla esque en la columna B ya tengo valores digamos escritos por defecto, entonces al ejecutar su línea se modifica.

Faltaría algo para que no modifique las celdas que ya tienen valor en la columna B.

Entonces sería así:

=SI(B2<>"";B2;SI(A2<>"";SI(IZQUIERDA(A2;1)="S";A2;"S"&A2);""))

Si B tiene datos se mantienen no importa lo que haya en A.

Si B no tiene datos y A tampoco deja vacío.

Sino se coloca A y se le agrega S si no lo tuviera.

Sdos!

Respuesta
2

[Hola 

Prueba la siguiente macro y me comentas

Sub AOM()
'Por Adriel
'
    u = Range("A" & Rows.Count).End(xlUp).Row
    '
    For i = 2 To u
        dato = Cells(i, "A")
        If Cells(i, "B") = "" Then
            If InStr(dato, "S") > 0 Then
                num = Right(dato, Len(dato) - 1)
                If Len(num) = 6 Then
                    Cells(i, "B") = "S" & num
                End If
            '
            ElseIf IsNumeric(dato) And Len(dato) = 6 Then
                Cells(i, "B") = "S" & dato
            '
            End If
        End If
    Next i
    MsgBox "FIN"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas