Macro et worksheets

Résolu
cs_83Alain Messages postés 4 Date d'inscription vendredi 12 août 2011 Statut Membre Dernière intervention 30 août 2011 - 12 août 2011 à 19:08
cs_83Alain Messages postés 4 Date d'inscription vendredi 12 août 2011 Statut Membre Dernière intervention 30 août 2011 - 30 août 2011 à 20:35
Bonjour,

j'essaie vainement de faire fonctionner une macro.

Je souhaite qu'elle cherche une valeur dans la feuille active(resultats_2011), qu'elle copie les valeurs de 4 des cellules de la ligne où cette valeur a été trouvée dans la feuille Faron de ce même fichier.

Pouvez vous corriger mon script.
Merci de votre aide.

Je suis sur VB 6.3 EXCEL 2003
Option Explicit

Const Parcours = 6
Const Col1 = 1
Const jour = 1
Const pds = 8
Const tps = 9
Const my = 10
Const dn = 11


Sub extrait_cotes()
'rappatrie les lignes où le Faron ou le Mt Caume sont chronométrés
Dim derniereligne As Integer
Dim i, j, k As Integer
Dim A, B, C, D As Variant
k = 0
j = 2

    derniereligne = Application.InputBox("derniere ligne")

    For i = 1 To derniereligne
        If Cells(i, dn).Value = 370 Then
            A = Cells(i, jour).Value
            B = Cells(i, tps).Value
            C = Cells(i, my).Value
            D = Cells(i, pds).Value
            
            With Sheets("Faron")
                If .Cells(j, 1).Value = " " Then
                .Cells(j, 1).Value = A
                .Cells(j, 2).Value = B
                .Cells(j, 3).Value = C
                .Cells(j, 4).Value = D
                j = j + 1
                End If
            End With
            k = k + 1
        End If
    Next i
End Sub

9 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
12 août 2011 à 19:39
Bonjour,

En ce qui concerne ta macro actuelle...
1- est ce que la valeur que tu cherches n'est présente qu'une seule fois ? (si oui, une fois trouvé sorts de ta boucle (exit for).)

2 - Pour effectuer une recherche, la façon la plus "efficace" serait l'utilisation de FIND.

Exemple de fonction :
Function cherch(nomF As String, valCherch As String) As Integer
'fonction de recherche...
'**********************************************************
' recherche la valeur 'valCherch' et nous indique le
' N° de ligne  où elle se trouve VcLig / VcCol
'**********************************************************
Dim vc As Variant
Sheets(nomF).Activate
Sheets(nomF).Cells(1, 1).Activate
Set vc =  Cells.Find(what:=valCherch, lookAt:=xlWhole, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False)
If Not vc Is Nothing Then
    cherchC = vc.Row
End If
End Function


ce qui donnerait au final pour ton code :



Const Parcours = 6
Const Col1 = 1
Const jour = 1
Const pds = 8
Const tps = 9
Const my = 10
Const dn = 11




Sub extrait_cotes()
j = 2
'recherche de la valeur 370
    i = cherch(ActiveSheet.Name, "370")

'recuperation des valeurs
            A = Cells(i, jour).Value
            B = Cells(i, tps).Value
            C = Cells(i, my).Value
            D = Cells(i, pds).Value

'recopie des valeurs :
            With Sheets("Faron")
                If .Cells(j, 1).Value = "" Then
                .Cells(j, 1).Value = A
                .Cells(j, 2).Value = B
                .Cells(j, 3).Value = C
                .Cells(j, 4).Value = D
                j = j + 1
                End If
            End With
End Sub


Function cherch(nomF As String, valCherch As String) As Integer
'fonction de recherche...
'**********************************************************
' recherche la valeur 'valCherch' et nous indique le
' N° de ligne  où elle se trouve VcLig / VcCol
'**********************************************************
Dim vc As Variant
Sheets(nomF).Activate
Sheets(nomF).Cells(1, 1).Activate
Set vc = Cells.Find(what:=valCherch, lookAt:=xlWhole, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False)
If Not vc Is Nothing Then
    cherch = vc.Row
End If
End Function



Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
PS:Merci d'utiliser les [color =red]balises de Cod
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 août 2011 à 14:13
Bon.
Tu n'es plus là ?
Je t'ai en dépit de tout fait quelque-chose d'élastique ===>>

Option Explicit
Const Parcours = 6
Const Col1 = 1
Const jour = 1
Const pds = 8
Const tps = 9
Const my = 10
Const dn = 11

Private Sub CommandButton1_Click()
  Dim val_a_trouver As Double, feuille_ou_chercher As Worksheet, feuille_ou_copier As Worksheet
  Dim colonne_ou_copier As String, mode As String
  val_a_trouver = 370
  Set feuille_ou_chercher = Worksheets("resultats_2011")
  Set feuille_ou_copier = Worksheets("Faron")
  colonne_ou_copier = "A"
  '===================== a toi de choisir ici entre les deux mode (en en mettant un en commentaire
  mode = "écrasement"
  'mode = "à-la-suite"
  '================================================================================================
  If Not extrait_cotes(feuille_ou_chercher, val_a_trouver) Is Nothing Then
    on_copie extrait_cotes(feuille_ou_chercher, val_a_trouver), feuille_ou_copier, colonne_ou_copier, mode
  End If
End Sub
Private Function extrait_cotes(F As Worksheet, V As Double) As Range
  Dim derniereligne As Long
  Dim i As Integer
  derniereligne = F.Cells(Rows.Count, dn).End(xlUp).Row
  For i = 1 To derniereligne
    If Cells(i, dn).Value = V Then
      If extrait_cotes Is Nothing Then
         Set extrait_cotes = Union(Cells(i, jour), Cells(i, tps), Cells(i, my), Cells(i, pds))
       Else
         Set extrait_cotes = Union(extrait_cotes, Cells(i, jour), Cells(i, tps), Cells(i, my), Cells(i, pds))
       End If
     End If
  Next i
End Function
Private Sub on_copie(quoi As Range, F1 As Worksheet, colonne As String, mode As String)
  Dim desti As Long
  If mode = "écrasement" Then
     F1.Cells.ClearContents
     DoEvents
   End If
  desti = F1.Cells(Rows.Count, colonne).End(xlUp).Row + 1
  quoi.Copy Destination:=F1.Range(colonne & desti)
End Sub

qui devrait répondre à tous les cas de figure. Regarde entre les "======"
et choisis ton mode, selon ce que tu veux !



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
cs_83Alain Messages postés 4 Date d'inscription vendredi 12 août 2011 Statut Membre Dernière intervention 30 août 2011
28 août 2011 à 19:27
Bonjour et merci pour ta réponse. Je n'ai pas eu internet pendant 15 jours, c'est peut être une bonne chose..., ce qui explique que je n'ai pas répondu plus tôt.

1- est ce que la valeur que tu cherches n'est présente qu'une seule fois ?
NON.

2 - Pour effectuer une recherche, la façon la plus "efficace" serait l'utilisation de FIND.
Oui, je comprends mais je voulais aussi y arriver sans FIND.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 août 2011 à 20:34
Bonjour,
1)
Je souhaite qu'elle cherche une valeur dans la feuille active(resultats_2011), qu'elle copie les valeurs de 4 des cellules de la ligne où cette valeur a été trouvée dans la feuille Faron de ce même fichier.

2)
Oui, je comprends mais je voulais aussi y arriver sans FIND.
*
Dans le désordre :
2) Pourquoi sans find ? parce que l'on te l'impose ? C'est un exercice imposé ?
1) On peut bien évidemment et très facilement sans Find, mais, Find ou sans Find, il va falloir que tu précises où copier dans ta feuille de destination ! Ce dont tu ne parles même pas !
Alors ? ===>> sois précis et je te promets que tu auras alors mon aide.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 août 2011 à 08:30
Pour être plus clair sur la raison de cette remarque :
il va falloir que tu précises où copier dans ta feuille de destination ! Ce dont tu ne parles même pas !

