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 :

Capacité maxi d'une variable de type variant ? [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut Capacité maxi d'une variable de type variant ?
    Bonjour,

    J'utilise avec succès depuis un moment une variable de type variant pour stocker des destinataires de mails et ensuite envoyer la feuille courante à cette liste.
    Les noms des destinataires sont lus par une loop dans des cellules où j'ajoute l'extension (toujours la même pour du courrier interne).

    Aujourd'hui ma liste étant plus grande que d'habitude, je me retrouve bloqué.

    Deux questions:
    Quelle est la capacité maximum de la zone variant
    Quelle autre type de variable faudrait-il utiliser, j'ai essayé string sans succès.

    Lorsque je regarde le contenu de ma variable en mode espion je vois que ma boucle stocke les noms jusqu'à un certain point
    après je ne vois pas les noms s'ajouter bien que la boucle tourne sans erreur. Mais c'est peut-être le mode espion qui ne permet pas de voir l'intégralité du contenu de la variable ?

    J'ai regardé le tuto de Skyroad sur les variables, mais même si string peut contenir 2 miliards d'info, je plafonne.
    Merci pour vos suggestions.
    Denis

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Expert VBA
    Inscrit en
    Juin 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 7
    Par défaut
    Pour du texte, tu ne peux utiliser que du string qui, bien que je n'en connais pas sa taille limite, est largement suffisant pour un texte.

    Le type Variant autorise tout type de données. C'est son avantage. Mais je te le déconseille car il prend beaucoup de place en mémoire souvent pour rien et c'est Excel qui choisit le format qui lui semble le plus adapté.

    On utilise Variant quand on ne connait pas le format (ce qui en soit est absurde) ou justement lorsque la valeur est susceptible de changer... de varier... passant par exemple au cours du traitement d'un état numérique à un état de chaîne de caractère. Ou lorsque tu souhaite utiliser une variable de type 'tableau" dans lequel sera stocké plusieurs type de données.

    Et cela me permet de faire une transition avec ce qui pourrait être une solution, utiliser un tableau. A condition que j'ai bien compris le contexte de ta problématique (à ce propos, envoie un fichier c'est toujours plus parlant ).
    Si je comprends bien, dans ta variable, il y a plusieurs nom de fichier?

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Merci pour ces éclaircissements.

    Cette macro est dans mon classeur perso, il permet d'envolyer la feuille courante d'un classeur vers une liste de destinataires fugurant dans ma feuille.
    Voici le code c'est un code que j'ai en partie récupéré et réorganisé.

    Le problème est dans la variable Mes_destinataires en mode espion, je ne vois pas tous les destinataires quand il y en a de trop
    et au moment où j'envoie le message, j'ai une erreur 1004 la méthode show de la classe dialogue a echoué. sur la ligne
    Application.Dialogs(xlDialogSendMail).Show Mes_destinataires, Mon_Objet

    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
     Public Mon_Objet
    Public Ma_feuille
    Public Mes_destinataires
    Public Dest_deb
    Sub envoie_feuille_mail()
    ' Macro1 Macro
    ' Envoir la feuille courante comme mail
    Dim Mes_destinataires As String           'Les destinataires
    Dim Mon_Objet As String                   'L'objet du message
    Msg = "Indiquer la feuille à expédier"
    Title = "Sélection de la feuille"
    Ma_feuille = InputBox(Msg, Title, ActiveSheet.Name)
    If Ma_feuille = "" Then
    Exit Sub
    End If
    Msg = "Saisir l'objet du mail"
    Title = "Objet"
    Mon_Objet = InputBox(Msg, Title, ActiveCell.Value)
    If Mon_Objet = "" Then
    Exit Sub
    End If
    Msg = "Indiquer le début de la liste de destinataires sur votre feuille exemple A1 laisser une ligne blanche en fin de liste ! OU laisser vide pour renseigner dans Lotus directement"
    Title = "DESTINATAIRES"
    Dest_deb = InputBox(Msg, Title)
    If Dest_deb <> "" Then
    ' je charge ma liste de destinataires
    On Error GoTo erreur_feuille
        Sheets(Ma_feuille).Activate
     
        Range(Dest_deb).Select
    Do While Not IsEmpty(ActiveCell)
        Mes_destinataires = Mes_destinataires & ActiveCell.Value & "@MonOrganisation.com" & ", "
        Selection.Offset(1, 0).Select
    Loop
    End If
    ' je copie la feuille dans un nouveau classeur
          ActiveWorkbook.Sheets(Ma_feuille).Copy
     
    'je l'envoie et je referme sans sauvegarder
        Application.Dialogs(xlDialogSendMail).Show Mes_destinataires, Mon_Objet  
        Application.DisplayAlerts = False
        ActiveWorkbook.Close
        Application.DisplayAlerts = True
    Exit Sub
    erreur_feuille:
    Dim monMsg
    monMsg = "Feuille " & Ma_feuille & " inexistante ou mal orthographiée."
    MsgBox Prompt:=monMsg
    Exit Sub
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Bonjour,

    Après :

    ajoute :

    Debug.Print Len(Mes_destinataires)

    Pour voir la longueur du string.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 69
    Par défaut
    Bonjour,

    J'ai eu ce problème récemment, c'est parce que ta variable mes_destinataire dépasse les 450 caractères, c'est une limite fixée par excel d'après ce que l'on m'a dit.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Je remplis une variable de 1 000 000 caractères avec une variable (Var) longue de 5000 caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
        Dim txt As String, Var As String
        Var = Application.Rept("a", 5000)
        MsgBox "longueur de ""Var"" : " & Len(Var)
        Do While Len(txt) < 1000000
            txt = txt & Var
        Loop
        MsgBox Len(txt)
    End Sub
    Ajoute :

    après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Ma_feuille).Activate
    et refarde si, maintenant, tu as une erreur.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 69
    Par défaut
    Bonjour Daniel C.,

    Oui on peut mettre jusqu'à 2 milliards de caractères dans un type String si mes souvenirs sont bons (à vérifier). Mais ce sont les formules Excel qui n'acceptent pas plus de 450 caractères.

    J'ai pas regardé en détail mais il me semblait qu'il voulait copier justement le résultat de mes_destinataires dans un fichier Excel.

    Mais peut être que je me trompe, peux tu afficher txt? J'ai pas essayé, j'essaierai quand j'ouvrirai un excel.

    Bonne soirée.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Expert VBA
    Inscrit en
    Juin 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 7
    Par défaut
    Ce qui m'étonne dans ton code c'est que tu déclares tes variables en public puis de nouveau dans ton programme.
    Peut être il y a une interaction.
    Pourquoi les déclarer publiquement?

    Essaye de ne les déclarer que dans la macro pour voir si cela change quelque chose. Sinon, je te ferais un proposition différente.


    1 ou 2 petites remarques/questions aussi, qui ne régleront pas ton problème mais qui sont plus pour toi :
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Ma_feuille = "" Then
    Exit Sub
    End If
    écrit le ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Ma_feuille = "" Then Exit Sub
    aussi, je ne comprends pas l'intérêt de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Sheets(Ma_feuille).Copy
    Enfin, pense à décaler ton code pour qu'il soit plus lisible

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

Discussions similaires

  1. Tester le type d'une variable de type "Variant"
    Par nono27200 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/08/2007, 21h26
  2. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  3. Réponses: 3
    Dernier message: 28/07/2005, 21h30
  4. affecter une variable de type stringstream
    Par sorari dans le forum SL & STL
    Réponses: 3
    Dernier message: 24/03/2005, 11h14
  5. Ajouter a une variable de type string, un entier
    Par Little-Freud dans le forum SL & STL
    Réponses: 12
    Dernier message: 05/03/2005, 19h33

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