Code pour un tableau

bonjour à tous et merci d'avance

je débute en code soyez indulgent :

j'ai ce bout de code qui fonctionne très bien mais gérer le rendre plus fonctionnel:

Option Explicit
Dim i As Integer
Dim cell As Range
---------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next
If Not Intersect(Target, Columns(3)) Is Nothing Then
For i = 1 To 20 'variable de nb de colonnes
If Target.Value = vbEmpty Then
Cells(Target.Row, i).clearcontent
End If
'pour le nom
Cells(Target.Row, 1) = Application.WorksheetFunction.VLookup(Target.Value, Feuil4.[A:AZ], 4, 0)

j'aimerai changer cette dernière ligne du type:

Cells(Target.Row, Range("Tableau47[[Nom]]")) = Application.WorksheetFunction.VLookup(Target.Value, Feuil4.("Rapport[[Nom]]"), 4, 0)

pouvez- vous m'aider SVP

très cordialement

B'jour,

Si j'ai bien compris tu as un tableau qui se nomme "Nom" ?

Si c'est le cas pour l’appeler il faut faire :

Range("Nom")

bonjour JeromeB, Jefekoi, le fil,

un essai en rouge pour la cellule, mais je ne comprends pas la partie Vlookup sans voir le fichier

Cells(Target.Row, Range("Tableau47[[Nom]]").column) = Application.WorksheetFunction.VLookup(Target.Value, range("Rapport"), 4, 0)

bonjour à tous:

merci pour ce retour.

j'ai pu un peu avancer

Cells(Target.Row, Range("Tableau47[[Nom]]").Column) = Application.WorksheetFunction.VLookup(Target.Value, Feuil4.[A:AZ], 4, 0)

cela fonctionne cependant la second partie ne marche pas:

Application.WorksheetFunction.VLookup(Target.Value,range("Rapport"), 4, 0)

situation:

la recherche s'effectue sur un second tableau qui est nommé " rapport" et qui se trouve sur la feuille 4 .

je souhaite faire cette recherche dans la colonne " Nom"

merci d'avance à vous pour cette aide

très amicalement

jb

bonjour,

si vous calculez le numéro de ces colonnes avant le for...Next avec

iCOL1=Range("Tableau47[[Nom]]").Column 'cette colonne dans la feuille concernée

iCOL2=Range("Rapport[[Nom]]").Column-Range("Rapport").Column+1 'cette colonne dans le tableau concerné

et dans le For...Next

Cells(Target.Row, iCOL1) = Application.WorksheetFunction.VLookup(Target.Value, range("Rapport"),iCOL2, 0)

re,

désolé je suis très limité en VBA

dans l'expression:

Cells(Target.Row, Range("Tableau47[[Nom]]").Column) = Application.WorksheetFunction.VLookup(Target.Value, Feuil4.[A:AZ], 4, 0)

je souhaite modifier ce bout de code du type

.....=Application.WorksheetFunction.VLookup(Target.Value, Feuil4.Range("Rapport[[#All]]"), Range("Rapport[[Nom]]").Column, 0)

soit l'idée => rechercher dans la feuille4 dans le tout le tableau Rapport, dans la colonne "Nom"

mais je ne pense pas que cela soit aussi simple

d'avance merci à vous

cdt

bonjour,

3jeromeb.xlsb (26.73 Ko)
Private Sub Worksheet_Change(ByVal Target As Range)
     Dim iCOL1, iCOL2, c As Range, X

     Set c = Intersect(Target, Columns(3))     'toutes les cellules modifiées de la colonne 3
     If c Is Nothing Then Exit Sub     'no cells modifiées dans la colonne 3

     iCOL1 = Range("Tableau47[Nom]").Column     'cette colonne dans cette feuille
     iCOL2 = Sheets("blad2").Range("Rapport[Nom]").Column - Sheets("blad2").Range("Rapport").Column + 1     'cette colonne dans ce tableau de la feuille "blad2"

     'MsgBox iCOL1 & " est la colonne de nom du ""tableau47"" dans la feuille" & vbLf & iCOL2 & " est le listcolumn de nom dans le tableau ""rapport"""

     With c.Cells(1)     '1ière cellule de la colonne 3 modifiée
          If Len(.Value) = 0 Then     'cellule est vide
               Application.EnableEvents = False     'eviter endless loop of events
               Cells(c.Row, 1).Resize(, 20).ClearContents     'RAZ les 20 cellules de cette ligne
               Application.EnableEvents = True
          Else
               On Error Resume Next
               X = WorksheetFunction.VLookup(.Value, Sheets("blad2").Range("rapport"), iCOL2, 0)     'A-cellule de cette ligne
               On Error GoTo 0
               If X = vbEmpty Then Cells(c.Row, 1) = "erreur" Else Cells(c.Row, 1) = X
          End If
     End With

End Sub

bonjour,

merci pour ce retour

si je suis ce code, je toi reprendre ses lignes pour chaque recherche ( prénom, date de naissance, age, adresse...)

un grand merci à vous

amicalement

bonjour, on peut le faire comme ça.

si les colonnes sont fixe et on ne modifie plus le tableau, on peut assigner les numéros des colonnes comme "Constant" au début du module, comme je l'ai fait avec ces 4 ou on le fait comme avec iCOL_Nom dans la macro.

Puis on cherche une fois la ligne iL dans ce tableau et on l'utilise cet iL dans les lignes suivantes

Le problème est que je ne connais pas votre layout ?

2jeromeb.xlsb (26.94 Ko)
Option Explicit

'ici les colonnes fixe du tableau "Rapport" de la feuille "Blad2" (si on ne modifie plus ce tableau)
Const iCOL_Age = 8
Const iCOL_Naissance = 7
Const iCol_Prénom = 4
Const iCol_Adres = 10

Private Sub Worksheet_Change(ByVal Target As Range)
     Dim iCOL1, iCOL_Nom, c As Range, c1, iL

     Set c = Intersect(Target, Columns(3))     'toutes les cellules modifiées de la colonne 3
     If c Is Nothing Then Exit Sub     'no cells modifiées dans la colonne 3

     iCOL1 = Range("Tableau47[Nom]").Column     'cette colonne dans cette feuille
     iCOL_Nom = Sheets("blad2").Range("Rapport[Nom]").Column - Sheets("blad2").Range("Rapport").Column + 1     'cette colonne dans ce tableau de la feuille "blad2"

     For Each c1 In c.Cells   'boucle toutes ces cellules de la colonne 3 modifiée

          If Len(c1.Value) = 0 Then     'cellule est vide
               Application.EnableEvents = False     'eviter endless loop of events
               Cells(c1.Row, 1).Resize(, 5).ClearContents     'RAZ les 5 cellules de cette ligne
               Application.EnableEvents = True

          Else
               With Sheets("blad2").Range("rapport")
                    iL = Application.Match(c1.Value, .Columns(iCOL_Nom), 0)      'on cherche 1 fois, quelle ligne dans ce tableau pour ce nom
                    If IsNumeric(iL) Then     'numérique = ligne trouvée !
                         Cells(c1.Row, 1).Resize(, 2).Value = Array(.Cells(iL, iCOL_Age).Value, .Cells(iL, iCOL_Naissance).Value)
                         'on ne touche pas à la cellule C !!! donc blocquer les events n'est pas nécessaire
                         Cells(c1.Row, 4).Resize(, 2).Value = Array(.Cells(iL, iCol_Prénom).Value, .Cells(iL, iCol_Adres).Value)
                    Else
                         Cells(c1.Row, 1).Resize(, 2).Value = Array("??? 1", "??? 2")
                          'on ne touche pas à la cellule C !!!
                         Cells(c1.Row, 4).Resize(, 2).Value = Array("???3 ", "??? 4")
                    End If
               End With
          End If
     Next

End Sub

re,

petite question:

pourquoi le résultat de la recherche dans la feuille blad1, le résultat ne va pas dans la colonne nommé de la même manière :

exemple: le résultat de age va dans la colonne 1 au lieu d'aller dans le tableau "Tableau47"colonne "age"

encore une fois merci à vous pour votre aide

cdt

re,

j'ai mis ce code:

Cells(c1.Row, Range("Tableau47[Age]").Column).Value = Array(.Cells(iL, iCOL_Age).Value)

cela fonctionne parfaitement cependant, pouvez vous me dire à quoi sert ce bout de code:

Cells(c1.Row, 1).Resize(, 2).Value = Array("??? 1", "??? 2")

merci à vous

cdt

re,

s'il n'y a qu'un valeur à copier&coller, on n'a pas besoin de "array" et les parenthèses

Cells(c1.Row, Range("Tableau47[Age]").Column).Value = .Cells(iL, iCOL_Age).Value

et la 2ième question, c'était dans le cas où l'Application.Match n'avait pas trouvé un résultat valable. Alors, vous voulez vider les cellules concernées ou vous voulez mettre des ??? ?

super merci tout fonctionne parfaitement

un grand merci

good job

petite question de minuit :

j'ai utiliser ton code pour mettre à jour mon tableau lorsque je rendre le nom cela est parfait

mais comment je peux faire pour une mise à jour des données qui sont déjà dans le tableau:

j'ai essaye de faire une boucle en activant le cellule de la colonne nom :

Sub NbreLigneTableau()
Dim NBLigne As Long
Dim NB As Long
Dim NBFin As long

NBLigne = Range("Tableau").Rows.Count - 1
NBFin = 2
NB = 0
For NB = 0 To NBLigne

NBFin = NBFin + 1 ' le tableau commence à la ligne 3 sans le titre
Cells(NBFin, 4).Activate
Next
End Sub

cela me sélectionne bien chaque cellule de la colonne nom mais cela ne met pas à le tableau.

lorsque j'utilise l'enregistreur de macro:

il me donne:

Range("D3").Select
ActiveCell.FormulaR1C1 = "DUDU"

mais là cela met bien à jour toutes les données du tableau

peux tu m'aider

merci d'avance à toi

cdt

re,

je ne comprends pas bien les manipulations que vous faitez. Si vous faitez un double-clicque avec le souris dans la ligne voulue et vous ajoutez cette macro dans le même module que le worksheet_Change

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Intersect(Target, Range("A10:D30")) Is Nothing Then Exit Sub     'vous faitez un double-clicque dans une cellule de cette plage
     With Target.Offset(, 3 - Target.Column)     'la colonne clé pour la macro "worksheet_Change" est la 3ième
          .Value = .Value     'remplacer sa valeur par sa valeur = provoquer un evenement
     End With
End Sub

bonjour pour cette réponse, elle me donne la solution à mon pb.

au lieu de : Cells(NBFin, 4).Activate

mettre: Cells(NBFin, 4).value=Cells(NBFin, 4).value

encore merci à vous

cdt

Rechercher des sujets similaires à "code tableau"