Renseigner une cellule si une autre est renseignée

Résolu
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   -  
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   -
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

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
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
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,

Oui, mais pas avant lundi.
Rappelle le moi stp.
Bon week end
a+
0
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
Ok, merci et bon weekend aussi
:)
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
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
cs_douda06 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup Franck, c'est gentil, ça marche très bien :)
0