XL 2021 VBA et UserForm

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonjour à tous,
Vous trouverez en PJ un fichier DEMO de ce que j'ai à ce jour réussi à élaborer avec le concours incontournable des XLDNautes qui se reconnaîtront.
Mon fichier comporte deux feuilles:
- Annuaire (=base de données)
- Ma liste, résultant de l'exportation via l'UsfSaisie des données que je souhaite collecter.
Tout cela, grâce aux talents de mes contributeurs (le mot est faible), fonctionne très bien mais je souhaiterai apporter quelques améliorations. Malgré mes efforts et mes recherches, je n'arrive pas à grand chose.
Ce que je voudrais :
- Macro "Alpha": que la sélection se fasse de C2 jusqu'à la première cellule vide, ce qui suppose bien sûr qu'aucun nom ne manque. Pour l'heure j'ai bloqué le tri alphabétique de C2 à C100 ne sachant faire autrement.
- Ma Liste :
* Macro Effacer : même problème qu'avec Alpha...
* Créer une nouvelle macro qui me permettrait d'enregistrer le fichier sous un nouveau nom au format "L3 et "L6.xlsm. Si possible, ajouter des messages box pour informer ou mettre en garde l'utilisateur.
Je demande beaucoup mais malheureusement je n'y arrive pas tout seul.
Bon dimanche à vous tous.
Pierre
 

Pièces jointes

  • Annuaire-DEFDEMO2.xlsm
    46.7 KB · Affichages: 14
Solution
Salut:
1687852712735.png

Vous n'êtes pas obligé de faire les 2 sauvegardes :
le .SaveCopyAs devrait suffire, commentez la ligne du CopyAs

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonjour Vgendron,
J'ai conscience de cette exigence. Tu penses sans doute au format de la date ?
02/05/2022 à proscrire me semble t-il
02-05-2022 me plairait bien
sinon, 02_05_2022 semble correct
Concernant la thématique, je vais évidemment exclure tout " !, #, @,..." ou autre caractère du même type en ne retenant que l'alphabet de mon clavier Azerty et les chiffres.
Est-ce que ça colle ?
Merci encore de ton soutien.
Pour info, mon fichier courses que tu connais bien (et pour cause) est complet et complètement opérationnel. J'ai encore fait mes courses ce matin en l'utilisant.:)
Bien cordialement,
Pierre
 

fanch55

XLDnaute Barbatruc
Il ne s'agit pas de sauvegarder le fichier en L3.xslm et ou L6.xslm mais d'intégrer le contenu des valeurs L3 et L6 de la feuille

Oki, j'avais pris la demande dans son format littéral .
Le code pour sauvegarder corrigé :
VB:
Public Sub SaveAs()
    Dim Path        As String
    Dim Ext         As String
    Dim Filename    As String
    With ThisWorkbook
        Path = .Path & "\"
        Ext = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")) ' Type Excel du classeur
        Filename = Path & "Annuaire" & "_" & [L3] & "_" & [L6].Text
        If MsgBox("Ce classeur va être sauvegardé puis copié dans " & vbLf & vbLf & Filename, _
                    vbCritical + vbOKCancel) = vbOK Then
            .Save                      ' sauvegarde du classeur avant de faire des copies conformes
            .SaveCopyAs Filename & Ext ' copie du même type que le classeur
            CopyAs Filename:=Filename, FileFormat:=xlWorkbookNormal ' copie du classeur en Xls sans macro
        End If
    End With
End Sub
Sub CopyAs(Filename, FileFormat)
    Application.DisplayAlerts = False   ' Ne pas avoir les demandes de confirmation
    Application.ScreenUpdating = False  ' Ne pas afficher le nouveau classeur
    ThisWorkbook.Sheets.Copy            ' copie en tant que nouveau classeur
    With ActiveWorkbook
        .SaveAs Filename:=Filename, FileFormat:=FileFormat
        .Close
    End With
