Duda sobre Visual Basic

Buenas a todos, vereis estoy tratando de hacer una funcion en Excel con Visual Basic y tengo que tratar de que me coja de todos los multiplos de 9 que haya entre dos numeros el menor y era por si alguien me podria ayudar por que no consigo sacarlo, de momento llevo esto

Function multiploDeNueve(inicio, fin)
For resultado = inicio + 1 To fin - 1
If resultado Mod 9 = 0 Then
multiploDeNueve = resultado
End If
Next
End Function

Si alguien pudiese echarme una mano le estaria eternamente agradecido, muchisimas gracias por adelantado^^
Tienes que controlar si se ha encontrado algún resultado.

Lo mejor sería terminar el bucle for en cuanto encuentres un resultado, no sé de visual basic pero en otros lenguajes esto se hace con break.

Otra opción sería añadir una variable que controle si se ha encontrado un resultado y modificar la condición del if a "si resultado es múltiplo de 9 Y NO encontrado", por ejemplo.

La segunda opción es peor ya que el coste es lineal, recorre el for completamente mientras que la primera opción termina en cuanto encuentra el resultado.
Buenas a todos, vereis estoy tratando de hacer una funcion en Excel con Visual Basic y tengo que tratar de que me coja de todos los multiplos de 9 que haya entre dos numeros el menor y era por si alguien me podria ayudar por que no consigo sacarlo, de momento llevo esto


si he entendido bien quieres de 2 numeros A y B coja el multiplo de 9 menor.

si es asi no es mas facil comparar los 2 numeros cual es menor y hacer un simple bucle hasta el mayor que vaya multiplicando 9*el menor y compruebe si el numero es mayor o igual que el menor.

es decir

A (numero menor)
B (Mayor)

aux = 0
cont = 0
c = 0

If b<a Then 'ya que en este caso B seria mayor
aux = b
b = a
a = aux
end if

While c<=a and c<=b Do
c = cont * 9
cont = cont + 1
end while

if c= 9 and c>a then 'no comparo con ambos ya que el unico casi que esto pasa es que el numero menor sea menor que 9

msgbox("No Existe ningun multiplo de 9 entre ambos numeros")
end if


asi deberia de valerte creo he puesto en la condicion que sea menor de ambos por si te ponen a maldad por ejemplo multiples de 9 entre 2 y 3, el unico multipo posible seria el 0 yo he puesto mensaje de que no hay ninguno porque supongo que si no hay ninguno deberia salir error si no quitalo

el codigo lo he escrito asi a lo rapido sin ponerme a mejorarlo ni a toquetearlo pero creo que vale de ejemplo de lo que pretendo si no dimelo y lo aclaro algo mas.

P.D.: Soy cosciente que ahi el while hace que haya muchas variables tontas pero no me llevo bien con los for y lo he hecho con prisas.
El problema de mi funcion es que en vez de cogerme el multiplo de 9 menor me coge el mayor y no se por que y la duda estaba en que no se que cambiarle para que sea al reves xDDDD
sefirot888 escribió:El problema de mi funcion es que en vez de cogerme el multiplo de 9 menor me coge el mayor y no se por que y la duda estaba en que no se que cambiarle para que sea al reves xDDDD


¿Por casualidad has leído mi comentario?

amuchamu escribió:Tienes que controlar si se ha encontrado algún resultado.
El problema de mi funcion es que en vez de cogerme el multiplo de 9 menor me coge el mayor y no se por que y la duda estaba en que no se que cambiarle para que sea al reves xDDDD


¿Siempre?

¿oh solo en algun caso en concreto?, dime un caso en el que pase (es decir con que valores de entrada y que devuelve) y coloco tu funcion en el Visual studio depuro y te digo haber porque lo hace, asi sera mucho mas rapido.
Le va a sacar siempre el mayor múltiplo de nueve entre inicio y fin porque recorre el for SIEMPRE desde inicio+1 hasta fin+1 en vez de detener los cálculos al encontrar el primer múltiplo.
amuchamu si lei tu comentario, resultado encuentra pero siempre coge el mayor, ¿como puedo hacer para que pare cuando encuentre el primer multiplo? todavia se muy poco de visual basic por que acabamos de empezar en el instituto
david_keen siempre me pasa con cualquier numero que introduzca no se por ejemplo pongo 9 y 36 y en vez de cogerme el 18 que seria el menor multiplo de entre esas dos cifras me coge el 27 que es el mayor

