web-dev-qa-db-fra.com

Désactiver toutes les boîtes de dialogue dans Excel lors de l'exécution VB scénario?

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. 

13
NJP

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.

1
tysonwright

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
1

Solution: Macros d'automatisation

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.

Exemple de macro d'automatisation: AutoHotkey

; ' 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
}
0
ChrisB

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.

0
jordanhill123

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.OpenApplication.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
0
Joshua Fenner