recherche valeurs sur un onglet et copie sur un autre

Fab71

XLDnaute Nouveau
bonjour a tous,
j'essaye avec le peu de connaissance que j'ai en vba de chercher les valeurs "name" sur l'onglet "Json_extrait" en colonne A et de copier la cellule correspondante ainsi que celle en colonne B sur l'onglet "name"
j'ai plus ou moins réussi en adaptant un code vba trouvé (je n'arrive pas a ce que la copie débute en A1)

mon deuxième objectif, était de rechercher dans la même logique, "track_distances" et cette fois coller la cellule située en dessous et en colonne B (donc + 1 ligne et +1 colonne, par rapport a la recherche) et coller dans l'onglet "name" en colonne C, ce qui me permet d'avoir les distances par rapport au nom.

merci de votre aide
 

Pièces jointes

  • test macro boucle.xlsm
    29.3 KB · Affichages: 29

vgendron

XLDnaute Barbatruc
Hello

Avec une formule matricielle.. pas besoin de vba
en B2 de ta feuille "name"
=INDEX(Json_extrait!B:B;PETITE.VALEUR(SI("name"=Json_extrait!A:A;LIGNE(Json_extrait!A:A));LIGNES($B$1:B1)))
à valider avec Ctrl + Maj + Entrée

ensuite, pour le tracking en C2
=INDEX(Json_extrait!A:A;EQUIV(B2;Json_extrait!B:B;0)+19)

cela suppose que l'info "tracking" se trouve TOUJOURS 19 lignes en dessous du nom..
--> lorsque l'info n'existe pas, tu vois là que c'est "Tracks" qui est retourné..
 

Iznogood1

XLDnaute Impliqué
Bonjour,

Ci-joint un bout de code commenté
Code:
'On se force à déclarer toutes les variables pour limiter les erreurs
Option Explicit


Sub Demo()
  'On définit nos varaibles
  Dim i As Long
  Dim r As Range
 
  'On efface la feuille name
  'et on initialise nos variables
  Feuil4.Cells.ClearContents
  i = 0
   
  'On parcourt la colonne A de la feuille Json
  For Each r In Feuil2.Range("A1:A" & Feuil2.[A1].SpecialCells(xlLastCell).Row)
  'Si on trouve la valeur "name", on rempli la feuille name, colonnes A et B
  If r.Value = "name" Then
  i = i + 1
  With Feuil4
  .Range("A" & i).Value = "name"
  .Range("B" & i).Value = r.Range("B1").Value
  End With
  End If
  'Si on trouve la valeur "track_distances", on rempli la feuille name, colonnes A et B
  If r.Value = "track_distances" And i > 0 Then Feuil4.Range("C" & i).Value = r.Range("B2").Value
  Next r
End Sub
 

Fab71

XLDnaute Nouveau
Hello

Avec une formule matricielle.. pas besoin de vba
en B2 de ta feuille "name"
=INDEX(Json_extrait!B:B;PETITE.VALEUR(SI("name"=Json_extrait!A:A;LIGNE(Json_extrait!A:A));LIGNES($B$1:B1)))
à valider avec Ctrl + Maj + Entrée

ensuite, pour le tracking en C2
=INDEX(Json_extrait!A:A;EQUIV(B2;Json_extrait!B:B;0)+19)

cela suppose que l'info "tracking" se trouve TOUJOURS 19 lignes en dessous du nom..
--> lorsque l'info n'existe pas, tu vois là que c'est "Tracks" qui est retourné..

Justement ce n'est pas toujours 19 lignes...
Je vais regarder le côté matricielle, je n'y avait pas pensé
 

Fab71

XLDnaute Nouveau
Bonjour,

Ci-joint un bout de code commenté
Code:
'On se force à déclarer toutes les variables pour limiter les erreurs
Option Explicit


Sub Demo()
  'On définit nos varaibles
  Dim i As Long
  Dim r As Range

  'On efface la feuille name
  'et on initialise nos variables
  Feuil4.Cells.ClearContents
  i = 0
  
  'On parcourt la colonne A de la feuille Json
  For Each r In Feuil2.Range("A1:A" & Feuil2.[A1].SpecialCells(xlLastCell).Row)
  'Si on trouve la valeur "name", on rempli la feuille name, colonnes A et B
  If r.Value = "name" Then
  i = i + 1
  With Feuil4
  .Range("A" & i).Value = "name"
  .Range("B" & i).Value = r.Range("B1").Value
  End With
  End If
  'Si on trouve la valeur "track_distances", on rempli la feuille name, colonnes A et B
  If r.Value = "track_distances" And i > 0 Then Feuil4.Range("C" & i).Value = r.Range("B2").Value
  Next r
End Sub

Merci je regarde de plus près
 

vgendron

XLDnaute Barbatruc
Re

avec ceci peut etre..
VB:
Type ToExtract
    NomP As String
    trackDistance As Integer