PD: agradezco muchisimo vuestra ayuda, soy un poco inutil con esto por que como ya he dicho llevo muy poquito tiempo y es la primera vez que programo en mi vida y soy muy torpe disculpadme si parezco un ignorante y algunas cosas de las que deciis no las entiendo :(
al final nos hemos tontamente liado con el enunciado xdd.

el fallo es simplisimo y me di cuenta mientras estaba depurando.

Fijate en esto:
If resultado Mod 9 = 0 Then
multiploDeNueve = resultado
End If

ahi te va a entrar siempre que el numero sea multiplo de 9 xdd entonces claro encuentra el primero y sigue xd y sigue asi al llegar al siguiente machaca el valor.

puedes hacer un truquito

If resultado Mod 9 = 0 Then
multiplodenueve = resultado
resultado = fin
End If

ahi tal como lo encuentro como quiero terminar el bucle, a la variable que me sirve de contador le asigno la variable fin, ¿porque? porque asi no se cumple mas la condicion y me termina el bucle for.

es parecido a los breaks y cierres bruscos que tienen otros lenguajes, solo que mas artesanal xd.

PD: agradezco muchisimo vuestra ayuda, soy un poco inutil con esto por que como ya he dicho llevo muy poquito tiempo y es la primera vez que programo en mi vida y soy muy torpe disculpadme si parezco un ignorante y algunas cosas de las que deciis no las entiendo


si estas empezando es normal, la programacion es un ambito muy amplio y es imposible saberlo todo nada mas entrar, ya iras cojiendo el truquillo lo que te recomiendo es mas practica con el depurador usar los puntos de interrupcion etc, y puedes ver el valor de las variables con el Visual studio (tienes la version gratuita express por ahi) si te vas a la variable en depuracion click derecho y Add watch no se la traduccion en español te pone en un cuadro la variable y el valor que tiene en ese momento.
A ver, el problema que tienes es que encuentras una solución pero sigues buscando soluciones, es decir, tienes que parar de buscar soluciones en cuanto encuentras la primera y no modificar multiploDeNueve más.

encontrado = falso
...
si resultado es múltiplo de nueve y NO encontrado
     encontrado = verdad
     multiploDeNueve = resultado
finSi
...


Tiene el problema de que recorres el bucle entero, y esto no tiene sentido, se sabe que el primer múltiplo de 9 va a estar entre inicio+1 e inicio+10.

...
si resultado es múltiplo de nueve
     multiploDeNueve = resultado
     break
finSi
...


Así terminas en cuanto encuentras una solución. No sé cómo es el break en Visual Basic, si lo hay (que me imagino que sí).

Puedes mantener la variable "encontrado" para devolver un 0 si no hay ningún múltiplo de 9 entre inicio y fin.

Opciones hay muchas, una sin bucles:

si inicio+1 mod 9 = 0 entonces
     multiploDeNueve = inicio+1
si_no
     multiploDeNueve = inicio+1 + 9 - (inicio+1) mod 9
     si multiploDeNueve >= fin entonces multiploDeNueve = 0; finSi
finSi


Otra, que viene a ser la misma que la anterior:

multiploDeNueve = inicio+1
si multiploDeNueve mod 9 != 0 entonces
     multiploDeNueve += 9 - (inicio+1) mod 9
     si multiploDeNueve >= fin entonces multiploDeNueve = 0; finSi
finSi


Y seguro que las hay más retorcidas.

Se nota que me aburro a estas horas ^^

Edito: ya te han respondido pero ya que he escrito todo el tostón, lo envío

Vuelvo a editar:

david_keen escribió:puedes hacer un truquito


If resultado Mod 9 = 0 Then
multiplodenueve = resultado
resultado = fin
End If


¿Así sales del for? Pregunto, que no lo sé. ¿No peta Visual Basic si en mitad de un bucle modificas la variable de iteración? Aunque dejara modificar la variable, no veo cómo termina el for, en la siguiente iteración modificaría el valor de resultado al siguiente valor que tocaba.

Al final he buscado el break para Visual Basic y sí existe, sólo tendría que añadir la sentencia "Exit For" donde yo he puesto "break".
¿Así sales del for? Pregunto, que no lo sé. ¿No peta Visual Basic si en mitad de un bucle modificas la variable de iteración? Aunque dejara modificar la variable, no veo cómo termina el for, en la siguiente iteración modificaría el valor de resultado al siguiente valor que tocaba.

Al final he buscado el break para Visual Basic y sí existe, sólo tendría que añadir la sentencia "Exit For" donde yo he puesto "break".


Lo he probado no peta de ninguna forma aunque a veces es peligroso cambiar la variable que hace de contador xd.

y el exit for ni me acordaba de el xd pues seria mas aconsejable usar el exit for en vez de modificar el contador, ya que si cambia la condicion para que termine y te olvidas de cambiarla en el if pos.... la jodiste xd y buscando un fallo para nada.
¡¡¡Muchisimas gracias a los dos!!!! Al añadir el Exit for antes que el End if ya me funciona he probado con varias cifras y a la perfeccion, al final era solo añadir esa tonteria xDDD en serio muchisimas gracias me esta costando un monton entender muchas cosas ya que es el primer lenguaje de programacion con el que empiezo y me habeis salvado la vida^^
11 respuestas