on devine bien, à la lecture de ton code, que tu copies vers les colonnes 1 à 4 de la ligne 2 (pour la première occurence), puis 3 pour la suivante etc ...
Tu ne nous dis rien de ton mécanisme en dehors de celà.
Imagine maintenant que :
1) tu lances l'opération alors qu'il y a par exemple 10 occurences ===>> les lignes 2 à 11 seront remplies par copie.
2) tu reviens sur la feuille de base et modifies des cellules de sorte à ce qu'il n'y ait plus que 3 occurences
3) tu relances ton mécanisme ===>> les lignes 2 à 4 de la feuille de destination contiendront bien les nouvelles données (par écrasement), mais quid des lignes 4 à 11, qui contiendront toujours les données du lancement précédent ?
Il est donc important de savoir ce que tu veux faire :
- soit tout vider er reremplir à partir de la ligne 2
- soit repartir, sur la feuille de destination, à partir de la première ligne non encore remplie (ajouter à la suite, donc, à chaque lancement).
C'est avant tout une question de logique et de choix de stratégie (mais en connaissance de cause, alors).
Quelle que soit l'adoption de cette stratégie, je te montrerai comment faire de manière simple et sans Find. Mais réponds d'abord à cette question nessentielle, s'il te plait.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 août 2011 à 08:55
J'ai bien pris note de cette ligne :
If .Cells(j, 1).Value = " " Then


qui "tend" à laisser entendre que tu ne copies rien si un lancement a déjà été fait.
Je dis bien "qui tend" car, si tel était vraiment le cas, on se demande pourquoi tu fais d'abord travailler ta machine à rechercher ce que tu ne copierais finalement pas !
Voilà toutes les raisons qui font que la connaissance exacte de ce que tu veux faire est un préalable à l'aide adéquate que tu vas recevoir.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_83Alain Messages postés 4 Date d'inscription vendredi 12 août 2011 Statut Membre Dernière intervention 30 août 2011
29 août 2011 à 21:54
Un grand merci à tous les deux.
Alain.

Merci jordanne45, c'est ce que je recherchais (à la seule nuance de la valeur qui peut se présenter plusieurs fois que j'ai mal expliquée).
[i]En ce qui concerne ta macro actuelle...
1- est ce que la valeur que tu cherches n'est présente qu'une seule fois ? (si oui, une fois trouvé sorts de ta boucle (exit for).)/i
Non la valeur est (ou peut être) présente plusieurs fois

@ucfoutu Merci, ta macro me donne le résultat recherché.

[i]Dans le désordre :
2) Pourquoi sans find ? parce que l'on te l'impose ? C'est un exercice imposé ?/i

Ca n'est pas un exercice imposé, à part par moi. J'ai su le faire, je n'y arrive plus.

[i]Il est donc important de savoir ce que tu veux faire :
- soit tout vider et reremplir à partir de la ligne 2
- soit repartir, sur la feuille de destination, à partir de la première ligne non encore remplie (ajouter à la suite, donc, à chaque lancement). /i
Je voulais choisir à partir de la feuille resultats_2011 et choisir l'intervalle de ligne dans lequel chercher sans écraser les lignes déjà copier si elles sont avant la fourchette sélectionnée mais c'est idiot, il vaut mieux tout vider et reremplir à partir de la ligne 2.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 août 2011 à 07:30
Content pour toi.
N'oublie pas le tag "Réponse acceptée". Cela permet aux futurs forumeurs avec question similaire de s'y retrouver mieux.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_83Alain Messages postés 4 Date d'inscription vendredi 12 août 2011 Statut Membre Dernière intervention 30 août 2011
30 août 2011 à 20:35
Merci.
0
Rejoignez-nous