XL 2013 gestion d'onglets et afficher dans nouveau classeur ou onglet

kev2246

XLDnaute Nouveau
Bonjour,

Je viens de débuter la programmation sous vba donc autant vous dire que je ne suis pas encore à l'aise. Voilà mon soucis :
J'ai un fichier excel qui contient deux onglets :
1er onglet: composants+fonctions
2e onglet : fonctions+prescriptions

Un composant peut appartenir à plusieurs fonctions. une prescription peut couvrir plusieurs fonctions également.

J'aimerais faire tourner une macro qui ira cherchée l'information dans les différents onglets pour les afficher soit dans un nouveau classeur ou un nouvel onglet.
En gros, en fonction du composant choisit par l'utilisateur, j'aimerais qu'il m'affiche toutes les fonctions qui sont associées ainsi que les prescriptions associées à ces fonctions. Je dois avoir au moins 10000 composants à traiter et j'aimerais bien automatiser tout ça.

Je vous joins mon fichier test et vous remercie d'avance pour votre aide !
 

Pièces jointes

  • Classeur2.xlsx
    8.8 KB · Affichages: 12
Solution
Bonjour,

Voici le code modifié. J'ai commenté les lignes ajoutées.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Tabl1 As Variant, Tabl2 As Variant, I As Long, J As Long
  Dim L1 As Long, L2 As Long, Ligne As Variant
  If Target.Address = "$D$2" Then
    Application.EnableEvents = False
    Range("E2", Cells(Rows.Count, 6).End(xlUp)).Offset(1) = ""
    Tabl1 = Range("A2", Cells(Rows.Count, 2).End(xlUp))
    With Sheets("fonctions_prescription")
      Tabl2 = .Range("A2", .Cells(.Rows.Count, 2).End(xlUp))
    End With
    With Sheets("prescriptions_creneaux")
      L1 = 1
      For I = 1 To UBound(Tabl1, 1)
        If Tabl1(I, 1) = Target Then
          L1 = L1 + 1
          Cells(L1, 5) = Tabl1(I, 2)
          L2 = L1 -...

kev2246

XLDnaute Nouveau
Tu écris :



Aussi, ce composant est dans quelle cellule ?
je ne comprends pas trop votre question.

Ce que j’aimerais c’est tu choisis un composant dans la 1ere colonne de la 1ere feuille, ensuite tu affiches toutes les fonctions(se trouvant dans la colonne 2 de la 1ere feuille) qui sont liées à ce composant. Une fois que t’as la fonction ou les fonctions, tu vas chercher dans la feuille 2, toutes les prescriptions qui sont liés à cette ou ces fonctions.

Au final, toutes ces infos doivent être résumées dans un tableau
 

kev2246

XLDnaute Nouveau
Oui, mais comment choisis-tu ce composant ? Tu peux écrire, par exemple, "A2267BA" en utilisant une liste déroulante en D1, ou tu peux cliquer ou double-cliquer sur la cellule A3, il faut que je le sache.

Daniel
D'accord, effectivement t'as raison, autant pour moi. L'idéal serait d'avoir une liste déroulante avec tous les composants qui sont dans la 1ere colonne de la première feuille et une fois que tu choisis un composant, il te sort toutes les fonctions qui sont associées ainsi que les prescriptions relatives à ces fonctions là sous forme de tableau.

Si c'est pas assez claire, n'hésitez pas à reposer la question car je tente plusieurs trucs mais rien ne marche.

J'en ai besoin pour croiser certaines informations et faire la vérification. J'ai au moins 10000 composants donc je ne peux pas m'amuser à faire des copier/coller sinon je risque d'en oublier.

Je vous remercie
 

danielco

XLDnaute Accro
Essaie :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Tabl1 As Variant, Tabl2 As Variant, I As Long, J As Long
  Dim L1 As Long, L2 As Long
  If Target.Address = "$D$2" Then
    Application.EnableEvents = False
    Range("E2", Cells(Rows.Count, 6).End(xlUp)).Offset(1) = ""
    Tabl1 = Range("A2", Cells(Rows.Count, 2).End(xlUp))
    With Sheets("fonctions_prescription")
      Tabl2 = .Range("A2", .Cells(.Rows.Count, 2).End(xlUp))
    End With
    L1 = 1
    For I = 1 To UBound(Tabl1, 1)
      If Tabl1(I, 1) = Target Then
        L1 = L1 + 1
        Cells(L1, 5) = Tabl1(I, 2)
        L2 = L1 - 1
        For J = 1 To UBound(Tabl2, 1)
          If Tabl2(J, 2) = Tabl1(I, 2) Then
            L2 = L2 + 1
            Cells(L2, 6) = Tabl2(J, 1)
          End If
        Next J
      End If
    Next I
    Application.EnableEvents = True
  End If
