Problemillas al llamar a la calculadora...

Hola Fejoal.
Te agradecería enormemente que me echaras un cable, porque tengo una duda y me he vuelto loco para intentar resolverla, pero sin resultados satisfactorios.
Tengo una aplicación que llama a la calculadora de windows. Para lo cual uso el siguiente código:
'Esta función me la facilitó nuestro amigo Mauricio, y sirve para buscar una aplicación en ejecución
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Esta macro también es de Mauricio, pero yo le he hecho alguna ligera moficicación, puesto que no he asignado variables, como el normalmente hace, ya que así "veo" mejor lo que hace el código
Sub Llamar_Calculadora()
On Error GoTo Fin
'Busca si ya esta en ejecución la calculadora y si no la encuentra
If FindWindow(vbNullString, "Calculadora") = 0 Then
'Ejecuta la Calculadora, y al poner 1, recibe el enfoque,
'para lo cual busca si está en alguno de estos directorios
Shell "C:\WINDOWS\CALC.EXE", 1
Else
'En caso de que ya esté en ejecución la calculadora, solo la activa
AppActivate "Calculadora", False
End If
Exit Sub
Fin:
Err.Clear
End Sub
El problema con el que me encuentro es ¿qué pasa con los usuarios que tienen otro sistema operativo, como por ejemplo Windows NT?. ¿Y el resto, Win98, Win2000, etc..?.
Obviamente no se ejecuta la calculadora, puesto que no la encuentra, ya que normalmente el directorio del sistema operativo no suele coincidir con el de WINDOWS (puede ser WINNT, WIN98, e incluso para los usuarios de windows95, el directorio puede ser WIN95).
He probado a poner el siguiente código en sustitución de la línea Shell:
Shell "C:\WINDOWS\CALC.EXE", 1
Shell "C:\WINDOWS\SYSTEM32\CALC.EXE", 1
Shell "C:\WIN\CALC.EXE", 1
Shell "C:\WIN\SYSTEM32\CALC.EXE", 1
Shell "C:\WIN95\CALC.EXE", 1
Shell "C:\WIN95\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWS95\CALC.EXE", 1
Shell "C:\WINDOWS95\SYSTEM32\CALC.EXE", 1
Shell "C:\WIN98\CALC.EXE", 1
Shell "C:\WIN98\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWS98\CALC.EXE", 1
Shell "C:\WINDOWS98\SYSTEM32\CALC.EXE", 1
Shell "C:\WIN2000\CALC.EXE", 1
Shell "C:\WIN2000\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWS2000\CALC.EXE", 1
Shell "C:\WINDOWS2000\SYSTEM32\CALC.EXE", 1
Shell "C:\WINXP\CALC.EXE", 1
Shell "C:\WINXP\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWSXP\CALC.EXE", 1
Shell "C:\WINDOWSXP\SYSTEM32\CALC.EXE", 1
Shell "C:\WINNT\CALC.EXE", 1
Shell "C:\WINNT\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWSNT\CALC.EXE", 1
Shell "C:\WINDOWSNT\SYSTEM32\CALC.EXE", 1
Shell "C:\WINNT\SYSTEM32\CALC.EXE", 1
Shell "C:\WINDOWSNT\SYSTEM32\CALC.EXE", 1
El la oficina tengo WindowsNT (la calculadora está en la partición C:\WINNT\SYSTEM32), y la aplicación no la llama. Supongo que es porque solo ejecuta la primera línea de código, y ahí se para. Si borro todas las líneas Shell, excepto la antepenúltima, entonces sí que funciona, ya que es en esa partición donde se encuentra la Calculadora.
Bueno, mi pregunta es ¿cómo puedo llamar a la calculadora si no sé el directorio del sistema operativo, o incluso el subdirectorio donde se encuentra específicamente la calculadora?.
Se me hace complicadillo, porque me gustaría que la calculadora buscara entre varios directorios, pero aun usando cogido para que busque si existe un directorio, podría darse el caso de que un usuario tuviera el directorio WIN95 y WIN98, por ejemplo, porque ha actualizado la versión de windows. No se si me he explicado correctamente...
En definitiva, ¿es posible que la macro busque no solo el directorio, sino el programa "Calc.exe" (o "Calculadora.exe" si es que en verisones posteriores a Win95 o WinNT 4.0, la calculadora tiene ese nombre, cosa que desconozco), y si lo encuentra, que lance esa aplicación (la calculadora), y en caso contrario, que vaya reastreando el siguiente directorio, de los que te he puesto en el ejemplo del Shell?
Miles de gracias por tu colaboración y por el tiempo que te hago perder.
Mr.Dudas

