Microsoft 365 Avoir des classeurs maitres et les procédures dans un autre classeur.

GClaire

XLDnaute Occasionnel
Supporter XLD
Hello les exceliennes et exceliens

J'ai une dizaine (ce nombre va évoluer) de classeurs (Des besoin matériel pour des fabrications et de calculer les quantités de chaque matériel par ref) ) qui sont tous identiques même feuille de calcule (y'en a qu'une) et même procédures.

Comme il m'arrive de faire évoluer le code de ces procédures je me disais qu'il serait possible d'avoir les classeurs des nomenclatures et un classeur pour les procédures de manière a ne pas être oblige de me taper l'évolution d'un code dans tous les classeurs...

Donc ma question, est-il possible a partir d'un classeur, d'appeler des procédures dans un autre classeur?

Voici un des codes que j'utilise :

VB:
Sub RechercherefDesSomQtesTot()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim refCell As Range
    Dim dict As Object
    Dim ref As Variant
    Dim qty As Double
    Dim totalQty As Double
    Dim resultRow As Long

    ' Définir la feuille de calcul
    Set ws = ThisWorkbook.Sheets("Feuil1")

    ' Dernière ligne de données dans la colonne C
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row

    ' Initialiser un dictionnaire pour stocker les références et les quantités
    Set dict = CreateObject("Scripting.Dictionary")
    
Application.ScreenUpdating = False

    ' Écriture des résultats triés dans la colonne H
    ws.Range("I5").Value = "REFERENCES"
    ws.Range("J5").Value = "DESIGNATIONS"
    ws.Range("K5").Value = "QUANTITE TOTALES"

    ' Parcourir les lignes de la colonne C
    For Each refCell In ws.Range("C6:C" & lastRow)
        ' Vérifier que la cellule n'est pas vide
        If Not IsEmpty(refCell.Value) Then
            ref = refCell.Value
            qty = refCell.Offset(0, 1).Value ' Qté est dans la colonne D

            ' Vérifier si la référence est déjà dans le dictionnaire
            If dict.Exists(ref) Then
                ' Ajouter la quantité à la référence existante
                dict(ref) = dict(ref) + qty
            Else
                ' Ajouter la référence au dictionnaire avec la quantité
                dict.Add ref, qty
            End If
        End If
    Next refCell

    ' Afficher les résultats dans les colonnes I, J et K à partir de la ligne 6
    resultRow = 6
    For Each ref In dict.keys
        ws.Cells(resultRow, "I").Value = ref ' Référence
        ws.Cells(resultRow, "J").Value = ws.Cells(ws.Range("C:C").Find(what:=ref, LookIn:=xlValues).Row, "B").Value ' Valeur associée en colonne B
        ws.Cells(resultRow, "K").Value = dict(ref) ' Somme des quantités
        resultRow = resultRow + 1
    Next ref

    ' Libérer la mémoire du dictionnaire
    Set dict = Nothing

    ' Appel à une procédure de formatage si nécessaire
    AppliquerFormat
    
Application.ScreenUpdating = True

    MsgBox "Traitement terminé !"
End Sub

Ce que j'ai pensais dans un premier temps et qu'il fallait déclarer les variables (Pour renseigner le nom du classeur, le nom de la feuille etc...) du classeur maitre en public afin de les utiliser dans le classeur ou seront les procédures.
ce qu'il donnerait.

1) Variable pour le nom du classeur a l'ouverture de celui-ci
Code:
Private Sub Workbook_Open()
    WB_Base = ThisWorkbook.Name
    'MsgBox WB_Base
End Sub

2) Un module avec toutes les variable dont on a besoin en public

Code:
Option Explicit

Public ws As Worksheet
Public lastRow As Long
Public refCell As Range
Public dict As Object
Public ref As Variant
Public qty As Double
Public totalQty As Double
Public resultRow As Long
Public CheminFichier As String
Public NomDuFichierBase As String
Public wb As Workbook
Public WB_Base As String

