eliminar el 0 inicial delante del decimal excepto cuando un número distinto de cero lo precede

2

Tengo una columna, que tiene valores separados por comas dentro de cada celda que se ve así

0.1, 0.2,0.3, 0.4,0.5, 0.8,1.0
1.5, 1.6,2.0, 10.6,10.9, 15.2,30.75
20, 0.25,280.2, 0.29,300.2, 423,530.76

Como una cadena de texto.

El objetivo es eliminar el cero inicial delante del decimal, pero solo cuando no hay otro dígito (incluido otro 0) delante, utilizo la función de búsqueda de reemplazo vba:

    Opción explícita
    Public Sub Replace0dot (Opcional byDummy como Byte)
        Columnas ("A"). Reemplazar qué: "0.", _
                            Reemplazo: = ".", _
                            LookAt: = xlPart, _
                            SearchOrder: = xlByRows, _
                            MatchCase: = False, _
                            SearchFormat: = False, _
                            Reemplazar formato: = falso
    Application.ScreenUpdating = True
    End Sub 

y termino con esto:

.1, .2,.3, .4,.5, .8,1
1.5, 1.6,2, 1.6,1.9, 15.2,3.75
2, .25,28.2, .29,30.2, 423,53.76

Elimina todas las instancias de liderazgo 0.con ., por lo que ves se 10.6convierte 1.6. Pero debería permanecer. 10.6 ¿Cómo puedo obtener una búsqueda que reemplace el equivalente que me da:

.1, .2,.3, .4,.5, .8,1
1.5, 1.6,2, 10.6,10.9, 15.2,30.75
20, .25,280.2, .29,300.2, 423,530.76

??? Parece que tendría que ser sin concatenar y volver a concatenar para lograr el objetivo.

Jon Grah
fuente
Split en. Verifique el contenido antes. Para conocer la longitud o verificar digital individual si es y luego según la ubicación eliminar
SeanClt
Alternativamente Split, también puede usar expresiones regulares para buscar ([^0-9])0\.un reemplazo para $1.. Puede encontrar muchos tutoriales en la red sobre el uso de expresiones regulares en VBA.
Máté Juhász
@Mate, @SeanClt splito regular expressionsestos pueden funcionar. ¿Alguno de ustedes tenía la intención de escribir una respuesta? Supongo que tendría que haber algunos si / entonces para distinguir entre 0.y ([^0-9])0\.. No soy programador, aunque trato de ser lógico cuando escribo la mayor parte del tiempo.
Jon Grah

Respuestas:

2

Aquí hay un enfoque muy simple:

  • si la cadena comienza con 0. luego suelte el cero
  • si la cadena contiene tripletes como {space} 0. entonces deja caer ese cero
  • si la cadena contiene tripletes como , 0. entonces deja caer ese cero

Seleccione las celdas y ejecute este código:

Sub fixdata()
    Dim r As Range, t As String

    For Each r In Selection
        t = r.Text
        If Left(t, 2) = "0." Then t = Mid(t, 2)
        t = Replace(t, " 0.", " .")
        t = Replace(t, ",0.", ",.")
        r.Value = t
    Next r
End Sub

antes de:

ingrese la descripción de la imagen aquí

y después:

ingrese la descripción de la imagen aquí

Si hay otros tripletes que deben cambiarse, simplemente agregue otro Replace()

EDITAR # 1:

Para evitar la selección manual de las celdas, podemos hacer que la macro lo haga ......... aquí hay un ejemplo para la columna A :

Sub fixdata2()
    Dim r As Range, t As String

    For Each r In Intersect(Range("A:A"), ActiveSheet.UsedRange)
        t = r.Text
        If Left(t, 2) = "0." Then t = Mid(t, 2)
        t = Replace(t, " 0.", " .")
        t = Replace(t, ",0.", ",.")
        r.Value = t
    Next r
End Sub

EDITAR # 2

En esta versión agregamos a ; al final de cada celda justo antes de ingresar texto en esa celda:

Sub fixdata3()
    Dim r As Range, t As String, Suffix As String
    Suffix = ";"

    For Each r In Intersect(Range("A:A"), ActiveSheet.UsedRange)
        t = r.Text
        If Left(t, 2) = "0." Then t = Mid(t, 2)
        t = Replace(t, " 0.", " .")
        t = Replace(t, ",0.", ",.")
        r.Value = t & Suffix
    Next r
End Sub

EDITAR3 #:

En esta versión el ; se agrega solo si aún no está presente en la celda:

Sub fixdata4()
    Dim r As Range, t As String, Suffix As String
    Suffix = ";"

    For Each r In Intersect(Range("A:A"), ActiveSheet.UsedRange)
        t = r.Text
        If Left(t, 2) = "0." Then t = Mid(t, 2)
        t = Replace(t, " 0.", " .")
        t = Replace(t, ",0.", ",.")
        If Right(t, 1) <> Suffix Then
            r.Value = t & Suffix
        End If
    Next r
