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 :

récupérer des valeurs en fonction de caractères


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut récupérer des valeurs en fonction de caractères
    Bonjour,

    j'ai une colonne contenant des chaines de caractères ex: paris 2007,dublin 2007, new york 2008.....Dans le cadre d'une macro que je réalise , je cherche à selectionner les cases du nbre de visiteurs en fonction la ville et de l'année et les ventiler en fonction de l'année (2007,2008....) dans un tableau à côté.

    A un moment j'en arrive à:
    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
      Sub kiki()
    Sheets("Feuil1").Select
    Dim z As Byte
    z = 7 ' z commence à la colonne 7 ou G et se placera sur la colonne         suivante après avoir affecté une valeur
     
    For i = 4 To Range("D65536").End(xlUp).Row 'pour parcourir la colonne paris 2007,Dublin 2007.....
    If Cells(i, 4) = "* 2007" Then
    Cells(5, z) = Cells(i, 5)
    z = z + 1
    else if cells(i,4)="*2008) then 
    cells(6,z)=cells(i,5)
    End If
    Next i
     
    end sub
    il ne se passe rien et il y a un pb avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D65536").E(xlUp).Row
    Peut-on m'éclairer??

    MERCI

  2. #2
    Membre actif
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Points : 283
    Points
    283
    Par défaut


    A mon avis il ne rentre jamais dans tes conditions qui ont l'air bizarres.
    Si tu veut mettre comme condition que ce qui est dans la cellule fini par 2007, fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Right(Cells(i, 4).value,4) = "2007" Then
    ...
    Else If Right(Cells(i, 4).value,4) = "2008" Then
    ...
    End if
    Edit:

    http://silkyroad.developpez.com/VBA/...nesCaracteres/

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut doudou8mc et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D65536").End(xlUp).Row
    Quand tu donnes du code, fais un copier/coller. Ne recopie pas : on ne pourra jamais trouver une erreur si tu la corriges en recopiant (ou que tu en fais une autre ).
    Explique l'erreur que tu as : ne marche pas ne permet pas de savoir s'il a une entorse, s'est cassé la jambe, ou n'en a pas
    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
    Sub kiki()
    Dim y As Integer, z as integer    
    'évitera de rechercher une panne parce qu'on attaque la colonne DY
    Sheets("Feuil1").Select
    y = 7
    z = 7
    For i = 4 To Range("D65536").End(xlUp).Row
        'If Cells(i, 4) = "* 2007" Then
        'recherche une cellule contenant exactement le texte "* 2007)
        If Cells(i, 4) Like "* 2007" Then
        'si la cellule finit par " 2007"
            Cells(5, y) = Left(Cells(i, 5), Len(Cells(i, 5)) - 5)
            'cellule de la ligne 5 = la cellule testée sauf les 5 derniers caractères
            y = y + 1
        ElseIf Cells(i, 4) Like "* 2008" Then
            Cells(6, z) = Left(Cells(i, 5), Len(Cells(i, 5)) - 5)
            z = z + 1
        End If
    Next i
    End Sub
    Juste quelques remarques en passant :
    Il était important de réduire au maximum la place utilisée dans la RAM avant. Mais maintenant, avec le matériel actuel, c'est moins problématique. J'utilise le type de variables pouvant recevoir le maximun qu'elle pourra contenir sans déclencher une erreur :
    - Integer pour les variables colonnes (je n'ai que la version 2003 )
    - Long pour les lignes
    Le gain pour utiliser des variables plus courtes est négligeable, par rapport au temps que me coûterait la recherche d'une erreur de frappe dans un cellule en dehors de ce à quoi m'attendre
    Byte : 1 octet
    Integer : 2 octets
    Long : 4 octets
    Ta variable I, non déclarée passe automatiquement en Variant (16 octets). heureusement que tu as déclaré z sur un octet, au lieu de deux.
    voir l'aide : "Résumé des types de données"

    L'opératieur "=" donne l'égalité "exacte" (voir "Option Compare, instruction" dans l'aide). Il n'admet aucun des caractères génériques (*, ?). Il faut utiliser "Like" qui les admet, ou faire en sorte que le texte à comparer soit exactement celui attendu. Ucase/Lcase permettent de s'affranchir des changement de casse, ce qui évite d'utiliser "Option Compare", qui affecte tout le module.

    Ne connaissant pas ton fichier, j'ai modifié la macro (mais pas testée), de sorte que son fonctionnement me semble logique : si tu n'incrémentes les colonnes que sur les destinations de 2007, tu t'interdis d'avoir plusieurs 2008 à la suite : le second, la macro n'ayant pas changé la colonne en cours écrasera la précédente, etc. Et après, il te manquera des données.

    Tu utilises "if...ElseIf..."
    Personnellement, je préfère utiliser If que quand je n'ai que deux possibilités. Sinon, j'utilise "Select Case". Je n'utilise pas ElseIf, qui, à mon sens, rend la lectire du code plus difficile en cas de panne.

    De même, la définition des plages par Cells étant plus courte que par Range, je l'utilise assez souvent, mais je préfére utiliser les lettres de la colonne, pour une raison de lisibilité :
    Cells(X, 128) est moins parlant que Cells(X,"DX")

    Mais il y a beaucoup de choix personnels. Comme de déclarer toutes les variables, utiliser une majuscule pour la première lettre des variables, alors que je code en minuscules : ça m'indique les fautes de frappes dès la validation de la ligne, au lieu d'attendre la compilation. De ne pas utiliser i, trop facilement confondu avec 1 (surtout sur un dépannage vers 3h du matin ).
    A+
    PS : Mon ironie est quelques fois assez acide. Faut pas s'en formaliser. On retient mieux ce qui nous exaspère qu'un texte lénifiant

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/11/2014, 00h40
  2. Réponses: 1
    Dernier message: 29/06/2013, 19h17
  3. Récupérer des valeurs SQL avec la fonction fetch()
    Par Invité dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/07/2010, 14h22
  4. Réponses: 2
    Dernier message: 12/10/2009, 22h55
  5. Réponses: 2
    Dernier message: 05/03/2008, 22h01

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