End Sub

Daniel
 

Pièces jointes

  • Classeur2.xlsm
    21.9 KB · Affichages: 6

kev2246

XLDnaute Nouveau
Merci beaucoup pour la réactivité Daniel, tu me sauves la vie. S'il y avait quelques commentaires pour m'aider à comprendre, ç'aurait été parfait car je suis vraiment débutant.

Merci pour ton aide précieuse encore une fois !
 

kev2246

XLDnaute Nouveau
Bonsoir Daniel,

Comme échangé par message, il y a un 3e onglet qui comprend les prescriptions avec tous les créneaux où on peut faire la maintenance ("prescription_creneaux"). Là où on affiche les résultats, j'aimerais voir ces créneaux juste à côté de chaque prescription si possible.

Pour résumer,
choix du composant (avec la liste déroulante)--> fonctions associées--> toutes les prescriptions qui couvrent ces fonctions--> créneaux ou on peut réaliser la maintenance
 

Pièces jointes

  • Copie de Classeur2 (1).xlsm
    17.1 KB · Affichages: 3

danielco

XLDnaute Accro
Bonjour,

Voici le code modifié. J'ai commenté les lignes ajoutées.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Tabl1 As Variant, Tabl2 As Variant, I As Long, J As Long
  Dim L1 As Long, L2 As Long, Ligne As Variant
  If Target.Address = "$D$2" Then
    Application.EnableEvents = False
    Range("E2", Cells(Rows.Count, 6).End(xlUp)).Offset(1) = ""
    Tabl1 = Range("A2", Cells(Rows.Count, 2).End(xlUp))
    With Sheets("fonctions_prescription")
      Tabl2 = .Range("A2", .Cells(.Rows.Count, 2).End(xlUp))
    End With
    With Sheets("prescriptions_creneaux")
      L1 = 1
      For I = 1 To UBound(Tabl1, 1)
        If Tabl1(I, 1) = Target Then
          L1 = L1 + 1
          Cells(L1, 5) = Tabl1(I, 2)
          L2 = L1 - 1
          For J = 1 To UBound(Tabl2, 1)
            If Tabl2(J, 2) = Tabl1(I, 2) Then
              L2 = L2 + 1
              Cells(L2, 6) = Tabl2(J, 1)
              '"Ligne" récupère la ligne de la prescription sur la feuille prescriptions_creneaux
              Ligne = Application.Match(Tabl2(J, 1), .[A:A], 0)
              'Si la prescription est trouvée, on copie les informations
              If IsNumeric(Ligne) Then
                .Range(.Cells(Ligne, 2), .Cells(Ligne, .Columns.Count).End(xlToLeft)).Copy
                Cells(L2, 7).PasteSpecial xlPasteValues
                Application.CutCopyMode = False
              End If
            End If
          Next J
        End If
      Next I
    End With
    Application.EnableEvents = True
  End If
End Sub
 

danielco

XLDnaute Accro
En gros plutôt que d'avoir l'approche composants-->fonctions-->prescriptions-->créneaux, j'ai essayé de modifier le code pour qu'il fasse uniquement prescriptions-->composants-->créneaux et là ça marche pas.

Pas sûr de bien comprendre... C'est ce résultat que tu veux obtenir ?

Daniel
 

Pièces jointes

  • Annotation 2020-08-11 143558.png
    Annotation 2020-08-11 143558.png
    11.9 KB · Affichages: 12

kev2246

XLDnaute Nouveau
C'est bien ça, je veux pas voir les fonctions dans le résultat final. Plutôt que de choisir le composant dans le menu déroulant, on choisit la prescription et après tu retournes tous les composants et les créneaux. Peux-tu m'envoyer le code stp?
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 443
Membres
103 211
dernier inscrit
pierrecharbs