Macro para guardar en una memoria USB
waea
-
waea Mensajes publicados 43 Estado Miembro -
waea Mensajes publicados 43 Estado Miembro -
Hola,
aquí está mi pequeño problema: no puedo escribir una macro que me permita guardar un archivo de Excel en una memoria USB cuya letra puede cambiar (F, G...); todo esto conectado a un pequeño botón.
el archivo a guardar es un archivo xlsm, así que funciona con macros
¿alguien puede ayudarme a resolver este enigma?
gracias de antemano
aquí está mi pequeño problema: no puedo escribir una macro que me permita guardar un archivo de Excel en una memoria USB cuya letra puede cambiar (F, G...); todo esto conectado a un pequeño botón.
el archivo a guardar es un archivo xlsm, así que funciona con macros
¿alguien puede ayudarme a resolver este enigma?
gracias de antemano
Configuración: Windows Vista Firefox 3.5.7
13 respuestas
-
buenas noches
función para conocer la letra de la usb conectada
Function letra_usb() ordi = "." Set objet_WMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & ordi & "\root\cimv2") Set liste_pilotes = objet_WMI.ExecQuery _ ("Select * from Win32_LogicalDisk") For Each pilote In liste_pilotes If pilote.DriveType = 2 Then letra_usb = pilote.DeviceID Exit Function End If Next letra_usb = "ninguna memoria conectada" End Function Sub test() msgbox letra_usb
End Sub
--
:-x-
-
Buenas noches Jean-Pierre, michel_m
el código de michel_m es correcto, detecta el primer "disco extraíble" (drivetype = 2) conectado (pero puede ser otra cosa, Windows no hace realmente la diferencia entre un disco externo, un lector de tarjetas de memoria o incluso un lector de disquetes conectado por USB - todo es un 'disco extraíble')... la pregunta que surge es ¿a qué corresponde esta unidad A: en tu máquina?
--
Se entiende por una bonita solución, la solución simple y fácil a un problema difícil y complicado. -
-
Hola,
Para nuestra cultura informática
vbscript (encontrado en la red de la lista de controladores). Es necesario que el componente esté instalado para ser tomado en cuenta
strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colDisks = objWMIService.ExecQuery _ ("Select * from Win32_LogicalDisk") For Each objDisk in colDisks Wscript.Echo "DeviceID: "& objDisk.DeviceID Select Case objDisk.DriveType Case 1 Wscript.Echo "No root directory. Drive type could not be " _ & "determined." Case 2 Wscript.Echo "DriveType: "& "Unidad extraíble." Case 3 Wscript.Echo "DriveType: "& "Disco duro local." Case 4 Wscript.Echo "DriveType: "& "Disco de red." Case 5 Wscript.Echo "DriveType: "& "Disco compacto." Case 6 Wscript.Echo "DriveType: "& "Disco RAM." Case Else Wscript.Echo "No se pudo determinar el tipo de unidad." End Select Next
así que en casa la memoria USB se encuentra en la unidad G: y el disco duro externo en H:
--
:-x -
-
-
Buenas noches y gracias por haber respondido...............pero
para ganar en precisión, aquí está lo que me gustaría;
una caja de diálogo que me conecte de inmediato a la memoria USB y al archivo en cuestión
con la posibilidad de cambiar el nombre del archivo si por casualidad quisiera tener varios por diferentes razones
después, obviamente, como la caja de diálogo es estándar, solo tendría que guardar mi trabajo
espero que todo esto sea más claro
gracias de antemano -
Bin, ¡es VBA básico!
Tienes la letra, conoces la ruta en tu clave, así que utilizas open filename
o cambias de unidad con
chdir la letra usb
luego get openfilename, puedes hacer esto con el grabador de macros...
--
:-x -
Hola,
gracias primero que nada, pero me gustaría tener una idea del código escrito en caso de que la letra de la clave pudiera cambiar.
todo esto con la información que proporcioné anteriormente.
gracias de nuevo -
Buenas noches,
¿quieres guardar siempre en la misma memoria? En ese caso podríamos utilizar el nombre de la memoria, como aquí....
si no, también podemos guardar en la primera memoria USB detectada (en caso de que haya varias, pero si hay un disco externo podría pasar por encima también) que sea "escribible" (en caso de una memoria protegida)....para evitar el asunto del disco externo también podemos imaginar guardar en una carpeta específica (así que si está ausente no es el disco correcto...)...en fin, muchas cosas (probablemente pasando por wmi como propone michel_m)...dínos....
--
Se entiende por una bella solución, la solución simple y fácil a un problema difícil y complicado. -
Hola,
he probado el código de michel_m pero se bloquea aquí
Wscript.Echo "DeviceID: " & objDisk.DeviceID
además, mi unidad está en G pero podría estar también en F..........entonces, ¿qué puedo hacer?
estoy atascado aquí!
gracias de antemano
waea -
Hola,
si quieres utilizar el código de michel_m, utiliza el primero, el segundo es un vbs...
¿Has mirado el enlace de mi publicación 6? ¿Puedes responder a estas preguntas, por favor (básicamente cómo identificar la memoria USB, ya que existen muchos tipos de "unidades extraíbles" y Windows no distingue entre ellas...)?
--
Se entiende por una buena solución la solución simple y fácil a un problema difícil y complicado. -
Hola,
después de probar el primer código, me aparece un cuadro de diálogo con la unidad F reconocida para mi USB insertada.
pero no puedo hacer nada más..........ni copiar el libro con macros ni nada en absoluto.
¡ayuda por favor!
waea -
Re,
no respondes a mis preguntas....tu problema está mal formulado (o no del todo) ! ¿qué hacemos si hay varias llaves USB conectadas (varios 'discos extraíbles'), cómo identificamos la llave en la que guardar?, ¿tomamos cualquiera (corriendo el riesgo de escribir en un disco externo o una tarjeta SD u otra cosa)? Luego, si quieres que escribamos todo el código por ti, tengo que decir que no hay que exagerar, un poco de investigación y deberías poder encontrar el código para guardar (al mismo tiempo, soy amable hoy, si respondes a las preguntas quizás bien te lo haga...)
"help me please ! " => pues escucha, aquí hago lo que puedo pero eres tú quien no me ayuda a ayudarte :p
--
Se entiende por una hermosa solución, la solución simple y fácil de un problema difícil y complicado.-
Hola y perdón si te he ofendido.............¡no había tomado el tiempo para entender bien tus solicitudes!
En realidad, solo hay una llave que conectar y puede llevar ya sea la letra F o la letra G en el caso de otra llave que tiene una parte en la que puedo poner datos.
No me daba cuenta de que la letra de la llave podía tener importancia.
En el caso de que sea más fácil tener solo una letra, entonces debería elegir G.
Había encontrado un código que me permitía transferir el archivo, pero no podía abrirlo luego desde la mencionada llave???????????
Me decían que el archivo no era reconocido.............así que mi código muy simple no funciona. Por eso estoy apelando a ti.
Me doy cuenta de que te estoy pidiendo mucho y si no quieres seguir, lo entenderé muy bien.
Ya has hecho mucho.
¿Te sirven estas informaciones?
Saludos cordiales
waea
-
-
Re, no hay problema, no estoy "ofendido", quizás solo un poco frustrado, siento que la solución está cerca pero faltan elementos y no lo logramos....
Bueno, entonces, lo explico de nuevo, la dificultad aquí consiste en asegurarse de registrar en el "disco extraíble" correcto, ya que así es como Windows reconoce las llaves USB, pero también un montón de otras cosas como por ejemplo un disco duro o incluso un reproductor de mp3 o incluso una cámara en ciertos casos.... por lo tanto, necesitamos encontrar una manera de identificar la llave USB en la que registrar en caso de que varios dispositivos estén conectados, esto puede ser el nombre de la llave USB, un archivo o carpeta ya presente en la llave u otra cosa...
Te propongo esto:
1 - tienes que localizar el nombre de tu llave USB (lo que aparece en "mi PC"), si no tiene nombre ("disco extraíble") asígnale uno.
2 luego pega este código en tu archivo de Excel adaptando el nombre de tu llave (en mi caso yo había puesto USB TOM):Sub usbtransfer() strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2") Set colDisks = objWMIService.ExecQuery _ ("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 2", , 48) For Each objdisk In colDisks If objdisk.VolumeName = "USB TOM" Then rdrive = objdisk.deviceid & "\" End If Next objdisk ActiveWorkbook.SaveAs rdrive & ActiveWorkbook.Name End Sub
Si la solución con el nombre no es adecuada, habrá que encontrar otra manera de estar seguros de que estamos en el dispositivo USB correcto (¿presencia de un archivo/carpeta?)....
--
Se entiende por una bella solución, la solución simple y fácil de un problema difícil y complicado. -
Re,
sí, pero podemos no mostrar este mensaje reemplazando:ActiveWorkbook.SaveAs rdrive & ActiveWorkbook.Name
por:Application.DisplayAlerts = False ActiveWorkbook.SaveAs rdrive & ActiveWorkbook.Name Application.DisplayAlerts = True
--
Por una bella solución, entendemos la solución simple y fácil a un problema difícil y complicado.-
Hola,
de hecho, al probar tu código todo funcionó bien en la clave, pero luego cerré Excel y tras un reinicio de Windows, tuve una pantalla azul que indicaba un apagado no planificado de Windows.
tenía que elegir una opción: modo seguro, etc.... Windows normal
¿puedes explicarme qué significa esto?
para mí esto viene del procedimiento que seguramente causa un pequeño problema a Windows.
sin duda, hay alguna manipulación que debo hacer además?
gracias de antemano
waea
-
-
Hola,
Un pequeño consejo, cuando se trabaja con una memoria USB, antes de quitarla, se recomienda ir al equipo y hacer clic derecho sobre el dispositivo correspondiente y clic [Expulsar].
Haga una prueba para ver si el problema está en este nivel.
--
Saludos.
Jean-Pierre -
Hola waea, Jean-Pierre,
Pienso como Jean-Pierre, puede que sea un problema con el uso de la memoria USB... En cuanto al procedimiento VBA, no veo qué podría causar este problema, lo he probado varias veces y hasta acabo de intentarlo en otra máquina (con Vista), no hay problema.... Además, llevo bastante tiempo utilizando este tipo de procedimientos en VBA/VBS y nunca he observado este comportamiento...
¿Has hecho una nueva prueba desde entonces? ¿El problema se reproduce en cada uso de la macro?
--
Se entiende por una buena solución, la solución simple y fácil de un problema difícil y complicado.-
Re-buenas,
primero que nada, he reiniciado y ahora funciona: de hecho tengo una llave que contiene un software integrado que requiere una contraseña y un menú. Hice clic para cerrar la llave a través del programa integrado, pero al parecer eso no es suficiente.
También tengo que pasar por el menú de expulsión de Windows.
Por otro lado, probé con otra llave que también nombré PRI (por privado), que esta vez está en F: (mientras que la llave anterior estaba en G:); el archivo también se guarda, pero en el explorador de Windows no tengo la versión de la copia (fecha y hora) del registro.
El archivo parece abrirse también, pero sería práctico tener esa información.
¿Puede explicarme, por favor?
Gracias de antemano.
waea
-