End Sub
 

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonjour Fanch55,
Je découvre ta proposition à l'instant.
Ça a l'air super. 2 questions cependant :
- Pourquoi "public sub" et non pas sub ? Je ne connais pas la différence ou pire, je ne comprends pas vu mon niveau...
- Quand tu indiques : Path = .Path & "\", dois je renseigner à la place de "\" le chemin où se trouve le fichier d'origine ou l'endroit où je souhaite enregistrer mon fichier (dans mon cas, je pense que je vais indiquer le même dossier...
- Comme je l'aimerai, le fichier de sauvegarde doit être un xlsm pour pouvoir revenir dessus en cas de besoin.
Donc, la ligne :
CopyAs Filename:=Filename, FileFormat:=xlWorkbookNormal ' copie du classeur en Xls sans macro
est-elle utile (je n'ose pas toucher au code de peur de faire des conn....)
Je lis dans le code, If MsgBox("Ce classeur va être sauvegardé puis copié dans " & vbLf & vbLf & Filename, _
Je ne savais pas ce à quoi correspondait vlbf... J'ai cherché et dis-moi si j'ai compris : Cela permet d'afficher dans les MsgBox les informations sous forme de liste (retour à la ligne)? Why not ! Ce sera sûrement plus lisible.
Pendant que j'y suis, j'ai pensé à quelque chose :
J'ai complété ma maquette DEMO2. Je me rends compte que la fonction Effacer n'est pas protégée.
- Idée 1 : MsgBox sur cette macro pour avertir (accepter ou renoncer)
- Idée 2 : Chainer l'enregistrement du fichier à l'effacement via plusieurs MsgBox
Cela donnerait quelque chose comme ça :

- Je clique sur "effacer les données".
Un message me demande si je veux :
* sauvegarder le fichier avec les données présentes dans liste (Annuaire_Vacances_26_06_2023.xlsm) dans le répertoire défini dans Path.
* quitter l'effacement/enregistrement (annuler)
* Seulement effacer sans faire de sauvegarde
Évidemment, le bouton d'enregistrement n'aurait plus lieu d'être
J'ai beau chercher, dans le code je ne vois aucun renseignement indiquant où se trouvent les cellules L3 et L6 (pas de référence à la feuille considérée -dans mon cas "Ma liste"). c'est peut-être normal mais cela m'intrigue car s'il y a deux feuilles, donc il y a deux doublons "L3 et L6".
Je ne me suis jamais essayé à créer des MsgBox. Cela ne veut pas dire que je n'ai pas envie de comprendre et de me lancer. Je comprends que pour toi, ça doit être un peu usant de partager ton savoir avec des gens qui ont du sable dans les oreilles.
Quoiqu'il en soit, je te remercie infiniment de t'être intéressé à mes bidouilles.
Si tu veux me faire une proposition d'amélioration peux-tu m'envoyer un fichier avec un nom différent (Ex: Annuaire_Fanfan55_26_06_2023.xlsm ?;)
Bien cordialement
Pierre
 

Pièces jointes

  • Annuaire-DEFDEMO2.xlsm
    48.2 KB · Affichages: 0

Constantin

XLDnaute Occasionnel
Supporter XLD
Je viens de tester ta macro en supprimant le choix xls. Vraiment, chapeau bas !
Cela fonctionne très bien.
Mille mercis. Je vais maintenant essayer de poursuivre comme je le t'ai indiqué précédemment.
Comme disait mon arrière grand-mère, "je suis heureux comme un pou sur une tête sale", ça semble "dégueu" mais mets toi à la place du pou !
Juste pour te "faire montrer" comme disent les Mayennais... PJ
 

Pièces jointes

  • Annuaire_Vacances_26-06-2023.xlsm
    51.5 KB · Affichages: 2

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonjour Fanch55,
Je rencontre des problèmes quand je veux adapter ta formule à mon fichier perso.
Quand je lance ma macro, le critical message s'affiche correctement et quand je valide, ça bugue :
1687850208039.png

Ce que je comprends encore moins, c'est que ça marche sur la version DEMO2. Bien sûr tous mes fichiers de départ sont placés dans le répertoire Annuaire.
Si tu peux éclairer ma lanterne, j'en serais ravi. Dans ton code, il y a deux macros, la deuxième étant appelée, semble t-il, dans la ligne qui apparait en surligné. Est-ce que j'ai omis de compléter quelque chose ? Filename, FileFormat par exemple mais si c'est le cas, je ne vois pas quoi mettre.
Pour l'heure je couche les pouces.
Bien cordialement,
Pierre
 

Constantin

XLDnaute Occasionnel
Supporter XLD
Re...
Je vais maintenant essayer de chaîner Effacer et SaveAs pour ne conserver qu'un seul bouton de commande.
Je pense pouvoir y arriver en m'inspirant de mes précédents échanges avec de géniaux contributeurs comme vous ! Sinon, je vous ferai part de mes déconvenues...;)
Bonne journée,
Pierre
 

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonsoir Fanch55,
Évidemment, j'ai des déconvenues dues à mon ignorance évidente.
La plus importante est que l'exportation via UsfSaisie fonctionne mais que les formats des cellules sont rayonnés.
Les N° de téléphone apparaissent en standard et les alignements que je souhaite sont également ignorés (Alignement Retrait Gauche = 1 et Centré) lorsque je procède à l'effacement du fichier via la macro "Effacer-enregistrer". Je n'arrive pas à préciser le format des cellules.
Dans la macro Effacer-enregistrer, mis à part les Msgbox (je vais y revenir) 2 macros sont chainées (Effacer et SaveAs). Je pense (c'est donc relatif) que cela provient du code présent dans :
"Private Sub CommandButton5_Click() 'ma liste" plus précisément dans la ligne :
" If Len(Me.TbFixe.Value) > 0 Then [T_maliste].Item(n, 9) = Val(Me.TbFixe.Value)
[T_maliste].Item(n, 10) = Me.Tbmail1.Value"

J'ai essayé de transposer en les adaptant les données
"If [TData].Item(Me.ScrollBar1.Value, 5) > 0 Then Me.TbFixe = Format([TData].Item(Me.ScrollBar1.Value, 5), "00 00 00 00 00")
présentes dans "Private Sub ScrollBar1_Change()" dans le code mais je n'ai fait que mettre la pagaille.
En conclusion : brasse coulée
Si vous avez une idée ?
Bien cordialement,
Pierre
 

Pièces jointes

  • Annuaire-DEFDEMO3.xlsm
    41.9 KB · Affichages: 2

Constantin

XLDnaute Occasionnel
Supporter XLD
J'oubliais,
Dans la macro "Effacer-enregistrer", j'ai eu des problèmes avec tout ce qui était relatif FSO. Ayant compris que ces données ne servaient qu'à enrichir le message de fin de sauvegarde, j'ai "commenté" plusieurs lignes. Ce petit message qui s'affichait en fin de travail était plutôt sympa mais pas vital... Peut-on lui donner une seconde chance ?
A bientôt ?
Pierre
 

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonsoir à tous,
En fait, j'ai trouvé tout seul (je n'en suis pas peu fier) la solution et c'est tellement bête :
Vgendron m'avait suggéré pour effacer :
Sub Effacer()
With Sheets("Ma liste").ListObjects("t_maliste")
.DataBodyRange.Clear 'on efface le contenu
(mais pas que...)
.Resize Range("$A$1:$J$2") 'on redimensionne la table avec juste une ligne
End With
End Sub

J'ai remplacé Clear par ClearContents et là, ça n'efface que le contenu et pas les formats :p
Maintenant, mis à part le MsgBox de clôture, toto va bene !
Bien à vous tous !
Pierre
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 184
dernier inscrit
Di Martino