Los datos que produzco deben tener un formato de número específico, que depende de qué tan grande o pequeño sea el número.

Los números> = 100 no deben tener lugares decimales,> = 10 deben tener un lugar decimal (incluso si es un cero),> = 1 debe tener dos lugares decimales (incluso si el último es un cero), 0.999-0.001 debe tener tres lugares decimales (incluso si el último es un cero), y 0,0009-0,0001 debe tener cuatro lugares decimales, nuevamente sin importar cuál sea el número en el último lugar decimal.

Entonces, esencialmente, necesito un código, o una forma, de mirar un número y darme esos lugares decimales específicos. Sé que puedo formatearlos individualmente, pero estamos hablando de miles y miles de números que estaría formateando. He intentado usar la función round pero no me da ceros finales.

Esto es actualmente lo que estoy usando como una función en la hoja de cálculo que funciona para todo menos ceros finales:

=IF(VLOOKUP($A$21,'Copied Data'!$A$15:$FL$140,23)>'Copied Data'!U$7,IF('Copied Data'!W16<0.001,ROUND('Copied Data'!W16,4),IF('Copied Data'!W16>=0.001,ROUND('Copied Data'!W16,3),IF('Copied Data'!W16>0.999,ROUND('Copied Data'!W16,2),IF('Copied Data'!W16>9.999,ROUND('Copied Data'!W16,1),IF('Copied Data'!W16>99.999,ROUND('Copied Data'!W16,0)," "))))),"<"&IF('Copied Data'!U$7<0.001,ROUND('Copied Data'!U$7,4),IF('Copied Data'!U$7>=0.0001,ROUND('Copied Data'!U$7,3),IF('Copied Data'!U$7>0.999,ROUND('Copied Data'!U$7,2),IF('Copied Data'!U$7>9.999,ROUND('Copied Data'!U$7,1),IF('Copied Data'!U$7>99.999,ROUND('Copied Data'!U$7,0)," "))))))

Si hay una forma mejor de hacer esto, o una forma de escribir una macro en VBA, ¡sería genial! Gracias.

0
AWesley 19 feb. 2021 a las 19:17

1 respuesta

La mejor respuesta

Algo como esto se ocupará de los modificadores:

Dim rng As Range, c As Range, op, v

Set rng = ActiveSheet.Range("A1:A100") 'for example, or = Selection

For Each c In rng.Cells
    v = Trim(c.Value)
    If Len(v) > 0 Then
        'if the value has a modifier, remove it
        op = ""
        If v Like ">*" Or v Like "<*" Then
            op = Left(v, 1)
            v = Trim(Right(v, Len(v) - 1))
        End If
    
        If IsNumeric(v) Then
            v = CDbl(v)
            If v > 0.0001 And v <= 0.00099 Then
                c.Value = v
                c.NumberFormat = op & "[format1]" 'include any modifier in the format
            ElseIf v > 0.001 And v <= 0.999 Then
                c.Value = v
                c.NumberFormat = op & "[format2]"
            Else
                'you should probably include a general format so all
                ' cells which might have modifiers get the same treatment
            End If
            'add other cases as needed
        End If
    End If

Next c

Donde [formato1], etc. son los formatos que obtuvo de su grabación de macros

Tenga en cuenta que los modificadores ya no forman parte del valor de la celda después de esto, solo existen en el formato de celda. Eso significa que puede trabajar con las celdas como números, pero dependiendo de lo que necesite hacer, eventualmente podría ser apropiado o no.

Si solo desea cambiar el formato de la parte numérica del valor de la celda, puede hacer algo como:

c.Value = Application.Text(v, op & "0.0000")
0
Tim Williams 26 feb. 2021 a las 16:43