End Type

Sub Macro1()
'
' Macro1 Macro
'

Dim liste() As ToExtract

   
    Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).Select
   
    Selection.AutoFilter
    ActiveSheet.Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="=name", _
        Operator:=xlOr, Criteria2:="=track_distances"
   
   
    nb = (Selection.SpecialCells(xlVisible).Count) / 2 - 1
    ReDim liste(1 To nb)
    i = 1
    For Each ele In Selection.Resize(, 1).SpecialCells(xlVisible)
        If ele = "name" Then liste(i).NomP = ele.Offset(0, 1)
        If ele = "track_distances" Then
            liste(i).trackDistance = ele.Row
            i = i + 1
        End If
    Next ele

    Selection.AutoFilter
    Sheets("name").Activate
    For i = 2 To nb
        Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = liste(i).NomP
        If IsNumeric(Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)) Then
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 1) = Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 2) = Sheets("Json_extrait").Range("B" & liste(i).trackDistance + 1)
        End If
    Next i
End Sub
 

Fab71

XLDnaute Nouveau
Re

avec ceci peut etre..
VB:
Type ToExtract
    NomP As String
    trackDistance As Integer
End Type

Sub Macro1()
'
' Macro1 Macro
'

Dim liste() As ToExtract

  
    Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).Select
  
    Selection.AutoFilter
    ActiveSheet.Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="=name", _
        Operator:=xlOr, Criteria2:="=track_distances"
  
  
    nb = (Selection.SpecialCells(xlVisible).Count) / 2 - 1
    ReDim liste(1 To nb)
    i = 1
    For Each ele In Selection.Resize(, 1).SpecialCells(xlVisible)
        If ele = "name" Then liste(i).NomP = ele.Offset(0, 1)
        If ele = "track_distances" Then
            liste(i).trackDistance = ele.Row
            i = i + 1
        End If
    Next ele

    Selection.AutoFilter
    Sheets("name").Activate
    For i = 2 To nb
        Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = liste(i).NomP
        If IsNumeric(Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)) Then
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 1) = Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 2) = Sheets("Json_extrait").Range("B" & liste(i).trackDistance + 1)
        End If
    Next i
End Sub

erreur d'execution '9'
 

vgendron

XLDnaute Barbatruc
je suppose que tu as lancé la macro à partir de la feuille name ?? donc oui sans doute, ca plante.

VB:
Type ToExtract
    NomP As String
    trackDistance As Integer
End Type

Sub Macro1()


Dim liste() As ToExtract 'déclare un tableau de type "ToExtract"
    Sheets("name").Cells.Clear 'efface la feuille destination
   
    Sheets("Json_extrait").Activate 'on bascule sur la feuille Json_Extrait
        Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).Select 'selection de toute la zone de données

        'on applique le filtre personnalisé
        Selection.AutoFilter
        Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="=name", Operator:=xlOr, Criteria2:="=track_distances"
       
        'compte le nombre de lignes
    nb = (Selection.SpecialCells(xlVisible).Count) / 2 - 1
    'dimensionne le tableau
    ReDim liste(1 To nb)
   
    i = 1
    'pour chaque element filtré
    For Each ele In Selection.Resize(, 1).SpecialCells(xlVisible)
        If ele = "name" Then liste(i).NomP = ele.Offset(0, 1) 'si c'est le nom, on le récupère en colonne B
        If ele = "track_distances" Then 'si le track distance, on récupère le NUMERO de ligne (l'accès à la ligne masquée en dessous est impossible)
            liste(i).trackDistance = ele.Row
            i = i + 1
        End If
    Next ele
    'desactive le filtre, pour démasquer les lignes qui nous interressent: Track Distance
    Selection.AutoFilter

    'on bascule sur la feuille Name
    Sheets("name").Activate
'pour chaque element du tableau (sans la première qui contient les intitulés "players" )
    For i = 2 To nb
        'on copie le nom
        Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = liste(i).NomP
        'si la ligne dessous le numéro enregistré contient un nombre (et pas track ou autre chose)
        If IsNumeric(Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)) Then
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 1) = Sheets("Json_extrait").Range("A" & liste(i).trackDistance + 1)
            Sheets("name").Range("A" & Rows.Count).End(xlUp).Offset(0, 2) = Sheets("Json_extrait").Range("B" & liste(i).trackDistance + 1)
        End If
    Next i
End Sub
 

Fab71

XLDnaute Nouveau
je vais regarder ca en rentrant, la condition :

'si la ligne dessous le numéro enregistré contient un nombre (et pas track ou autre chose)

n'est pas obligatoire dans l'absolu...(je teste en rentrant)

le principal est de bien avoir la valeur track distance correspondante au name (et le name est mis apres le json)
 

Discussions similaires

Réponses
6
Affichages
132

Statistiques des forums

Discussions
312 199
Messages
2 086 159
Membres
103 145
dernier inscrit
lea.