Vba => Bat

Resuelto
zapp56 -  
 zapp56 -
Bonjour,

Estoy buscando desde hace algunas horas y aún no he encontrado respuesta a esta pregunta, que muchos ya deben haberse hecho...

Tengo una variable de texto, en un cuadro de texto, en un userform de Excel, que contiene la ruta de acceso de un directorio: "c:\Docs\Bdd"

Deseo que ciertos usuarios puedan parametrizar esta ruta. Un archivo por lotes se encarga de todos los trámites de creación de carpetas.

El archivo por lotes se llama "run.bat"

Mi macro va a llamar a la ejecución del archivo por lotes. Me gustaría que también le enviara la variable que contiene la ruta de acceso para tener un lote auto-modulable.

¿Podrían ayudarme, por favor?

Atentamente.

4 respuestas

  1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773
     
    Hola,

    La forma más simple y práctica de crear un directorio y todos sus subdirectorios únicamente cuando sea necesario (si no existen) es:
    Private Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Any) As Long Public Const monRep$ = "C:\Docs\Bdd\d1\d2\d3\" Sub Creation_Repertoire() 'fuentes : UcFoutu : 'http://www.developpez.net/forums/d613347/logiciels/microsoft-office/excel/macros-vba-excel/tester-repertoire-existe-creer-non/ SHCreateDirectoryEx 0, monRep, ByVal 0& End Sub


    Hay que adaptarlo, por supuesto. La constante monRep debe ser una variable si deseas que el usuario pueda modificarla.
    --
    🎼 Atentamente,
    Franck 🎶
    3
    1. zapp56
       
      ¡GRACIAS!!!!!

      ¡Muchas gracias, es exactamente lo que buscaba! ¡Este código funciona perfectamente!
      0
    2. zapp56
       
      Je suis désolé, je ne peux pas fournir d'explications ou de commentaires.
      0
      1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773 > zapp56
         
        Buenas noches,

        Ausente durante varios días, solo tomo 5 minutos para responderte.

        Sin entrar en detalles, infórmate (si aún no lo sabes) sobre las API de Windows.
        En resumen, son funciones puestas a disposición de todos por Microsoft. Se desarrollan en archivos dll.
        Aquí, utilizaremos una de las funciones contenidas en el archivo shell32.dll. Haz una búsqueda en tu ordenador, lo tiene.
        Esta función SHCreateDirectoryEx está exactamente para servir al propósito que tienes hoy, la creación, cuando sea necesario, de un directorio.
        Se declara, en VBA, en la cabecera del módulo. (Esto recuerda la declaración de funciones en lenguaje C...)
        Una vez declarada, en la cabecera del módulo, puedes utilizarla libremente en tu módulo, o en tu proyecto en globalidad si la has declarado como Pública.

        Más información especialmente sobre sus parámetros...
        ¡A++!
        0
    3. zapp56
       
      ¡De nada! ¡Gracias a ti por tu confianza!
      0
  2. gbinforme Mensajes publicados 14930 Fecha de registro   Estado Colaborador Última intervención   4 744
     
    Hola,

    Cuando lanzas tu batch, solo tienes que agregar la ruta del archivo:
    run.bat ruta
    y en tu batch será el primer parámetro %1
    --
    Siempre zen
    La perfección se alcanza, no cuando no hay nada más que agregar, sino cuando no hay nada más que retirar. Antoine de Saint-Exupéry
    0
    1. zapp56
       
      Gracias por tu respuesta, pero no he entendido :(
      Para mayor claridad:
      "Run.bat" es mi archivo por lotes, en la carpeta "c:\Docs\"
      REPERT = "c:\Docs\Bdd\" (como cadena) (modifiable en el cuadro de texto del usf)

      Cuando llamo:
      shell("c:\Docs\Run.bat", AppWinStyle.NormalFocus)

      Me gustaría que envíe a mi archivo "Run.bat" la variable REPERT.
      Así, el archivo por lotes contendría la línea de comando:
      MD %REPERT%


      ¿Soy más claro?
      0
  3. blux Mensajes publicados 2046 Fecha de registro   Estado Moderador Última intervención   3 455
     
    Hola,

    en VBA, sabemos que se pueden ejecutar comandos de archivos, ¿por qué no utilizas esta funcionalidad?

    MkDir "directorio" 


    --
    A+ blux
     "Los tontos se atreven a todo.
    Incluso es por eso que los reconocemos"
    0
    1. zapp56
       
      Hola, blux, y gracias por responder.
      El problema de "MkDir" es que la ruta de acceso no puede contener más de una carpeta.
      Sé que hay un procedimiento para crear ciertas carpetas, pero no lo he entendido, así que opté por un batch.
      Además, es posible que mi batch me sirva más adelante si logro enviarle una variable.

      O tienes una manera sencilla de crear carpetas según una ruta variable en VBA, en un procedimiento simple... Recuerdo que la extracción de la ruta se hace a partir de un textbox en usf.
      0
      1. blux Mensajes publicados 2046 Fecha de registro   Estado Moderador Última intervención   3 455 > zapp56
         
        Todo es posible (o casi) a través de VBA en lo que respecta a la gestión de archivos...
        ¿Qué entiendes por límite de una sola carpeta?
        0
    2. zapp56
       
      Si hago:
      MkDir ("c:\Docs\")

      efectivamente creará una carpeta en el directorio c:
      Pero si hago:
      Mkdir ("c:\Docs\Bdd")

      Eso no creará una carpeta "Docs" y luego una carpeta "Bdd".
      Lo que quiero es que la ruta de acceso pueda ser totalmente variable.

      En un batch, si hago
      MD C:\Docs\Bdd\d1\d2\d3
      esto creará todas las carpetas, subcarpetas, etc. del camino de acceso.
      0
      1. blux Mensajes publicados 2046 Fecha de registro   Estado Moderador Última intervención   3 455 > zapp56
         
        Es tu quien debe manejarlo a través de un bucle...
        0
    3. zapp56
       
      Ok, me voy a centrar en el vb entonces ;)

      Gracias.
      0
  4. gbinforme Mensajes publicados 14930 Fecha de registro   Estado Colaborador Última intervención   4 744
     
    Hola,

    Quisiera que ella también le enviara la variable que contiene la ruta de acceso
    Con
    shell("c:\Docs\Run.bat " & REPERT & ", AppWinStyle.NormalFocus)
    , envías bien tu acceso.

    Luego, en un batch, si haces
    MD %1
    , esto dará
    MD C:\Docs\Bdd\d1\d2\d3 
    si REPERT tenía como valor "C:\Docs\Bdd\d1\d2\d3": lo que quieres, ¿no?
    --
    Siempre zen
    La perfección se alcanza no cuando no hay nada más que añadir, sino cuando no hay nada más que retirar. Antoine de Saint-Exupéry
    0
    1. zapp56
       
      He probado tu código. Tengo un error: separador de lista [...]
      He intentado sin :&REPERT&"
      Lo mismo.
      0
    2. gbinforme Mensajes publicados 14930 Fecha de registro   Estado Colaborador Última intervención   4 744
       
      Es seguro que si pones esto, &REPERT&, no funcionará. Había una comilla de más:
      shell("c:\Docs\Run.bat " & REPERT & ,AppWinStyle.NormalFocus)
      y hay que poner el espacio.
      0
    3. zapp56
       
      Está bien, lo probaré mañana. Gracias a todos.
      0