J'ai un code dans VB qui enregistre tous les fichiers XLSM au format XLSX. J'ai déjà le code qui le fera pour moi, mais des boîtes de dialogue apparaissent pour chaque action. C'était bien pour quelques dizaines de fichiers. Cependant, je vais utiliser ceci sur des centaines de fichiers XLSM à la fois, et je ne peux pas rester assis devant mon ordinateur toute la journée en cliquant continuellement sur les boîtes de dialogue.
Le code que j'ai essayé est à peu près:
Application.DisplayAlerts = False
Bien que cela ne cause pas d'erreur, cela ne fonctionne pas non plus.
Les cases donnent un avertissement sur l'activation des macros et préviennent également que l'enregistrement en tant que XLSX supprime le fichier de toutes les macros. Compte tenu du type d’avertissements, je soupçonne qu’ils ont restreint la possibilité de désactiver ces boîtes de dialogue en raison des risques de sécurité.
Étant donné que j'utilise ce code dans l'éditeur VB d'Excel, existe-t-il une option qui me permettra de désactiver les boîtes de dialogue pour le débogage?
J'ai aussi essayé:
Application.DisplayAlerts = False
Application.EnableEvents = False
' applied code
Application.DisableAlerts = True
Application.EnableEvents = True
Ni de ceux qui ont travaillé.
Modifier:
Voici à quoi ressemble le code ci-dessus dans mon code actuel:
Public Sub example()
Application.DisplayAlerts = False
Application.EnableEvents = False
For Each element In sArray
XLSMToXLSX(element)
Next element
Application.DisplayAlerts = False
Application.EnableEvents = False
End Sub
Sub XLSMToXLSX(ByVal file As String)
Do While WorkFile <> ""
If Right(WorkFile, 4) <> "xlsx" Then
Workbooks.Open Filename:=myPath & WorkFile
Application.DisplayAlerts = False
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:= _
modifiedFileName, FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
Application.DisplayAlerts = True
Application.EnableEvents = True
ActiveWorkbook.Close
End If
WorkFile = Dir()
Loop
End Sub
J'ai également entouré la boucle For
, par opposition à la ligne ActiveWorkbook.SaveAs
:
Public Sub example()
For Each element In sArray
XLSMToXLSX(element)
Next element
End Sub
Enfin, j'ai décalé le Application.DisplayAlerts
au-dessus de la ligne Workbooks.Open
:
Sub XLSMToXLSX(ByVal file As String)
Do While WorkFile <> ""
If Right(WorkFile, 4) <> "xlsx" Then
Workbooks.Open Filename:=myPath & WorkFile
Application.DisplayAlerts = False
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:= _
modifiedFileName, FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
Application.DisplayAlerts = True
Application.EnableEvents = True
ActiveWorkbook.Close
End If
WorkFile = Dir()
Loop
End Sub
Aucun de ceux qui fonctionnent aussi bien.
Modifier:
J'utilise Excel pour Mac 2011, si cela peut vous aider.
Dans Access VBA, je l'ai utilisé pour désactiver toutes les boîtes de dialogue lors de l'exécution de plusieurs mises à jour:
DoCmd.SetWarnings False
Après avoir exécuté toutes les mises à jour, la dernière étape de mon script VBA est la suivante:
DoCmd.SetWarnings True
J'espère que cela t'aides.
Avez-vous essayé d'utiliser le paramètre ConflictResolution: = xlLocalSessionChanges dans la méthode SaveAs?
Comme tel:
Public Sub example()
Application.DisplayAlerts = False
Application.EnableEvents = False
For Each element In sArray
XLSMToXLSX(element)
Next element
Application.DisplayAlerts = False
Application.EnableEvents = False
End Sub
Sub XLSMToXLSX(ByVal file As String)
Do While WorkFile <> ""
If Right(WorkFile, 4) <> "xlsx" Then
Workbooks.Open Filename:=myPath & WorkFile
Application.DisplayAlerts = False
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:= _
modifiedFileName, FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False, _
ConflictResolution:=xlLocalSessionChanges
Application.DisplayAlerts = True
Application.EnableEvents = True
ActiveWorkbook.Close
End If
WorkFile = Dir()
Loop
End Sub
Il semble que vous auriez intérêt à utiliser un utilitaire d'automatisation. Si vous utilisiez un ordinateur Windows, je recommanderais AutoHotkey . Je n'ai pas utilisé d'utilitaires d'automatisation sur un Mac, mais cet article Ask Different a plusieurs suggestions, même si aucune ne semble être gratuite.
Ce n'est pas une solution VBA. Ces macros fonctionnent en dehors d'Excel et peuvent interagir avec les programmes à l'aide des touches du clavier, des mouvements de la souris et des clics.
En gros, vous enregistrez ou écrivez une simple macro d’automatisation qui attend que la boîte de dialogue «Enregistrer sous» d’Excel devienne active, appuyez sur Entrée/Retour pour terminer l’action de sauvegarde, puis sur la fenêtre «Enregistrer sous». Vous pouvez le configurer pour qu'il s'exécute en boucle continue jusqu'à ce que vous terminiez manuellement la macro.
Voici une version simple d'un script Windows AutoHotkey qui accomplirait ce que vous tentez de faire sur un Mac. Cela devrait vous donner une idée de la logique impliquée.
; ' Infinite loop. End the macro by closing the program from the Windows taskbar.
Loop {
; ' Wait for ANY "Save As" dialogue box in any program.
; ' BE CAREFUL!
; ' Ignore the "Confirm Save As" dialogue if attempt is made
; ' to overwrite an existing file.
WinWait, Save As,,, Confirm Save As
IfWinNotActive, Save As,,, Confirm Save As
WinActivate, Save As,,, Confirm Save As
WinWaitActive, Save As,,, Confirm Save As
sleep, 250 ; ' 0.25 second delay
Send, {ENTER} ; ' Save the Excel file.
; ' Wait for the "Save As" dialogue box to close.
WinWaitClose, Save As,,, Confirm Save As
}
De Excel Macro Security - www.excelfunctions.net :
Macro Security dans Excel 2007, 2010 et 2013:
.....
Les différents types de fichiers Excel fournis par les dernières versions de Excel indique clairement quand le classeur contient des macros, donc cela en soi est une mesure de sécurité utile. Cependant, Excel a également une macro optionnelle les paramètres de sécurité, qui sont contrôlés via le menu des options. Celles-ci sont :
'Désactiver toutes les macros sans notification'
Ce paramètre n'autorise aucune macro à s'exécuter. Lorsque vous ouvrez un nouveau fichier Classeur Excel, vous n'êtes pas averti du fait qu'il contient macros, de sorte que vous pouvez ne pas être conscient que c'est la raison pour laquelle un classeur ne fonctionne pas comme prévu.
'Désactiver toutes les macros avec notification'
Ce paramètre empêche les macros de s'exécuter. Cependant, s'il y en a macros dans un classeur, une fenêtre contextuelle s’affiche pour vous avertir que le les macros existent et ont été désactivés.
'Désactiver toutes les macros sauf les macros signées numériquement'
Ce paramètre autorise uniquement l'exécution de macros provenant de sources approuvées. Tous les autres les macros ne s'exécutent pas. Lorsque vous ouvrez un nouveau classeur Excel, vous n'êtes pas alerté du fait qu'il contient des macros, vous risquez donc de ne pas être au courant C'est la raison pour laquelle un classeur ne fonctionne pas comme prévu.
'Activer toutes les macros'
Ce paramètre permet à toutes les macros de s'exécuter. Lorsque vous ouvrez un nouvel Excel classeur, vous n'êtes pas averti qu'il contient des macros et peut ne pas être au courant des macros en cours d'exécution pendant que le fichier est ouvert.
Si vous faites confiance aux macros et que vous acceptez de les activer, sélectionnez cette option:
'Activer toutes les macros'
et cette boîte de dialogue ne doit pas apparaître pour les macros.
En ce qui concerne la boîte de dialogue pour enregistrer, après avoir noté que cela fonctionnait sous Excel pour Mac 2011, je suis tombé sur la question suivante sur SO, la boîte de dialogue StackOverflow - Suppress lors de l’utilisation de VBA pour enregistrer une macro contenant un fichier Excel (.xlsm). fichier contenant une macro (.xlsx) . À partir de là, il ne semble pas possible de supprimer la boîte de dialogue, sauf éventuellement par une simulation de saisie au clavier. Je poserais une autre question pour me renseigner à ce sujet. Désolé, je ne pouvais vous avoir qu'à moitié. L'autre option serait d'utiliser un ordinateur Windows avec Microsoft Excel, bien que je ne sois pas sûr que ce soit une option pour vous dans ce cas.
Afin de contourner l'invite d'activation de macro, je suggère
Application.AutomationSecurity = msoAutomationSecurityForceDisable
Assurez-vous de rétablir les valeurs par défaut lorsque vous avez terminé
Application.AutomationSecurity = msoAutomationSecurityLow
Rappelez-vous que la fonction .SaveAs
contient tous les arguments facultatifs. Je recommande de supprimer CreatBackup:= False
car ce n’est pas nécessaire.
Le moyen le plus intéressant, selon moi, consiste à créer un objet du classeur et à accéder à la propriété .SaveAs
de cette façon. Je ne l'ai pas testé, mais vous n'utilisez jamais le rendu Workbooks.Open
Application.AutomationSecurity
inapplicable. Peut-être économiser des ressources et du temps aussi.
Cela dit, j’ai été en mesure d’exécuter les opérations suivantes sans aucune notification sur Excel 2013 Windows 10.
Option Explicit
Sub Convert()
OptimizeVBA (True)
'function to set all the things you want to set, but hate keying in
Application.AutomationSecurity = msoAutomationSecurityForceDisable
'this should stop those pesky enable prompts
ChDir "F:\VBA Macros\Stack Overflow Questions\When changing type xlsm to
xlsx stop popup"
Workbooks.Open ("Book1.xlsm")
ActiveWorkbook.SaveAs Filename:= _
"F:\VBA Macros\Stack Overflow Questions\When changing type xlsm to xlsx_
stop popup\Book1.xlsx" _
, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close
Application.AutomationSecurity = msoAutomationSecurityLow
'make sure you set this up when done
Kill ("F:\VBA Macros\Stack Overflow Questions\When changing type xlsm_
to xlsx stop popup\Book1.xlsx") 'clean up
OptimizeVBA (False)
End Sub
Function OptimizeVBA(ByRef Status As Boolean)
If Status = True Then
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False
Application.EnableEvents = False
Else
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.EnableEvents = True
End If
End Function