3) Ouverture du classeur ou seront les procédures

Code:
Sub RechercherefDesSomQtesTot()

'Définir le chemin du fichier
CheminFichier = "C:\Users\jz52353491\OneDrive-Conduent\BANCS\'MODEL-SORTIES MATERIEL-Procedures VBA.xlsm"

WB_Base = ThisWorkbook.Name

MsgBox CheminFichier 'OK
MsgBox WB_Base 'OK

' Ouvrir le classeur et l'assigner à la variable publique
'Set wb = Workbooks.Open(CheminFichier)

Application.ScreenUpdating = False

Application.Run "CheminFichier!Mdl_RechercheRefDesSomQtesTot.RechercherefDesSomQtesTot"

Application.ScreenUpdating = True

MsgBox "Traitement terminé !"

End Sub

Alors je ne sais si ce que j'ai fais est correct, j'ai un doute car j'ai déjà un beau message d'erreur.

1719829315404.png

1719829339944.png


Si vous avez une idée, car pourtant pour moi aprés le test avec les messagebox, cela pointe bien au bon endroit.

Aprés je verrai pour le reste.

je vous remercie par avance.

Passez une belle et bonne journée.
 

vgendron

XLDnaute Barbatruc
Bonjour

Puisque tu souhaites avoir un classeur de base.. pourquoi ne pas utiliser celui ci pour y mettre toutes tes procédures
Ces procédures, tu les mets dans un ou plusieurs modules du classeur de base,
et c'est dans ces procédures que tu ouvres le classeur à traiter avant d'executer le code
au moins, toutes tes macros sont au même endroit, c'est plus pratique pour en faire la gestion et les modifications.
 

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour

Puisque tu souhaites avoir un classeur de base.. pourquoi ne pas utiliser celui ci pour y mettre toutes tes procédures
Ces procédures, tu les mets dans un ou plusieurs modules du classeur de base,
et c'est dans ces procédures que tu ouvres le classeur à traiter avant d'executer le code
au moins, toutes tes macros sont au même endroit, c'est plus pratique pour en faire la gestion et les modifications.
Cc

Merci pour la réponse.

Ce qui fait dire que je dois ouvrir les autres classeurs en ayant une liste dans le premier classeur de toutes les nomenclatures et pour ce faire, faire une recherche dans les dossiers (qui sont nommés au nom du produit xxxxxxxxVyy) des fichiers de nomenclatures.


Laquelle des deux solutions est la moins contraignante?


Merci, G’Claire.
 

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour
met toutes tes macros dans un xlam tout simplement
active le xla dans les options et active la ref à ton xlam dans tes fichiers excel c'est tout
cela tu peux même le faire dynamico dans chaque classeur
Patrick

Merci pour la réponse

je ne connaissais pas cela.

Je viens de créer ce XLAM, je ne trouve l'endroit pour activer l'xla et idem pour activer la ref dans les fichiers.

je regarde plus en détail en rentrant chez moi.

Merci, G'Claire
 

GClaire

XLDnaute Occasionnel
Supporter XLD
re
@GClaire regarde la vidéo
CC Patrick

Un grand merci d'avoir pris ce temps pour faire cette vidéo.

Je regarde cela de suite.

Ma première question sera sur la destination du "xlam", je suppose quelle est obligatoire dans le dossier proposé par excel.

Donc si ces fichiers sont sur un sharepoint, il suffit que le xlam soit mis une première fois sur le PC de l'utilisateur, ou comment cela se passe?

Aprés comme je vais le faire, j'aurais peut être la réponse.

Merci beaucoup

G'Claire
 

GClaire

XLDnaute Occasionnel
Supporter XLD
Patrick, le forum.

J'ai donc suivi ta vidéo.

J'ai bien tous les éléments dans l'arborescence.

1719849883083.png


Donc quand je lance mes procédures avec des boutons prévuent dans la feuille, elles se lance bien, mais a mon avis elles n'envoie pas les données dans le bon classeur, j'ai l'impression que cela l'envoie dans le feuil1, du xlam, car j'ai pour tester changé le nom de la feuil du xlam, et j'ai un beau message d'erreur qu'il ne trouve pas la feuille.

