VBA Copier cellule autres feuilles sous conditions

Bonjour à tous.

Je suis en train de réalisé un petit outil excel et suis de nouveau coincé sur un petit sujet.

J'ai 1 onglet nommé "Page de garde", qui contient dans un colonne un numéro, et dans une autre colonne, un nom.

Avec un code VBA, lorsque je clique sur un bouton, des onglets se créer avec comme titre d'onglet, le numéro (feuille 2 = le numéro de la personne 1, feuille 3 = le numéro de la personne 2 et ainsi de suite).

Jusque là tout va bien. Seulement, j'aimerais qu'en "E2" de chaque feuille, s'affiche le nom de la personne correspond à cette feuille.

Si la feuille 2, son titre est 125, et que dans la feuille "Page de garde", le numéro 125 correspond à Paul, alors j'aimerais qu'en E2 de la feuille 2, s'affiche le mot "Paul".

Sachant que le numéro, le nom et le nombre de feuille varie sans cesse.

Merci d'avance.

9classeur2.zip (5.49 Ko)

Bonjour juju_ski,

J'ai du mal à faire le lien entre le classeur posté et tes explications.

A+

Bonjour,

As-tu envoyé le bon fichier?

Cdlt.

Bonjour,

Toutes mes excuses, je me suis trompé de classeur. Je remet le bon

7classeur-3.zip (35.25 Ko)

Bonjour,

Une proposition

17exemple.zip (36.89 Ko)

A+

Absolument fantastique.

.Range("E2") = C.Offset(0, 3).Value

C'est cette partie du code qui me permet de faire cela ?

Tout à fait !

On affecte à E2 la valeur de la cellule décalée de 3 colonnes par rapport à celle qui contient le numéro.

A+

C.Value étant la référence c'est cela ?

Merci beaucoup pour ces explications

Je pourrais réutiliser cela à présent.

C.Value est la valeur de la cellule C,

C étant la cellule "Numéro" définie dans la boucle

For Each C In .Range("B31:B" & DerLig), soit successivement chaque cellule de la plage B31:B33.

A+

Merci bien

Ca marche du tonnerre.

Je me permet de poser une autre question, pour de pas réouvrir un sujet :

J'utilise ce code VBA pour vérifier que les textbox ne sont pas vide. Cela fonctionne bien sauf que une fois remplie, je retrouve dans mon tableau de résultat les lignes vides correspondants aux nombres de fois où j'ai appuyé sur valider et où un MsgBox s'est affiché.

Comment faire en sorte que le MsgBox m'avertisse, mais que les lignes vides ne se chargent pas ?

' pour vérifier que le champ est rempli
Dim Ctrl As Control, ChampsManquants As String
    For Each Ctrl In Me.Controls
        If Ctrl.Tag = "Obligatoire" Then
' TAG = "Obligatoire"
            If Ctrl.Text = "" Then
                If ChampsManquants <> "" Then ChampsManquants = ChampsManquants & ", "
                ChampsManquants = ChampsManquants & Ctrl.Name
            End If
        End If
    Next Ctrl
    If ChampsManquants <> "" Then
        MsgBox "Les champs suivants sont nécessaires à l'application et n'ont pas été remplis:" & vbCrLf & ChampsManquants, vbOKOnly + vbInformation, "Champs manquants ou incorrects"
        Exit Sub
    End If
    ' <Réaliser ici les actions en cas de données d'entrée correctes>
    Unload Saisie
Exit Sub

Merci bien

Bonjour,

Je me permet de poser une autre question, pour de pas réouvrir un sujet

Tu as eu tort de pas ouvrir un nouveau sujet , cela te prive de l'avis de la plupart des intervenants (ils n'iront pas regarder un sujet résolu).

Pour le reste, les éléments que tu donnes sont insuffisants pour comprendre ton problème.

Le code vérifie bien que les contrôles ne sont pas vides mais il n'y a aucune instruction qui renseigne un quelconque tableau.

A+

Je ne voulais pas pourrir le forum avec mes topics à répétition. Je te montre vite fait mon code, et si je n'ai pas de réponse avant ce soir je créerai un nouveau topic

Mon code actuel est le suivant :

Private Sub CmdbuttonValider_Click()

Dim num As Long
' pout la dimension, les bugs etc
Sheets("Recherche foncière").Activate
' mettre ça au début
num = Sheets("Recherche foncière").Range("C65536").End(xlUp).Row + 1
' pour aller à la premiere ligne vide
Application.ScreenUpdating = False
'evite de voir les actions se dérouler a l'ecran
On Error Resume Next

Range("C" & num).Value = Txtcommune
Range("D" & num).Value = Txtadresse
Range("E" & num).Value = CbbAffectation
Range("F" & num).Value = CBBpréexistante
Range("G" & num).Value = TxtPLQ
Range("H" & num).Value = Txtnumpdq
Range("I" & num).Value = Txtproduit
Range("J" & num).Value = Txtnumparcelle
Range("N" & num).Value = Txtdétection
Range("L" & num).Value = CDbl(Replace(Txtpotentiel, ".", ","))
If Txtsurface = "" Then
    Range("K" & num).Value = 0
    Else
    Range("K" & num).Value = CDbl(Replace(Txtsurface, ".", ","))
    End If
' IIF = "" pour dire que si c'est vide, il ne met rien
' CDbl... pour dire que c'est au format numérique (et non en texte) pour faire des formules
Range("O" & num).Value = Txtprocessinterne
Range("P" & num).Value = Txtexclusivité
Range("M" & num).Value = Txtpersonnedossier
If OptionButton1.Value = True Then Range("B" & num) = ("Court terme")
If OptionButton2.Value = True Then Range("B" & num) = ("Moyen terme")
If OptionButton3.Value = True Then Range("B" & num) = ("Long terme")

' pour vérifier que le champ est rempli
Dim Ctrl As Control, ChampsManquants As String
    For Each Ctrl In Me.Controls
        If Ctrl.Tag = "Obligatoire" Then
' TAG = "Obligatoire"
           If Ctrl.Text = "" Then
                If ChampsManquants <> "" Then ChampsManquants = ChampsManquants & ", "
                ChampsManquants = ChampsManquants & Ctrl.Name
            End If
        End If
    Next Ctrl
    If ChampsManquants <> "" Then
        MsgBox "Les champs suivants sont nécessaires à l'application et n'ont pas été remplis:" & vbCrLf & ChampsManquants, vbOKOnly + vbInformation, "Champs manquants ou incorrects"
        Exit Sub
    End If
    ' <Réaliser ici les actions en cas de données d'entrée correctes>
   Unload Saisie
Exit Sub

Unload Me
'pour fermer l'userform après avoir cliqué sur validé

Range("B6").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=B6=""Court terme"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 8033810
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = True
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=B6=""Moyen terme"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 52479
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = True
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=B6=""Long terme"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = True
    ActiveWindow.SmallScroll Down:=-24
'Pour la mise en forme conditionnelle

Truc = Range("B6:U" & [C65536].End(xlUp).Row).Select
With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlDash
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlDash
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlDash
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
' pour la mise en page des lignes qui s'ajoutent à chaque fois

Application.ScreenUpdating = True

End Sub

Par ailleurs, lorsque je créer une nouvelle ligne, la mise en forme conditionnelle ne fonctionne pas sur cette ligne.

Je crois que je me suis attaqué à trop gros pour moi, même si jusqu'à présent j'arrivais à trouver plus ou moins les solutions sur internet

Lorsque tu cliques sur "Valider", ton code effectue les opérations suivantes :

1 - inscription des données du formulaire dans la feuille "Recherche foncière",

2 - vérification de la saisie correcte des contrôles,

3 - mises en forme conditionnelles,

4 - mise en page.

Je ne comprends pas la logique de ce traitement.

On s'attendrait plutôt à la séquence suivante :

1 - vérification des saisies

2 - si OK, alors inscription des données , etc.

Tu ne parviendras pas à obtenir un ensemble cohérent si tu ne définis pas clairement cette séquence.

Peux-tu joindre ton fichier afin de m'éviter de jouer aux devinettes ?

A+

8classeur-1.zip (52.86 Ko)

Oui bien sur j'aurais du le joindre plus tôt, toutes mes excuses.

Je suis tout à fait d'accord avec le fait que mon code fonctionne à l'envers. Le soucis, c'est que j'ai rajouter la vérification après avoir créer mon code donc je ne savais pas trop où coller ma partie de code de vérification.

Voici ton fichier en retour.

Dis-moi si cela correspond à ton attente.

A+

12classeur-1.zip (55.43 Ko)

Si ça correspond à mes attentes ? Bien sur !!! Ca marche du tonnerre. Avec la mise en forme conditionnelle et tout en plus !

Serait-ce d'abuser que de demander s'il est possible de faire la chose suivante : Lorsque j'ajoute le numéro de la parcelle, qu'il vérifie si celui-ci se trouve déjà dans la colonne J, et m'en avertir si c'est le cas (mais en l'inscrivant quand même). La difficulté réside dans le fait que parfois ma colonne numéro parcelle compote : 1221, 1336, 1226, 8562 et 5656

Or la si j'ajoute la parcelle : 5656 (et rien d'autre), est-ce qu'il va arriver à voir que la 5656 a déjà été entré auparavant quelque part ?

Je ne voudrais surtout pas abuser, donc je comprendrais que tu ne répondes pas

Tu peux ajouter cette partie de code après l'instruction d'activation de la feuille "Recherche foncière" :

    Sheets("Recherche foncière").Activate
    If Application.CountIf(Columns("J"), Me.Txtnumparcelle.Value) > 0 Then
        MsgBox "Le numéro de parcelle " & Me.Txtnumparcelle.Value & " a déjà été enregistré."
    End If

A+

Merci tu as bien compris ce que je souhaitais. En revanche, ce que je craignais est arrivé. Si le numéro est noyé parmi d'autre numéro, il ne fais pas le rapprochement et passe à côté d'un possible doublon.

Encore merci pour le temps que tu prends pour me répondre.

Vois-tu l'utilité d'un exemple ? ...

Essaie avec :

    Sheets("Recherche foncière").Activate
    If Application.CountIf(Columns("J"), "*" & Me.Txtnumparcelle.Value & "*") > 0 Then
        MsgBox "Un numéro de parcelle contenant le numéro " & Me.Txtnumparcelle.Value & " a déjà été enregistré."
    End If

A+

Rechercher des sujets similaires à "vba copier feuilles conditions"