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 :

amélioration d'une fonction pour trouver la lettre de la colonne [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut amélioration d'une fonction pour trouver la lettre de la colonne
    Bonjour


    J'aurai besoin de vos lumières pour améliorer une de mes fonctions que j'ai faite pour trouver la lettre d'une colonne citée. Voici la fonction :

    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
     
    Function LettreColonne(NumCol As Long) As String
    'fonction qui donne la lettre en fonction du numero de colonne
    Dim reste, quotient As Long
    quotient = Int(NumCol / 26)
    reste = NumCol Mod 26
    If quotient = 0 And reste = 0 Then
        Exit Function
    End If
    If quotient = 0 Then
        LettreColonne = Chr(64 + reste)
    Else
        If reste = 0 Then
            quotient = quotient - 1
            If quotient = 0 Then
                LettreColonne = Chr(64 + 26)
            Else
                LettreColonne = Chr(64 + quotient) & Chr(64 + 26)
            End If
        Else
            LettreColonne = Chr(64 + quotient) & Chr(64 + reste)
        End If
    End If
    End Function
    Pour les grands connaisseurs, je suis sur que vous allez avoir peur en voyant ça mais bon, justement, je voudrais pouvoir l'écrire plus simplement.

    Je pense qu'il faut utiliser le ".address", mais je ne sais pas torp comment l'implémenter dans ce que j'ai écrit car normalement le .address s'utilise directement sur un sélection de cellule (un Range). Sauf que là, je l'utilise sur un nombre directement.

    Un exemple d'utilisation de cette fonction pour une fonction (que j'ai créé aussi ) de création d'une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub MakeListes(NomFeuille As String, NomListe As String, NbreLigne As Long, nbreColonnes As Long)
    ActiveWorkbook.Names.Add Name:=NomListe, RefersTo:="='" & NomFeuille & "'!$A$1:$" & LettreColonne(nbreColonnes) & "$" & NbreLigne
    End Sub
    En vous remerciant par avance, je suis à votre disposition pour toute question/suggestion.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    C'est assez folle comme idée de chercher la(es) lettre(s) correspondant à une colonne alors que le n° de la colonne suffit largement.

    pour ton exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub MakeListes(NomFeuille As String, NomListe As String, NbreLigne As Long, nbreColonnes As Long)
     
    ActiveWorkbook.Names.Add Name:=NomListe, RefersTo:="='" & NomFeuille & "'!$A$1:" & Cells(NbreLigne, nbreColonnes).Address
    End Sub

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Je te remercie pour ta réponse Effectivement, c'est beaucoup plus simple j'aime bien me compliquer la vie

    Il faudrait que je trouve un exemple un peu parlant, mais j'en ai pas sous la main.

    Merci en tout cas

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je ne vois pas d'exemple qui nécessite de connaître la lettre correspondant à la colonne du moment que tu peux t'en sortir avec Address ou Column

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bonjour,

    Je ne vois pas non plus l'utilité... mais bon... tu pourrais y aller comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Dim I As Byte
        Dim TempAdresse As String, Adresse As String
     
        TempAdresse = ActiveCell.Address(False, False)
        For I = 1 To Len(TempAdresse)
            If Not IsNumeric(Mid(TempAdresse, I, 1)) Then
                Adresse = Adresse & Mid(TempAdresse, I, 1)
            End If
        Next
     
        MsgBox Adresse

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour à tous,

    Je n'en vois pas non plus l'utilité mais j'ai trouvé ça amusant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
      MsgBox ColumnLetter(5)
      MsgBox ColumnLetter(255)
    End Sub
     
    Function ColumnLetter(value As Integer) As String
      ColumnLetter = Split(Columns(value).Address(False, False), ":")(0)
    End Function
    Evidemment, si on est payé à la ligne de code, ça n'est pas rentable...

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bien vu

  8. #8
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Et le gagnant est => Alain !

    En tout cas, cette discussion a eu le mérite de vous amuser

  9. #9
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Je suis tombé sur un cas où, pour moi, j'en aurai besoin, mais je suis sur que vous allez me trouver une solution sans me prendre la tête

    Je voudrais que dans un tableau d'une feuille particulière, trouver la dernière colonne, la "tirer" (l'autofill quoi), puis supprimer les valeurs. Pour cela, j'utilise la fonction d'AlainTeck pour savoir à partir d'où je tire, jusqu'où, et où je supprimer mes valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim NomF As Worksheet
    Set NomF = Worksheets("Stat_globale")
    'numero de la dernière colonne
    j = NomF.Range("A7").End(xlToRight).Column
    'selection
    Range(ColumnLetter(j) & "7:" & ColumnLetter(j) & "29").Select
    'tirage jusqu'à j+1
    Selection.AutoFill Destination:=Range(ColumnLetter(j) & "7:" & ColumnLetter(j+1) & "29"), Type:=xlFillDefault
    'suppression des valeurs sans le titre
    Range(ColumnLetter(j+1) & "8:" & ColumnLetter(j+1) & "29").ClearContents
    j'ai essayé de faire autrement, en utilisant le fameux .Address, mais je blique lorsqu'il faut que j'aille à la dernière colonne "+1". Voici le début du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim NomF As Worksheet
    Set NomF = Worksheets("Stat_globale")
    'numero de la dernière colonne
    j = NomF.Range("A7").End(xlToRight).Adress
    'selection => comment dire de sélectionner sur la même colonne jusqu'à la ligne 29 ?
    Range(j & ":" & ColumnLetter(j) & "29").Select
    'tirage jusqu'à j+1
    => là, je bloque..
    Merci pour vos lumières

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Et si tu procédais comme ceci plutôt ?
    C'est du moins la façon dont je procéderais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Dim Colonne As Long
     
        Colonne = Cells(7, Columns.Count).End(xlToLeft).Column
        Range(Cells(7, Colonne), Cells(29, Colonne)).Select

  11. #11
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Par rapport à ta formule, si la colonne A et B est vide, et que, par exemple, mon tableau commence à la colonne C, ta formule ne fonctionne plus ??

  12. #12
    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 illight Voir le message
    ...

    j'ai essayé de faire autrement, en utilisant le fameux .Address, mais je blique lorsqu'il faut que j'aille à la dernière colonne "+1".
    ...

    Merci pour vos lumières
    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 test2()
     
    Dim NomF As Worksheet
    Set NomF = Worksheets("Stat_globale")
     
    LignesIncrement = 29 - 7
     
    Set c = NomF.Range("A7").End(xlToRight)
     
    Range(c.Offset(0, 0), c.Offset(29 - 7, 0)).AutoFill Destination:=Range(c.Offset(0, 0), c.Offset(29 - 7, 1)), Type:=xlFillDefault
     
    'suppression des valeurs sans le titre
     
    Range(c.Offset(1, 1), c.Offset(29 - 7, 1)).ClearContents
    End Sub

    Cordialement

    Docmarti

  13. #13
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Je pense jamais à utiliser la fonction offset, qui je pense me permettrai de faire des miracles certaines fois. J'essaye ton truc cet après-midi

    Merci

  14. #14
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Je ne vois pas d'exemple qui nécessite de connaître la lettre correspondant à la colonne du moment que tu peux t'en sortir avec Address ou Column
    Bonjour,
    Par exemple pour l'afficher dans un userform ou inputbox...

  15. #15
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    ça marche Thanks

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/08/2014, 15h10
  2. [Débutant] Calcul précis de la dérivée d'une fonction pour trouver des pics
    Par abel413 dans le forum MATLAB
    Réponses: 3
    Dernier message: 25/07/2013, 11h24
  3. une fonction pour trouver min(|A-B|) ?
    Par Djeu Kuru dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/04/2013, 10h43
  4. Réponses: 12
    Dernier message: 09/11/2009, 19h56
  5. je recherche une fonction pour trouver le minimum
    Par laxe13 dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2008, 00h55

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