Merci beaucoup, G'Claire
 

patricktoulon

XLDnaute Barbatruc
re
non le dossier des addins original n'est pas obligatoire
tu peux le préciser comme tu veux
par contre pour aller l'activer quand tu arrive a la fenetre ou tu le coche il te faudra cliquer sur "parcourir et aller le chercher pour la première utilisation (après ce dossier sera pris en compte aussi
 

GClaire

XLDnaute Occasionnel
Supporter XLD
CC Patrick

Merci

C'est tout bon, c'était bien activeworkbook.sheets(blablabla).range(turlututu) chapeau pointu

Pour ce qui est du chemin, faut que je vois avec le service informatique, car se serait dans un dossier sharepoint.

Plus qu'a ouvrir les classeurs, supprimer les modules et activer la référence dans tous les classeurs et me faire un model pour les prochains

Merci beaucoup

Passe une bonne soirée.

G'Claire
 

patricktoulon

XLDnaute Barbatruc
👍
Bonjour @GClaire
impec! maintenant tu sais faire
clique résolu si c'est bon pour toi
:)
et pour finir
une astuce de vieux briscard on l'active par macro
EN METTANT CELA DANS CHAQUE FICHIER
DANS LE WORKBOOK OPEN PAR EXEMPLE
Tu aura ton xlam activer au démarrage du fichier
exemple
VB:
Sub ActiverReferencebyvbprojectref()
    On Error Resume Next
    ThisWorkbook.VBProject.References.AddFromFile Excel.Application.UserLibraryPath & "Gclaire.xlam"
End Sub


Sub déactive()
On Error Resume Next
VBprojname = Workbooks("Gclaire.xlam").VBProject.Name
Set ref = ThisWorkbook.VBProject.References(VBprojname)
ThisWorkbook.VBProject.References.Remove ref
Workbooks("Gclaire.xlam").Close
End Sub
 
Dernière édition:

GClaire

XLDnaute Occasionnel
Supporter XLD
👍
Bonjour @GClaire
impec! maintenant tu sais faire
clique résolu si c'est bon pour toi
:)
et pour finir
une astuce de vieux briscard on l'active par macro
EN METTANT CELA DANS CHAQUE FICHIER
DANS LE WORKBOOK OPEN PAR EXEMPLE
Tu aura ton xlam activer au démarrage du fichier
exemple
VB:
Sub ActiverReferencebyvbprojectref()
    On Error Resume Next
    ThisWorkbook.VBProject.References.AddFromFile Excel.Application.UserLibraryPath & "Gclaire.xlam"
End Sub


Sub déactive()
On Error Resume Next
VBprojname = Workbooks("Gclaire.xlam").VBProject.Name
Set ref = ThisWorkbook.VBProject.References(VBprojname)
ThisWorkbook.VBProject.References.Remove ref
Workbooks("Gclaire.xlam").Close
End Sub
CC Patrick, Le forum

Merci

Bon a mon avis je ne fais pas un truc comme il faut, lol

1719915411560.png
*
Passe une bonne journée.

Merci, G'Claire
 

patricktoulon

XLDnaute Barbatruc
re
voici les deux fichiers (xlam et xlsm)
place le xlam dans le dossier des addins
n'active rien
ouvre le fichier test et lance sa sub test
normalement le xla s'active avec sa ref a l'open et se déactive à la fermeture du fichier test
c'est tout totomatic :)
patrick
 

Pièces jointes

  • testcomplementGclaire2.xlsm
    12.6 KB · Affichages: 5
  • Gclaire.xlam
    12.2 KB · Affichages: 4

Discussions similaires

Réponses
1
Affichages
400
Réponses
0
Affichages
318

Statistiques des forums

Discussions
314 723
Messages
2 112 197
Membres
111 462
dernier inscrit
ymd76