XL 2016 Changer de feuille dans une macro

Syracoti

XLDnaute Nouveau
Bonjour à tous!

J'ai suivi un tutoriel pour faire un formulaire de saisie avec un macro. Lors du tutoriel, la personne clique sur le bouton et tout s'ajoute dans la seconde feuille du classeur, jusque là rien d'anormal pour moi, à part le faire qu'on frôle la crise d'épilepsie car il effectue toutes les tâches en quelques secondes, et du coup change plusieurs fois de pages, ce qui fait clignoter l'écran.

J'aurai aimé savoir s'il est possible de faire en sorte que la macro se fasse de façon "invisible", ou du moins si le changement de feuille peut être invisible et rester sur la feuille du formulaire de bout en bout ?

Si jamais, je vous laisse le code de ma macro

VB:
Sub AjoutNouveauSanton()
'
' AjoutNouveauSanton Macro
'

'
    Range("C8").Select
    Sheets("Collection").Select
    Rows("19:19").Select
    Selection.Insert Shift:=xlDown
    Sheets("Formulaire").Select
    Selection.Copy
    Sheets("Collection").Select
    Range("B19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("B19").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    Range("C19").Select
    Sheets("Formulaire").Select
    Range("E8").Select
    Selection.Copy
    Sheets("Collection").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("G8").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("D19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("C13").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("F19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("E13").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("I19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("G13").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("H19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("C16").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("G19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("E16").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("J19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("G16").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("K19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("C19").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("L19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Formulaire").Select
    Range("E19").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Collection").Select
    Range("M19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("N19").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-2]"
    Rows("19:19").Select
    Range("D19").Activate
    With Selection.Font
        .Name = "Arial"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    Range("B19").Select
    Sheets("Formulaire").Select
    Range("C8").Select
End Sub

Merci pour votre temps et pour toute l'aide qui me sera apportée!

Edit: Je découvre Excel depuis peu! Et je suis encore en plein apprentissage de ses possibilités
 
Solution
Bonjour

Première piste
Supprimer autant que faire se peut les Select et Activate
Exemple, ceci
Range("C8").Select
Sheets("Collection").Select
Rows("19:19").Select
Selection.Insert Shift:=xlDown
peut se simplifier en
Sheets("Collection").Rows("19:19").Insert Shift:=xlDown

Et pour l'invisibilité, mettre en début de code
Application.ScreenUpdating = False

Syracoti

XLDnaute Nouveau
Merci pour le partage du lien!

Mais, je ne comprends pas en quoi c'est intéressant de les déclarer en private plutôt qu'en sub normal! Il y a un réel intérêt ?

Et sinon j'ai pris le temps de fouiner sur internet mais je reste malheureusement sur une réponse qui ne me convient pas vraiment, il n'y a pas moyen de commencer le tri à une ligne précise ?
 

Staple1600

XLDnaute Barbatruc
Moi, j'y vois un intérêt.

Mais puisque la question, c'est le tri, passons au tri
La réponse est oui
Sauf qu'en théorie, quand on trie un tableau on le trie dans son intégralité à partir de ses lignes d'entêtes
(C'est ce que fait ici ma macro de tri, elle trie tout te tableau)
 
Dernière édition:

Syracoti

XLDnaute Nouveau
Aie! Le problème c'est que dans mon fichier d'origine ça casse tout du coup comme tu peux le voir sur l'image ci-dessous

Capture.PNG

Le problème était que je m'étais servi de l'entête à gauche de l'image (Zone cachée pour les données apparentes) pour faire un récapitulatif comme ci-dessous

Capture2.PNG

Je dois donc changer la mise en forme et faire sauter l'entête
 

Staple1600

XLDnaute Barbatruc
Re

Il est évident que si le fichier final ne respecte pas la structure du fichier exemple, la macro ne sera pas adaptée.

Dans le fichier exemple, le tableau commence en B3 et finit en colonne N3
(pour ce qui est de la ligne d'entête)

Donc reprends la structure du fichier exemple ou adapte mes codes VBA en conséquence.

NB: Mon code fonctionne sur le fichier exemple, non ?
Donc pourquoi avoir changé la structure en cours de route ? ou ne pas avoir fourni un fichier exemple fidèle à l'original.
 

Syracoti

XLDnaute Nouveau
Ah oui en effet! J'ai trouvé en effet! Merci beaucoup :)

Et en fait la structure est comme ça d'origine, disons que je l'ai un peu trop simplifiée pour le fichier test! C'est ma faute je suis désolé

Mais tout est bon maintenant c'est parfait!
 

Staple1600

XLDnaute Barbatruc
Re

Dans ce cas, je ne comprends pas ce que tu voulais dire par
"commencer le tri sur une ligne"

Il ne s'agissait pas plutôt de déterminer la fin d'un tableau suite à l'ajout de données dans la première cellule vide de la feuille Collections pour pouvoir adapter la zone de tri ?

Si oui c'est ce que fait cette ligne de code
.SetRange F.Range(F.Cells(3, "b"), F.Cells(Rows.Count, "N").End(xlUp))

Donc normalement, il n'y a pas plus aucun Select dans ton code?
Car tu as bien sur ajouté mon code simplifié du message#9 dans mon dernier code proposé ?
(celui avec la macro Traitement)
 

Syracoti

XLDnaute Nouveau
Oui le code est beaucoup plus rapide! J'ai testé l'ancien à l'instant pour comparer au nouveau, il n'y a pas photo! Ca va être très appréciable lorsque l'on ajoutera des santons à la liste de pas avoir un petit freeze entre chaque ajout!

Je n'ai plus de questions tout est bon! Je pense avoir compris toutes les lignes, et avec la base que tu m'as donné je ferai des petits tests, de nouvelles pages etc pour pouvoir tester plein de trucs, merci encore! 😄

Merci pour ton temps et pour ta patience! J'ai pas été un cadeau! 😅
 

Statistiques des forums

Discussions
298 971
Messages
1 973 284
Membres
204 022
dernier inscrit
jen42