1 respuesta

Respuesta
1
Probablemente, haya variantes y formas más ortodoxas de resolver tu problema. (Seguramente Valedor te daría una solución más apropiada, aún puedes consultarlo en su sitio: http://www.vbalym.netfirms.com/)
Sin embargo me pareció un desafío interesante y después de muchísimos intentos llegué a esto:
Primero necesitarás un pequeño archivo .bat (un script) que bucee la PC en búsqueda del directorio donde está la calculadora (Para esto D.O.S. es muy veloz y práctico)
Este archivo debe estar copiado en el directorio raíz (C:\)
Tal archivo debe contener estas dos líneas:
C:\
Dir Calc.exe /s /B > CalcDir.txt
Esto dejará en un archivo de texto (CalcDir.txt) la dirección donde lo encontró.
Luego la siguiente macro
cargará una variable con su contenido:
Sub calcdir()
Dim CalcFolder As String
If Dir("C:\getcalc.bat") = "" Then
MsgBox "Falta archivo de captura de direccion de calculadora"
Else
Application.ScreenUpdating = False
Shell "C:\getcalc.bat", 0
Workbooks.OpenText ("C:\CalcDir.txt")
CalcFolder = Range("A1").Value
Workbooks("CalcDir.txt").Close False
Application.ScreenUpdating = True
If Len(CalcFolder) > 1 Then
Shell CalcFolder, 1
Else
MsgBox "No se encontró la aplicación de calculadora"
End If
End If
End Sub
Claro está, puedes anidarla dentro de la otra luego de la línea:
If FindWindow(vbNullString, "Calculadora") = 0 Then
Las pruebas que ejecuté, resultaron satisfactorias, pese a lo "doméstica" que es mi solución.
Pruébalo y comentame.
Un abrazo grande!
Fernando
Sé que te ha dado mucho trabajo llegar a dar con una solución al problema que te planteé, pero veo que la final lo has conseguido. Yo creía que MSDOS era ya solo un recuerdo del pasado, pero veo que no. Hace 14 años hice un curso de MSDOS (año 1.987-88) y veo que todavía hoy se le puede sacar algún provecho. A pesar de que hice ese curso, desconocía el uso y lo que es peor aún, la existencia, del parámetro "/B", ... 14 años después ya sé para que sirve :-)
Bueno, después de este breve comentario paso a comentarte una cuestión sobre el macro que me has proporcionado.
Cuando lo ejecuto, me sale el mensaje de error 1004 en tiempo de ejecución, y concretamente, es debido a que todavía no se ha generado el archivo "CalcDir.txt". ¿Por qué?. Bueno, pues porque mi PC tarda entre 1 y 2 segundos en buscar el path de la aplicación Calculadora. Por eso, cuando el macro salta a la siguiente linea, todavía está sin generarse el archivo de texto. Bueno, eso es solventable, si antes de ejecutar el macro, se ejecuta el fichero bat, de tal forma que cuando se llame a la calculadora mediante el macro, ya estará grabado el fichero de texto con la ruta.
He buscado algún método o propiedad que permita buscar un archivo, en un directorio o subdirectorio, sin necesidad de conocer el nombre de estos últimos, pero no he dado con ello. ¿Por qué Bill Gates no incorpora una instrucción equivalente a la de "/s" de MSDOS?.
Me parece una excelente solución la que propones, mediante el fichero bat.
Ingenuo de mí, se me había ocurrido algo como esto (después de consultar la ayuda de VBA, y de hacer algunas modificaciones vía: prueba y error)...
Sub BuscarCalculadora()
Dim Ruta As String
With Application.FileSearch
.LookIn = "C:\/s"
.FileName = "Calc.exe"
If .Execute > 0 Then
Range("A1") = .FoundFiles(1)
Ruta = Range("A1").Value
Shell Ruta, 1
Else
MsgBox "No se ha encontrado la Calculadora."
End If
End With
End Sub
Pero nada, el parámetro "/s" no lo reconoce, porque el sr. Bill Gates no ha inventado algo similar en VBA, a lo que ya existía como mínimo, hace 14 años en MSDOS.
Un millón de gracias por tu paciencia, por el tiempo que me has dedicado a resolver el problema, y por la excelente solución que me has proporcionado.
Un fuerte abrazo!
Javier.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas