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,
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 ?
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
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