Renseigner une cellule si une autre est renseignée

Résolu
cs_douda06 Messages postés 68 Statut Membre -  
cs_douda06 Messages postés 68 Statut Membre -
Bonjour ,

J'ai une question, j'ai cherché longtemps sans trouver de réponse.
J'ai sur un fichier Excel plusieurs macros avec plusieurs fonctions (un peu liés). Une des macros génère des feuilles avec des données automatiquement, je voudrai créer une fonction, pour qu'a la génération de ces feuilles :

-Si on trouve dans une colonne dont la valeur de sa premiere cellule like "Liste", si on y trouve une cellule differente de null , je voudrai que dans la ligne correspondante dans la colonne dont la valeur de sa premiere cellule like "Type", qu'une valeur "combobox" soit attribuée.

Liste Type
| |
| |
val1 ----------------combobox

Merci à l'avance

2 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Tout d'abord, dans le code "appelant" de la fonction, il faudra référencer 2 paramètres : les numéros des colonnes "Liste" et "type".
    Comme ceci :
    Dim ColList As Integer, ColType As Integer
    With Sheets("nom_de_ta_feuille")
        ColList = .Rows(1).Find("Liste").Column
        ColType = .Rows(1).Find("Type").Column
    End With
    Call InscriCombo("nom_de_ta_feuille", ColList, ColType)

    Nota : Si tu n'es pas sur à 100% de trouver les deux valeurs "Liste" et "Type" en ligne 1 de ta feuille, il faudra faire différemment.

    Et la fonction InscriCombo :
    Sub InscriCombo(NomFeuil As String, Liste As Integer, Type As Integer)
    Dim Lig As Long, DL As Long
    With Sheets(NomFeuil)
        DL = .Columns(Liste).Find("*", , , , xlByColumns, xlPrevious).Row
        If DL = 1 Then Exit Sub
        For Lig = 2 to DL
            If .Cells(Lig, Liste) <> "" Then .Cells(Lig, Type) = "Combobox"
        Next Lig
    End With
    End Sub
    1
    1. cs_douda06 Messages postés 68 Statut Membre
       
      Bonjour Franck,

      Merci pour ta réponse, je l'ai testé et ça marche.
      Une autre question stp, si on a plusieurs colonnes Type? ça n'affiche "Combobox" que pour la premiere colonne Type. Si je veux appliquer cette condition à toutes les colonnes qui terminent par "Type" comment faire?
      J'ai ajouté un asterisque avant type comme ça:
      ColType = .Rows(1).Find("*Type").Column
      Mais il parait que je dois l'ajouter dans une boucle, non?
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > cs_douda06 Messages postés 68 Statut Membre
         
        Regarde cette fonction : Find_Next, de Michel_M. Elle permet de trouver toutes les occurrences dans une colonne (dans l'exemple A1:A20). Tu peux facilement l'adapter pour trouver les occurrences dans une ligne.
        En cas de difficulté n'hésite pas à revenir.

        Sinon, tu peux également boucler sur toutes les cellules de ta ligne d'entête et stocker les bonnes colonnes dans une variable tableau ColType()...
        0
    2. cs_douda06 Messages postés 68 Statut Membre
       
      J'ai vu la fonction Find_Next, elle cherche une chaine bien précise dans une colonne connue, pour moi c'est un peu différent et c'est la où je trouve une difficulté, car je dois chercher dans une ligne dans plusieurs colonnes terminant par 'Type' --> "X Type", et le souci c'est que je ne sais pas trop comment gérer dans mon cas la variable de la feuille générée.
      Pour être plus précise je t'ai mis un fichier exemple sur cjoint:
      https://www.cjoint.com/?3Bntq6fJSXv
      Peux tu stp m'aider?
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > cs_douda06 Messages postés 68 Statut Membre
         
        Salut,

        Oui, mais pas avant lundi.
        Rappelle le moi stp.
        Bon week end
        a+
        0
    3. cs_douda06 Messages postés 68 Statut Membre
       
      Ok, merci et bon weekend aussi
      :)
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut,

    1- modifier ta sub d'appel comme ceci :

    Public Sub CreationFeuille()
    ' Crée les feuilles
    Dim w As Worksheet          'feuille
    Dim r As Range              'plage de cellules
    Dim c As Range              'cellule
    
    Dim ColList As Integer
    Dim ColType()
    
      Application.ScreenUpdating = False
      'Définir la plage de titres contenant les préfixes du nom des feuilles
      With Worksheets("Donnees").Cells(1, colNom)
        Set r = .Resize(1, .End(xlToRight).Column - .Column + 1)
      End With
      'Ajouter et mettre à jour les feuilles
      For Each c In r.Cells
        '- ajouter la feuille
        Set w = AjoutFeuille(c.Value)
        '- remplir la feuille
        Call RemplirFeuille(w, c)
        'créer le code événementiel
            'Call CreerCode(w.CodeName)
        '- mettre à jour la feuille X
        Call MàjFeuilleX(c.Value)
        Call CollectColType(w, ColType())
        Call InscriCombo(w.Name, ColList, ColType())
      Next c
    
      Application.ScreenUpdating = True
      
      MsgBox "feuilles crées"
    
    End Sub
    
    


    2- InscriCombo devient :

    Private Sub InscriCombo(shName As String, List As Integer, FType())
    Dim Lig As Long, DL As Long, Col As Integer
        With Sheets(shName)
            DL = .Columns(List).Find("*", , , , xlByColumns, xlPrevious).Row
            If DL = 1 Then Exit Sub
            For Lig = 2 To DL
                If .Cells(Lig, List) <> "" Then
                    For Col = LBound(FType) To UBound(FType)
                        .Cells(Lig, FType(Col)) = "Picklist"
                    Next
                End If
            Next Lig
        End With
    End Sub


    3- Ajouter la fonction :

    Private Sub CollectColType(sh As Worksheet, Tb())
    Dim Col, i As Integer
    With sh
        For Each Col In .UsedRange.Columns
            If .Cells(1, Col.Column) Like "*Type*" Then
                i = i + 1: ReDim Preserve Tb(i): Tb(i) = Col.Column
            End If
        Next
    End With
    End Sub

    1
    1. cs_douda06 Messages postés 68 Statut Membre
       
      Bonjour Franck,
      Merci pour ta réponse, j'ai testé mais je ne sais pas pourquoi ça me donne erreur 1004 "Erreur définie par l'application ou par l'objet" sur la ligne:
      DL = .Columns(List).Find("*", , , , xlByColumns, xlPrevious).Row
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > cs_douda06 Messages postés 68 Statut Membre
         
        Ma faute...
        En modifiant le code j'ai omis de te remettre le code donnant le numéro de la colonne Listes.
        Donc, si List = 0, DL = .Columns(List).Find("*", , , , xlByColumns, xlPrevious).Row renvoie une erreur, la colonne 0 n'existant pas...

        Voici les deux fonctions modifiées :
        Public Sub CreationFeuille()
        ' Crée les feuilles
        Dim w As Worksheet          'feuille
        Dim r As Range              'plage de cellules
        Dim c As Range              'cellule
        
        Dim ColList As Integer
        Dim ColType()
        
          Application.ScreenUpdating = False
          'Définir la plage de titres contenant les préfixes du nom des feuilles
          With Worksheets("Donnees").Cells(1, colNom)
            Set r = .Resize(1, .End(xlToRight).Column - .Column + 1)
          End With
          'Ajouter et mettre à jour les feuilles
          For Each c In r.Cells
            '- ajouter la feuille
            Set w = AjoutFeuille(c.Value)
            '- remplir la feuille
            Call RemplirFeuille(w, c)
            'créer le code événementiel
                'Call CreerCode(w.CodeName)
            '- mettre à jour la feuille X
            Call MàjFeuilleX(c.Value)
            Call CollectColType(w, ColList, ColType())
            Call InscriCombo(w.Name, ColList, ColType())
          Next c
        
          Application.ScreenUpdating = True
          
          MsgBox "feuilles crées"
        
        End Sub


        Private Sub CollectColType(sh As Worksheet, intList As Integer, Tb())
        Dim Col, i As Integer
        With sh
            intList = .Rows(1).Cells.Find("Listes").Column
            For Each Col In .UsedRange.Columns
                If .Cells(1, Col.Column) Like "*Type*" Then
                    i = i + 1: ReDim Preserve Tb(i): Tb(i) = Col.Column
                End If
            Next
        End With
        End Sub
        0
    2. cs_douda06 Messages postés 68 Statut Membre
       
      Merci beaucoup Franck, c'est gentil, ça marche très bien :)
      0