IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

méthode find et largeur de colonne ?!


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Points : 23
    Points
    23
    Par défaut méthode find et largeur de colonne ?!
    Bonjour à tous,

    J'ai besoin d'aide dans la création de ma première macro:
    J'utilise la méthode find dans pour trouver la cellule qui contient une certaine date.
    La plage de recherche est la ligne 2:2 de mon tableur. Elle contient dans chaque cellule une date différente (au format date) : A2=18/05/2015 ; B2=19/05/205; ... etc. A noter que le texte est écrit verticalement et non horizentalement.

    La chose surprenante est que le résultat de ma recherche avec find dépend de la largeur des colones qui contiennent la date ... !?

    Je m'explique:
    - Dans le premier cas mes colonnes font 10 de largeur et je trouve bien la cellule qui contient la date voulue
    - Ensuite je réduit la largeur des colone à 2.5 et là find ne me retourne rien... et je ne change QUE la largeur des colones, le contenue est identique.

    Voici le code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub test()
        Dim i As Integer
        Dim weekdate As Date
     
        weekdate = "22/05/2015"
     
        Sheets("Sheet2").Activate
        Set R = Range("2:2").Find(What:=weekdate, LookAt:=xlWhole)
     
        If Not R Is Nothing Then
            Sheets("Sheet2").Cells(i + 5, 5) = R.Row
            Sheets("Sheet2").Cells(i + 5, 6) = R.Column
        Else
            Sheets("Sheet2").Cells(i + 5, 5) = "Vide"
        End If
    End Sub
    Merci d'avance pour votre aide !

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Essaie en ajoutant le paramètre LookIn:=xlFormulas.
    Avec LookIn:=xlValues .Find recherche dans la propriété .Text de la cellule, donc ce qui est affiché.

    eric

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    En effet ça marche mieux avec LookIn:=xlFormulas

    Le souci est que les dates sont obtenues par formule: A2=18/05/2015 ; B2=A2+1 ; ...etc donc si j'utilise "LookIn:=xlFormulas" ça ne marche pas.

    Je ne comprends pas en quoi changer la largeur de colone affecte la propriété .Text de la cellule?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Personnellement, je n'utilise jamais "Find" quand il s'agit de trouver des dates. Fais une boucle et teste les cellules.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Comme sous-entend daniel, .find sur des dates est souvent galère.

    Fonctionne avec des dates en formule dans B, même si tu réduis pour n'avoir que des #### à l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim c As Range, dat1 As String
        dat1 = "03/01/2015"
        Set c = [B:B].Find(CDate(dat1), LookIn:=xlValues)
    voire même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim c As Range, dat1 As String
        dat1 = "03/01/2015"
        Set c = [B:B].Find(Int(CDate(dat1)), LookIn:=xlValues)
    si des heures sont présentes.

    eric

    PS: sinon la méthode simple que j'avais trouvé avec un fichier très rétif : mettre la colonne date au format nombre, faire le .find, remettre le format date voulu.

  6. #6
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    Find fonctionne très bien avec xlFormulas.
    Mais il ne tient pas compte des formules.
    Une solution : transformer les formules en constantes dans une plage temporaire et faire la recherche dans cette plage.

    Voici pourquoi Find avec xlValues est compliqué pour trouver des dates ou des nombres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Sub Demo_xlformulas_vs_xlValues()
      Dim c As Range, dat1 As String, dat2 As String
     
      Set cellB2 = Cells(2, "B")
     
        dat1 = "03/01/2015"
     
       'xlFormulas 'Contrainte : la valeur cherchee doit etre de type Date pour trouver une date dans des cellules au format Date,
       'de type Numerique pour trouver un nombre dans des cellules ayant un format Numerique,
       'de type String pour trouver un String dans des cellules au format Texte
     
        cellB2.NumberFormat = "@" 'La cellule est au format Texte
        cellB2.FormulaLocal = dat1
     
        Set c = [B:B].Find(CDate(dat1), LookIn:=xlFormulas, lookat:=xlWhole) 'Non
        Set c = [B:B].Find(dat1, LookIn:=xlFormulas, lookat:=xlWhole) 'Oui
     
        cellB2.NumberFormat = "d/m/yyyy" ' La cellule est au format Date
        cellB2.FormulaLocal = dat1
     
        Set c = [B:B].Find(CDate(dat1), LookIn:=xlFormulas, lookat:=xlWhole) 'Oui
        Set c = [B:B].Find(dat1, LookIn:=xlFormulas, lookat:=xlWhole) 'Non
     
       'xlValues
     
       'xlValues: Contrainte 1 : On doit utiliser AutoFit, sinon la largeur de la cellule doit toujours etre suffisante
     
       'xlValues 'Contrainte 2 : si le format de cellule est "m/d/yyyy",
                               'la valeur cherchee doit etre de type Date
     
        cellB2.NumberFormat = "m/d/yyyy"
        cellB2.FormulaLocal = dat1
        Columns(cellB2.Column).AutoFit
     
        Set c = [B:B].Find(CDate(dat1), LookIn:=xlValues, lookat:=xlWhole) 'Oui
        Set c = [B:B].Find(dat1, LookIn:=xlValues, lookat:=xlWhole) 'Non
        dat2 = cellB2.Text
        Set c = [B:B].Find(dat2, LookIn:=xlValues, lookat:=xlWhole) 'Non
     
      'xlValues 'Contrainte 3 : si le format de cellule n'est pas "m/d/yyyy",
                             'la valeur cherchee doit etre de type String
      ' et le format de la valeur cherchee doit etre identique au format de la cellule
      'c-a-d que la valeur affichee doit etre identique a la valeur cherchee
        cellB2.NumberFormat = "d/m/yyyy"
        cellB2.FormulaLocal = dat1
        Columns(cellB2.Column).AutoFit
     
        dat2 = cellB2.Text
        Set c = [B:B].Find(dat2, LookIn:=xlValues, lookat:=xlWhole) 'Oui pq dat2 = cellB2.Text
        Set c = [B:B].Find(CDate(dat2), LookIn:=xlValues, lookat:=xlWhole) 'Non
     
        Set c = [B:B].Find(dat1, LookIn:=xlValues, lookat:=xlWhole) 'Non. Oui si dat1 = cellB2.Text
        Set c = [B:B].Find(CDate(dat1), LookIn:=xlValues, lookat:=xlWhole) 'Non
     
     
    End Sub
    Cordialement

    Docmarti.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Find fonctionne très bien avec xlFormulas.
    Mais il ne tient pas compte des formules.
    C'est une conception du bon fonctionnement ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par Daniel.C Voir le message
    C'est une conception du bon fonctionnement ?
    Effectivement. Find avec xlFormulas est très spécialisé sans l'être trop comme Find avec xlValues qui l'est trop, ou pas assez comme Match qui ne fait pas la différence entre les cellules au format Date et celles au format Nombre.

    Ceci dit, chacune des 3 méthodes a son utilité propre :

    fIND xlValues effectue sa recherche dans la propriété TEXT,
    fIND xlFormulas dans la propriété FORMULA,
    ET Match dans la propriété VALUE
    Cordialement

    Docmarti.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Merci à tous pour votre aide. Je comprend mieux les subtilités de find maintenant

    Dans mon cas j'ai pas trouvé de façon de faire fonctionner find. J'ai d'un côté une date, de l'autre une formule qui donne une date et je ne souhaite pas changer la taille des colonnes.
    Comme dit précédement par Docmarti le plus simple est pour moi de transformer les formules en constantes. Et si j'ai le temps je ferai une boucle à la main sur la plagede recherche pour remplacer find.

    Encore merci. A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment fixer les largeurs des colonnes d'un TStrinGrid
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/08/2005, 13h24
  2. forcer largeur de colonne qd URL chargee
    Par Batou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/08/2005, 10h38
  3. Fixer la largeur des colonnes d'une CListCtrl
    Par Depteam1 dans le forum MFC
    Réponses: 4
    Dernier message: 28/06/2005, 15h46
  4. Largeur de colonne d'une ListView
    Par deaqu1 dans le forum IHM
    Réponses: 7
    Dernier message: 07/06/2005, 19h45
  5. [C#] Largeur de colonne et de ligne dans un DataGrid
    Par pc152 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/08/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo