Forzar la confirmación de "sí" para el registro
Resuelto
Ramon1
Mensajes publicados
364
Fecha de registro
Estado
Miembro
Última intervención
-
Ramon1 Mensajes publicados 364 Fecha de registro Estado Miembro Última intervención -
Ramon1 Mensajes publicados 364 Fecha de registro Estado Miembro Última intervención -
Hola,
He registrado el inicio de una macro en el Programador de tareas, que lanza la actualización a partir de una macro "Echéance" cada 3 de cada mes.
También genero el registro de mi archivo en el C:\temp y una copia de seguridad en el E:\.
Pero deseo que el usuario no sea solicitado durante la macro, y por lo tanto, que al mostrar el cuadro: Confirmar el registro: El archivo ya existe, ¿desea reemplazarlo?, "sí" o "no", se fuerce a SÍ.
He encontrado 2 líneas de código que parecen corresponder a mi deseo, pero esto funciona para mi primer registro en C:\, ¡pero para mi copia de seguridad en E:\ el registro no se realiza!
Aclaro que soy bastante principiante y que uso mucho el grabador de macros y las inspiraciones en los foros, pero aquí no veo mi error.
Gracias por su ayuda
Aquí está el código:
Configuración: Windows / Chrome 88.0.4324.150
He registrado el inicio de una macro en el Programador de tareas, que lanza la actualización a partir de una macro "Echéance" cada 3 de cada mes.
También genero el registro de mi archivo en el C:\temp y una copia de seguridad en el E:\.
Pero deseo que el usuario no sea solicitado durante la macro, y por lo tanto, que al mostrar el cuadro: Confirmar el registro: El archivo ya existe, ¿desea reemplazarlo?, "sí" o "no", se fuerce a SÍ.
He encontrado 2 líneas de código que parecen corresponder a mi deseo, pero esto funciona para mi primer registro en C:\, ¡pero para mi copia de seguridad en E:\ el registro no se realiza!
Aclaro que soy bastante principiante y que uso mucho el grabador de macros y las inspiraciones en los foros, pero aquí no veo mi error.
Gracias por su ayuda
Aquí está el código:
Private Sub Workbook_Open() Sheets("Echéance").Select 'Hoja a seleccionar If Range("E1").Value = Date Then Call Echéance 'Macro a ejecutar End If Sheets("Compta").Select End Sub Sub Enregist_C_et_E() ' ' Enregist_C_et_E Macro Sheets("Compta").Select Range("A3").Select Sheets("Echéance").Select ActiveSheet.Unprotect Password:="1447" Range("A1").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 13434879 .TintAndShade = 0 .PatternTintAndShade = 0 End With ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="1447" Sheets("Compta").Select Range("A4").Select Range("A4").End(xlDown).Offset(1, 0).Select ActiveWorkbook.Saved = True ChDir "C:\temp" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Sobrescribir archivo existente.xls' Application.DisplayAlerts = True 'Restablecer absolutamente después ChDir "E:\A_Perso_10.09.19\Banque\Compta" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Sobrescribir archivo existente.xls' Application.DisplayAlerts = True 'Restablecer absolutamente después Application.Quit End Sub Configuración: Windows / Chrome 88.0.4324.150
6 respuestas
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Embajador 1 588
Hola,
en tu lugar, intentaría usar más bien ConflictResolution. -
Hola,
Para completar el comentario de yg_be que debería resolver el problema (indicar la ruta completa en lugar de ChDir, cabe mencionar que este comando funciona como en DOS: La instrucción ChDir modifica el directorio o la carpeta predeterminada, pero no modifica la unidad predeterminada. Otra instrucción, ChDrive, modifica la unidad predeterminada.
Ver: https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/chdir-statement
Entonces, para resumir, se debería hacer chdrive "E" además del chdir...
Una de las 2 soluciones de yg_be es, por lo tanto, más "elegante" para resolver el problema. -
Gracias a los dos por sus respuestas,
Pero siento decir que no me están ayudando mucho, les recuerdo que el código no es mío sino el generado por el grabador.
No estoy seguro de entender sus explicaciones, y no me dicen por qué la grabación se realiza bien en la unidad C:\ y no en la unidad E:\
Si entiendo bien, debería agrupar la ruta en una sola línea como indicó yg_be.
No entiendo el uso de ConflictResolution.
Por favor, ¿podrían ser más explícitos y claros para un principiante?
Mil disculpas, hice una prueba antes de enviar y parece que realmente funciona...
Aquí está el código modificado:
Sub Enregist_C_et_E() ' ' Enregist_C_et_E Macro Sheets("Compta").Select Range("A3").Select Sheets("Echéance").Select ActiveSheet.Unprotect Password:="1447" Range("A1").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 13434879 .TintAndShade = 0 .PatternTintAndShade = 0 End With ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="1447" Sheets("Compta").Select Range("A4").Select Range("A4").End(xlDown).Offset(1, 0).Select ActiveWorkbook.Saved = True ChDir "C:\temp" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Ecrasement fichier existant.xls' Application.DisplayAlerts = True 'Remettre absolument ensuite 'ChDir "E:\A_Perso_10.09.19\Banque\Compta" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm" 'ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Ecrasement fichier existant.xls' Application.DisplayAlerts = True 'Remettre absolument ensuite Application.Quit End Sub -
Hola,
Funciona entonces ahora porque el registro en "E" indica explícitamente la ruta completa hacia el archivo. No hay alerta puesto que la línea "Application.DisplayAlerts = False" desactiva el cuadro de diálogo durante el tiempo de registro (se vuelve a poner en true después).
¿Por qué no funcionaba antes? Porque por defecto estamos en el disco "C". Cuando hacemos ChDir "E:\A_Perso_10.09.19\Banque\Compta" no cambiamos de disco Y en realidad, permanecemos en "C". Así que al hacer después ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm", ¡se produce un error!
Para entender mejor, hagan una prueba en una consola DOS y escriban lo que está en negrita a continuación antes de validar con Enter:
1. chdir -> ChDir sin parámetro muestra el nombre del directorio actual (dir muestra además la lista de archivos)
2. ChDir "E:\A_Perso_10.09.19\Banque\Compta" -> No parece suceder nada
3. chdir -> muestra lo mismo que en 1
4. E: -> te lleva al directorio escrito en 2 (es decir, ChDrive "E" en VBA)
Así que en su programa es como si estuvieran en el edificio C y solo se estuvieran limitando a mirar hacia el edificio E de enfrente. Para poner una carta en el edificio E; ¡tienen que bajar y cruzar la calle! De ahí el comando ChDrive que mencionaba.
Por lo tanto, habría sido necesario escribir en su programa un ChDrive además:ChDir "E:\A_Perso_10.09.19\Banque\Compta" ChDrive "E" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Sobreescribir archivo existente.xls' Application.DisplayAlerts = True 'Volver a poner absolutamente después
La solución de yg_be evita tener que cambiar de disco constantemente y enviar el archivo al lugar correcto sin tener que cruzar la calle cada vez: ¡una especie de teletransportación!
PD ConflictResolution. permitiría reemplazar los displayAlerts que ponemos en false y luego en true, pero sin modificar su saveAs, no habría cambiado nada en el problema de fondo para el registro en E. -
Hola Roma,
Gracias por tus explicaciones claras y concisas, tus ejemplos me resuenan bien... ahora entiendo mi error.
Para terminar, puedo entonces también reemplazar el código:
<code basic>ChDir "C:\temp" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm" ' Sobrescribir archivo existente.xls' Application.DisplayAlerts = True 'Restablecer absolutamente después por Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="C:\temp\Compta_Raymond.xlsm" Application.DisplayAlerts = True
</code>-
-
Así que, si he entendido bien, el código de conflictresolution también permite no mostrar la ventana de confirmación.
Para la copia de seguridad en C:\ y E:\ es una prueba, después voy a hacer la copia de seguridad en mi disco externo, por supuesto.
De hecho, la práctica del grabador no siempre es una fuente segura, pero para principiantes como yo, permite realizar rápida y fácilmente muchas macros. -
-
-
Lo siento, vuelvo a ponerme en contacto con usted. He reemplazado el código como usted me aconsejó con ConflictResolution,
el registro se realiza correctamente en los 2 lectores, pero el cuadro de diálogo de solicitud de confirmación se abre 2 veces...
¿Qué he olvidado?
Sub Enregist_C_et_E() ' ' Enregist_C_et_E Macro Sheets("Compta").Select Range("A3").Select Sheets("Echéance").Select ActiveSheet.Unprotect Password:="1447" Range("A1").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 13434879 .TintAndShade = 0 .PatternTintAndShade = 0 End With ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="1447" Sheets("Compta").Select Range("A4").Select Range("A4").End(xlDown).Offset(1, 0).Select ActiveWorkbook.Saved = True ActiveWorkbook.SaveAs _ Filename:="C:\temp\Compta_Raymond.xlsm", _ ConflictResolution:=xlLocalSessionChanges 'Application.DisplayAlerts = False 'ActiveWorkbook.SaveAs Filename:="C:\temp\Compta_Raymond.xlsm" ' Ecrasement fichier existant.xls' 'Application.DisplayAlerts = True 'Remettre absolument ensuite ActiveWorkbook.SaveAs _ Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm", _ ConflictResolution:=xlLocalSessionChanges 'Application.DisplayAlerts = False 'ActiveWorkbook.SaveAs Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm" ' Ecrasement fichier existant.xls' 'Application.DisplayAlerts = True 'Remettre absolument ensuite Application.Quit End Sub
-
-
Me pregunto cuál es el interés práctico de hacer una copia de seguridad en la carpeta C:\temp Y en la carpeta en "E"? ¿Estos duplicados son intencionados?