¿Cómo indico que valor quiero calcular?

Que tal! Espero que te encuentres bien cuando leas esto, fíjate que tengo un problemilla con una hoja de excel. En esta hoja tengo varios datos que ingreso mediante el uso de formularios; en el formulario se introducen datos de diferentes tipos (fecha, texto y numérico) pero para ahorrar espacio opté por pegar todos los datos introducidos en el formulario en una sola celda ("FECHA, CONCEPTO DE PAGO, MONTO") cada que se copian los datos del formulario a la celda en cuestión se suma el valor numérico a otra columna y aquí es donde viene mi problema: noté que algunos de los datos en la columna donde se concentran las sumas de los valores numéricos fueron alterados (pudo ser por error o intencionalmente) lo que quiero lograr ahora es generar un procedimiento que busque los valores numéricos en cada fila y los sume a la columna correspondiente, una especie de auditoria para que cada gasto que tengo en mi área de captura quede justificado en la columna de totales. Ya tengo mi modulo con el código para búsqueda y la suma de los valores lo único en lo que te pido que me ayudes es en explicarme como indicar que solo necesito el valor que se encuentra en la extrema derecha de la celda donde están los valores (el monto siempre se encuentra en esta posición).
Espero que puedas ayudarme con mi problmilla.
Saludos desde Long Beach California

1 respuesta

Respuesta
1
OK. Creo haber entendido el problema. Para resolverlo, dándote la mayor flexibilidad en el uso de la herramienta, te propongo usar una Función Definida por el Usuario (UDF) basada en Visual Basic. Esta, analiza carácter por carácter de derecha a izquierda de tu texto hasta que encuentra un espacio o hasta que termina toda la cadena.
Devolverá cero (0) si no hay una cadena de texto o si no hay un número en ella.
Si estás de acuerdo, activa el editor de Visual Basic (presiona Alt+F11), inserta un nuevo módulo ("Insertar", "´Modulo") y pega el siguiente código:
Function UltNum(LaCelda As String) As Long
Application.Volatile
Texto = Trim(LaCelda)
ElNumero = ""
If Len(Texto) > 0 Then
For UltValor = Len(Texto) To 1 Step -1
Carakter = Mid(Texto, UltValor, 1)
If IsNumeric(Carakter) Then
ElNumero = Carakter & ElNumero
ElseIf Carakter = " " Then
Exit For
End If
Next
End If
If Len(ElNumero) = 0 Then
UltNum = 0
Else
UltNum = Val(Trim(ElNumero))
End If
End Function
Cierra el editor de Visual basic y graba el archivo.
Ahora tendrás una función que, sobre una celda (B5, por ejemplo), devolverá el número de la derecha.
Luego, podrás operar con esta celda como con cualquier otra, por ejemplo comparándola con la celda donde se concentran las sumas de los valores numéricos.
Desde luego, si prefieres hacerlo como una rutina, bastará que la incorpores como tal en un bucle que asigne a la variable "LaCelda" un valor con una propiedad tipo:
La Celda =ActiveCell.Value
Pero prefiero la UDF...
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
A cambio de mi tiempo, sólo te pido dos cosas:
- Finaliza (con puntaje y comentario) esta pregunta
- Ingresa al sitio www.porloschicos.com y, si quieres,
presiona el botón de donación (es gratis).
Confío en que lo harás.
Ya probé la UDF y me funcionaba bien hasta que note que los valores con decimales los anotaba como si fueran un entero, ejem: 245.50 lo pasaba como 24550. Agregue un elseif por si encontraba un punto también lo agregara a elnumero pero al final la función solo me devuelve la parte a la izquierda del punto.
Function UltNum(LaCelda As String) As Long
Application.Volatile
Texto = Trim(LaCelda)
ElNumero = ""
If Len(Texto) > 0 Then
For UltValor = Len(Texto) To 1 Step -1
Carakter = Mid(Texto, UltValor, 1)
If IsNumeric(Carakter) Then
ElNumero = Carakter & ElNumero
ElseIf Carakter ="." Then
ElNumero = Carakter & ElNumero 'este el que agregue'
ElseIf Carakter = " " Then
Exit For
End If
Next
End If
If Len(ElNumero) = 0 Then
UltNum = 0
Else
UltNum = Val(Trim(ElNumero))
End If
End Function
¿Qué puedo hacer para corregirlo?
Había considerado que siempre serían enteros, por ello definí a la función UltNum como Long (que sólo acepta enteros).
Si quieres que considere decimales defínela como Double
La siguiente versión incluye además el modo de evaluar el punto decimal para sirva en cualquier equipo, independientemente de su configuración regional:
Function UltNum(LaCelda As String) As Double
Application.Volatile
Texto = Trim(LaCelda)
ElNumero = ""
If Len(Texto) > 0 Then
For UltValor = Len(Texto) To 1 Step -1
Carakter = Mid(Texto, UltValor, 1)
If IsNumeric(Carakter) Then
ElNumero = Carakter & ElNumero
ElseIf Carakter = Application.International(xlDecimalSeparator) Then
ElNumero = Application.International(xlDecimalSeparator) & ElNumero
ElseIf Carakter = " " Then
Exit For
End If
Next
End If
If Len(ElNumero) = 0 Then
UltNum = 0
Else
UltNum = CDec(Trim(ElNumero))
End If
End Function
---
En caso de que pudieras tener una cadena de caracteres sin espacios y con otros números además de los de la extrema derecha, te convendría usar éstaa variante:
Function UltNum(LaCelda As String) As Double
Application.Volatile
Texto = Trim(LaCelda)
ElNumero = ""
If Len(Texto) > 0 Then
For UltValor = Len(Texto) To 1 Step -1
Carakter = Mid(Texto, UltValor, 1)
If IsNumeric(Carakter) Then
ElNumero = Carakter & ElNumero
ElseIf Carakter = Application.International(xlDecimalSeparator) Then
ElNumero = Application.International(xlDecimalSeparator) & ElNumero
Else
Exit For
End If
Next
End If
If Len(ElNumero) = 0 Then
UltNum = 0
Else
UltNum = CDec(Trim(ElNumero))
End If
End Function
Como verás, ésta detiene la evaluación de caracteres apenas encuentra algo distinto a un número o al separador decimal.
Lije la que te parezca más apropiada a tu caso.
Un abrazo!
Fernando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas