Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 [VBA] macro pour cibler une cellule aléatoire et y coller une valeur

Casim

XLDnaute Nouveau
Bonjour à tous,

J'ai condensé mon exemple à ce que je veux obtenir. Comment j'arrive au résultat actuel importe peu.

Juste que j'ai ma feuille de données (feuille 1) que je crée à chaque utilisation en collant ces données. Je ne peux donc pas utiliser de formule sur cette feuille.
Après différents calculs, j'arrive au résultat en feuille 2.

Dans mes données, je ne dois exploiter que les valeurs (0015 1) et (0016 1). J'ai donc utilisé un système de filtre (non présent ici) pour alimenter ma feuille 2.
Le problème est que pour ces valeurs, qui viennent aléatoirement, j'ai des codes en regard des valeurs qui peuvent tomber aléatoirement en rang 1, 2, ou 3 (colonnes FGH feuille 1), en fonction de la position des valeurs (C D ou E) et aléatoirement en sur n'importe quelle ligne (jusque 50, mais pas toujours, ici, il n'y en a que 28).
Cela me donne après tous mes calculs le tableau en feuille 2.
Sauf que les codes que j'ai en regard des valeurs, il y en a en fait 3 possibles, et je dois faire un choix manuel.

Mon objectif, c'est que le choix fait en colonne (code réel), validé par menu déroulant manuellement, vienne automatiquement remplacer le code en feuille 1, au bon endroit.
Et ce, avec une macro, puisque je ne peux pas rentrer de formule sur ma feuille 1.

J'ai essayé de voir si je pouvais déterminer l'adresse de la cellule cible pour ensuite faire réécrire dedans, mais comme le code revient régulièrement, je n'arrive qu'à récolter toutes les adresses de chaque cellule contenant le code, et pas la cellule unique.
Je me suis dit qu'en recoupant les données en cellules ABCD de la feuille 2, il y avait certainement moyen de retrouver la bonne cellule cible.
Mais je sèche, parce que c'est une base de données aléatoire.

Merci d'avance pour votre aide!
 

Pièces jointes

  • Filtre codes.xlsx
    15.7 KB · Affichages: 17
Solution
Bonjour à toutes et à tous, bonjour @Casim

Si j'ai bien compris ta demande ...
J'ai placé ta liste de validation dans une feuille "Tables" avec le nom défini "Chx_Code".
J'ai traité l'événement Change de la "Feuil2" avec ce code :
Enrichi (BBcode):
Private Sub Worksheet_Change(ByVal Target As Range)
     Dim Code$, Rang As Byte, N°$, N°Col As Byte, DerLgn As Long, PlageCible As Range
    
     'Vérification cellule concernée :
     '1) Validation
     On Error Resume Next
     With Target.Validation
          Typ = .Type
          form = .Formula1
     End With
     On Error GoTo 0
    
     '2) Une seule cellule, Colonne E ou J, ligne entre 4 et 19, validation type liste avec la formule =Chx_Code...

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour à toutes et à tous, bonjour @Casim

Si j'ai bien compris ta demande ...
J'ai placé ta liste de validation dans une feuille "Tables" avec le nom défini "Chx_Code".
J'ai traité l'événement Change de la "Feuil2" avec ce code :
Enrichi (BBcode):
Private Sub Worksheet_Change(ByVal Target As Range)
     Dim Code$, Rang As Byte, N°$, N°Col As Byte, DerLgn As Long, PlageCible As Range
    
     'Vérification cellule concernée :
     '1) Validation
     On Error Resume Next
     With Target.Validation
          Typ = .Type
          form = .Formula1
     End With
     On Error GoTo 0
    
     '2) Une seule cellule, Colonne E ou J, ligne entre 4 et 19, validation type liste avec la formule =Chx_Code
     If (Target.Count = 1) And (Target.Column = 5 Or Target.Column = 10) And (Target.Row >= 4 And Target.Row <= 19) And (Typ = 3) And (form = "=Chx_Code") Then
          With Target
               Code = .Value
               Rang = .Offset(0, -4).Value
               N° = .Offset(0, -3).Value
               N°Col = .Offset(0, -2).Value + 5
          End With
          'Vérification ligne renseignée
          If Rang <> 0 And N° <> "" And N°Col <> 5 Then
               With Feuil1
                    DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
                    Set PlageCible = .Range(.Cells(2, 1), .Cells(DerLgn, 8))
               End With
               PlageCible.Cells(Rang, N°Col) = Code
          End If
     End If
    
End Sub

Voir le fichier joint
Merci de me tenir informé
Amicalement
Alain
 

Pièces jointes

  • macro pour cibler une cellule aléatoire et y coller une valeur.xlsm
    28.1 KB · Affichages: 13

Casim

XLDnaute Nouveau
Bonjour à tous, bonjour @AtTheOne
Franchement, c'est top.
C'est exactement le but recherché.
Bon, maintenant il va falloir que j'arrive à transposer ça sur mon fichier réel, dans la mesure où j'ai 11 catégories (là il y en a deux (0015 1 et 0016 1) et que les listes de choix de codes ne sont pas les mêmes à chaque fois...
Je vais tâtonner, je vais comprendre comment fonctionne ton code, ça devrait le faire.

Merci infiniment! Cela fait plus d'un mois que je cherche...
 

Casim

XLDnaute Nouveau
@AtTheOne

Petite question : j'essaie de transposer, mais j'ai un souci sur la fin de la macro :

J'ai changé le nom de la feuille, le nombre de colonnes, le nom de la table de données, tout ça.
Le "typ=3", c'est dimensionnant?

Dans le Set PlageCible : derlgn, c'est la dernière colonne de la plage ciblée?
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…