End Sub

EDITAR # 4:

Esta versión no afectará a las celdas vacías:

Sub fixdata5()
    Dim r As Range, t As String, Suffix As String
    Suffix = ";"

    For Each r In Intersect(Range("A:A"), ActiveSheet.UsedRange)
        t = r.Text
        If t <> "" Then
            If Left(t, 2) = "0." Then t = Mid(t, 2)
            t = Replace(t, " 0.", " .")
            t = Replace(t, ",0.", ",.")
            If Right(t, 1) <> Suffix Then
                r.Value = t & Suffix
            End If
        End If
    Next r
End Sub

EDITAR # 5:

Esto corrige el error en la versión anterior:

Sub fixdata6()
    Dim r As Range, t As String, Suffix As String
    Suffix = ";"

    For Each r In Intersect(Range("A:A"), ActiveSheet.UsedRange)
        t = r.Text
        If t <> "" Then
            If Left(t, 2) = "0." Then t = Mid(t, 2)
            t = Replace(t, " 0.", " .")
            t = Replace(t, ",0.", ",.")
            If Right(t, 1) <> Suffix Then
                t = t & Suffix
            End If
            r.Value = t
        End If
    Next r
End Sub
Estudiante de gary
fuente
¿Hay alguna manera de resaltar las celdas dentro del código frente a resaltar manualmente?
Jon Grah
@ JonGrah ............... Actualizaré el código para dar un ejemplo.
Estudiante de Gary el
1
@ JonGrah Vea mi EDIT # 1
Gary's Student
Votado. Este es un enfoque muy simple y parece funcionar cada vez que lo ejecuto. Aquí hay crédito adicional: ¿Cómo agregaría un punto y coma ;al final de cada fila? p. ej. 0.1, 0.2,0.3, 0.4,0.5, 0.8,1.0 se convierte en .1, .2, .3, .4, .5, .8,1.0; ??
Jon Grah
1
@ JonGrah Vea mi EDIT # 2
Gary's Student
0

Use este código VBA, probará cada cadena para ceros a la izquierda

Sub Reemplazar0dot ()

   Dim str As String    
   Dim ln As Long   
   Dim i As Long    

   ln = Range("A1").End(xlDown).Row   
   For i = 1 To ln
   str = Cells(i, 1).Value
   If Left(str, 1) = "0" Then
   Cells(i, 1) = Mid(str, 2)
   End If
   Next i

End Sub   
Sam
fuente
1) No funciona completamente cuando intento ejecutar el módulo (Excel 2010). Solo eliminó el primero 0del primero 0.en la primera celda, no toda la cadena y no para todas las celdas en la columna A. 2) ¿Puede agregar algunos comentarios a su respuesta para describir qué partes de su código hacen qué? Digamos que quería comenzar con A2. ¿Hay algo más que deba ajustarse? ¿Está idefiniendo cada carácter para contar después de cada coma ,la cadena?
Jon Grah
0

Suponiendo que todavía está trabajando con líneas de notepad ++ , puede usar una matriz en lugar de texto en columnas

Sub notepadthingrevisit()
    Dim workingRange As Range
    Set workingRange = Range("A1:A3")
    Dim i As Long
    Dim j As Long
    Dim result As String

    Dim myStrings() As String
    For i = 1 To workingRange.Rows.Count
        myStrings = Split(Cells(i, 1), ",")
        'Adjust this for accounting for the first value and remember to trim the " " at the end
        For j = 0 To UBound(myStrings)
            If Left(Trim(myStrings(j)), 1) = 0 Then
                myStrings(j) = Right(Trim(myStrings(j)), (Len(Trim(myStrings(j))) - 1))
            End If
            If myStrings(j) = Int(myStrings(j)) Then myStrings(j) = Int(myStrings(j))
            'Check here for j mod x and insert " "
            result = result & myStrings(j) & ","
        Next
        Cells(i, 5) = result
    Next

End Sub

Simplemente use la información del hilo anterior para insertar sus espacios.

Raystafarian
fuente
NO parece funcionar. No estaba seguro si era para reemplazar notepadthing() o correr después . Intenté ambos y parece intentar reemplazar notepadthing() . Lo que hace es crear una pirámide en la columna E. Tuve que ampliar la columna para que pueda verla en esta captura de pantalla .
Jon Grah
Gary's Studentfixzero() , trabaja como se anuncia. Entonces, después de correr notepadthing(), funciona de maravilla. Eres bienvenido a darle otra puñalada.
Jon Grah
Esto fue en lugar de lo del bloc de notas, pero si tienes lo que necesitas, genial.
Raystafarian
Okay. Pero tengo curiosidad por saber que pasaste de una solución perfecta con notepadthing()y esta solución crea el resultado de la pirámide. ¿Viste la captura de pantalla ?
Jon Grah
No, no vi la pirámide
Raystafarian