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 :

erreur 13 en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut erreur 13 en VBA
    Bonjour,
    Dans un fichier « A », je lance une macro pour copier la valeur de cellules (fx17, fx18 etc…) contenue dans un fichier « B ». Cette cellule de « B » contient non pas une valeur saisie directement, mais la formule suivante : =SI(U17<>"";INDIRECT("'"&U17&"'!$q$18");"") qui donne un résultat de type chaîne. Dans « A », je définis une variable « y » (Dim y As String) et mes lignes de macro sont (après avoir identifié les worksheets):

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For j = 1 to 10
    Range("fx" & 16 + j) = "=plage"
    Range("fx" & 16 + j).Copy
    y = Range("fx" & 16 + j)
    Next j

    Or la macro se plante sur la ligne y = Range("fx" & 16+j) avec un code d’erreur « 13 » alors que tout est du type "String"... à moins que ce ne soit la formule de calcul qui pose problème ?
    Qu’ai-je mal fait et que dois-je faire ?
    Merci de votre aide

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Il faudrait déjà indiqué la parentalite de ton object range, lui attribuer le nom de son workbook et feuille vu que tu travailles sur des fichiers différent. La façon dont tu code reprend le range de la feuille active du classeur actif

    Ensuite une simple méthode copy / paste value entre tes deux classeur devrait faire le job

  3. #3
    Expert confirmé
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    Bonjour et bienvenue !

    Il n'y a visiblement par d'erreur dans le code même si cela amène des questions... Pourquoi écrire "=plage" dans les cellules, faire une copie qui n'est pas collée par la suite... Et la valeur de renvoi un code erreur tel que le code nous est donné.

    Pour en venir à la formule, que doit renvoyer la cellule U17 comme donnée ? une référence de cellule ? (ce qui est normalement attendu)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Bonjour,
    Merci d'avoir pris la peine de me répondre.
    Avec "Index", la formule va chercher la valeur d'une cellule dans l'onglet défini et il s'agit d'un texte: "clôturé" ou "en cours"

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Comme il a déjà été dit, l'intérieur de la boucle est incohérent.
    Si "plage" est un nom de cellule, il faut l'adresser à la cellule par la propriété Formula.
    Si "plage" est une variable, il faut la mettre à l'extérieur des guillemets.
    Ligne suivant, un Copy sans collage, ça ne sert à rien.
    Ligne suivante, il faudrait au moins mettre entre parenthèses le 16 + j pour être sûr que l'addition sera faite avant la concaténation.
    Il ne sert à rien de mettre une valeur dans une variable si elle n'est pas utilisée dans le tour et qu'au tour suivant elle sera écrasée par la nouvelle.

    Et la boucle elle-même est inutile puisque tout ça pourrait se faire facilement sans boucle.

    Or la macro se plante sur la ligne "y = Range("fx" & 16+j)" avec un code d’erreur « 13 »
    Quel est le message d'erreur ?

    alors que tout est du type "String"...
    16 et j ne sont pas des String.

    Dans un fichier « A », je lance une macro pour copier la valeur de cellules (fx17, fx18 etc…) contenue dans un fichier « B ». Cette cellule de « B » contient non pas une valeur saisie directement, mais la formule suivante : =SI(U17<>"";INDIRECT("'"&U17&"'!$q$18");"") qui donne un résultat de type chaîne.
    ... et tu veux les coller où ?

    "FX", c'est bien une référence de colonne ?
    Parce qu'il est assez rare d'avoir des tableaux correctement construits qui font 180 colonnes.
    La dernière fois que j'ai vu un tableau de cette taille, c'est parce que son concepteur confondait Excel avec une feuille de papier quadrillé.

  6. #6
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Citation Envoyé par Menhir Voir le message
    La dernière fois que j'ai vu un tableau de cette taille, c'est parce que son concepteur confondait Excel avec une feuille de papier quadrillé.
    😂😂😂

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Merci de vouloir m'aider.
    Je suis débutant, et accepte les conseils puisque je les demande, cependant voici quelques arguments
    - pour les parenthèses de "16+j", je pense que c'est inutile car je récupère bien toutes les données
    - pour le fait que "16+j" ne sont pas de type String, c'est un fait mais il ne s'agit pas de variables destinées à être collées dans une cellule mais les paramètres de définition des cellules à lire.
    - en fait la variable que je copie dans le fichier "A" est du type "texte" (donc String) et celle du fichier "B" qui reçoit sa valeur en copie est déclarée par "Dim" en String. Je pensais que cela était obligatoire pour justement éviter une erreur "13".
    - or quand je dis que "je récupère bien toutes les données", c'est parce que je constate que ma macro fonctionne très bien sur mon PC, malgré ces observations, mais elle se plante sur le PC d'une autre personne qui doit utiliser mon fichier.
    - c'est surtout ce point qui m'interroge
    - de fait, ma question est de savoir si justement, le plantage est dû à une erreur de programmation avec de mauvaises commandes, ou si l'erreur peut venir, mais seulement sur un autre PC et non le mien, du fait que la cellule à copier contient une formule de calcul (avec "Index...") et non une valeur directement saisie, comme si cela était dû à l'oubli de cocher une option dans la version d'Excel de l'autre PC mais qui serait active sur le mien.
    - concernant "la plage", effectivement je ne maîtrise pas cette commande. Je l'avais "bêtement" recopiée dans une consigne trouvée sur un forum, parce que je pensais que le fait de vouloir copier/coller une valeur d'un fichier à un autre fichier m'imposait de passer par cette ligne de commande. Si c'est inutile, j'en prends acte.
    - par contre je ne comprends pas pourquoi ma "boucle" est inutile puisque, pour lire successivement toutes les valeurs d'une colonne, je dois bien faire varier les coordonnées des cellules à lire. A moins qu'il 'existe une meilleure solution que je ne connais pas ?
    Qu'en pensez-vous ?

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Criscour Voir le message
    Qu'en pensez-vous ?
    J'ai déjà dit ce que je pense : ton code n'a aucune cohérence. Plusieurs personnes te l'ont dit.
    Je pense qu'une copie de cellules contigües, ça se fait sur une seule ligne de code sans boucle.
    Mais si tu penses que ce sont de mauvais conseils, qu'il n'est pas utile de modifier ton code parfait et que répondre aux questions posée est superflus, il est inutile d'insister.

    C'est sûrement dû à un "bug d'Excel" ou à un envoutement.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    L'ironie cache souvent la "blessure", c'est dommage car mon but n'était pas celui-là. Je pensais mes questions assez précises, en effet, même si j'accepte, et je l'avais indiqué, de reconnaître que mes lignes de commande comportent des erreurs, mon souci est de constater que, malgré ces erreurs, la macro s'exécute normalement sur un PC mais pas sur un autre. Elle a même été testée sur un 3ème PC sur lequel ça marche également.

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,
    Citation Envoyé par Criscour Voir le message
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For j = 1 to 10
    Range("fx" & 16 + j) = "=plage"
    Range("fx" & 16 + j).Copy
    y = Range("fx" & 16 + j)
    Next j
    Ce code est totalement incohérent : il y a des actions successives mais ces actions ne sont suivies d'aucune finalité : le Copy n'est pas utilisé, y non plus !

    Avant de se demander si ça fonctionnera ailleurs, il faut commencer par écrire quelque chose qui fonctionne localement et de préférence clair et structuré.
    Je te conseille vivement de prendre le temps de suivre en autoformation cet excellent cours VBA pour débutants : https://bidou.developpez.com/article/VBA/

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    Bonjour,


    Ce code est totalement incohérent : il y a des actions successives mais ces actions ne sont suivies d'aucune finalité : le Copy n'est pas utilisé, y non plus !

    Avant de se demander si ça fonctionnera ailleurs, il faut commencer par écrire quelque chose qui fonctionne localement et de préférence clair et structuré.
    Je te conseille vivement de prendre le temps de suivre en autoformation cet excellent cours VBA pour débutants : https://bidou.developpez.com/article/VBA/
    Pour le "copy", je suis d'accord. Par contre, le "y" est utilisé dans la suite de la macro dont je n'ai mis qu'un extrait car lorsque le déroulement se plante, c'est sur la ligne y=.....

    De fait, pouvais-je écrire directement ?
    y = Range("fx" & 16 + j)

    et ne pas mettre du tout
    Range("fx" & 16 + j) = "=plage"
    Range("fx" & 16 + j).Copy

    D'avance merci

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par Criscour Voir le message
    De fait, pouvais-je écrire directement ?
    y = Range("fx" & 16 + j)
    Ma boule de cristal ne sait pas te répondre ...

    Si tu veux des réponses valables, il faut toujours publier la totalité du code et expliquer précisément ce qu'il devrait faire.

    A défaut, comme c'est le cas actuellement, il y a toujours une part d'incertitude dans les réponses...

  13. #13
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Criscour Voir le message
    "faire une copie de cellules contiguës, ça se fait sur une seule ligne de code sans boucle" OK, mais cela est-il possible, sans faire de boucle For-Next, quand on ne connait pas au départ le nombre de cellules à copier ?
    Oui

    Par ailleurs, j'ai lu qu'une erreur "13"
    Toujours pas décidé à donner le texte du message d'erreur et la ligne de code désignée par le débugage ?

    pouvait être due, soit à un problème d'opérations entre variables de nature différente, soit à une erreur du système qui aurait été altéré. Qu'en pensez-vous pour ce qui me concerne avec cette disparité de fonctionnement selon le PC utilisé ?
    Je t'ai déjà dit ce que j'en pense mais comme tu penses que je suis dans l'erreur, je n'insiste pas.

    Citation Envoyé par Criscour Voir le message
    Par contre, le "y" est utilisé dans la suite de la macro dont je n'ai mis qu'un extrait car lorsque le déroulement se plante, c'est sur la ligne y=.....

    De fait, pouvais-je écrire directement ?
    y = Range("fx" & 16 + j)
    Au second tout de boucle, l'affectation dans la variable y écrasera l'affectation faite au premier tour, et ainsi de suite à chaque tour.
    Au la fin de la boucle, il ne restera dans y que la valeur de FX26.

    Ca aussi je l'ai déjà dit.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    retraité profession de santé mais qui "étudie" EXCEL
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité profession de santé mais qui "étudie" EXCEL
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Bonjour et merci d'avoir répondu.
    Le code complet est relativement long, aussi j'explique mon objectif: je veux récupérer dans un fichier Excel "X" les données lues dans plusieurs autres fichiers "A", "B", "C" etc...qui restent fermés. Les données à copier sont en colonne "fy" d'un même onglet de "A", "B", "C" etc... et je dois calculer le nombre de lignes remplies dans chacun des fichiers "A", "B", "C" etc... pour que les valeurs copiées puissent être collées dans "X" et rassemblées en continu, et à la suite, dans une même colonne. Le nombre de lignes copiées dans chacun des fichiers sources me permet de décaler verticalement la copie des suivantes. Ma bouche ne sert donc qu'à définir l'étendue de la plage à copier, mais a priori il y a une manière plus élégante de faire et qu'il me serait agréable de connaître. Par ailleurs j'ai compris au vu des premières remarques reçues sur le forum que le "copy" était inutile, mais je l'avais utilisé après avoir vu dans un forum que c'était la manière de copier des valeurs d'un autre fichier gardé fermé. S'il existe une autre méthode, je suis naturellement preneur mais sans avoir recours à des solutions telles que "ADODB.Connection...." etc... que je ne maîtrise absolument pas.
    Cependant , et même si ces lignes sont inutiles, mon interrogation porte sur l'erreur "13" qui ne se manifeste que sur un PC alors que tout se déroule sans aucun blocage sur deux autres PC. La variable "y" est utilisée, dont certains commentaires disent qu'elle se réinitialise à chaque tour de bouche, et c'est vrai, me sert dans la commande suivante: "If y = "...." then "...". Ai-je donc besoin de passer par cette variable intermédiaire ou puis-je faire autrement ?
    D'avance merci.

Discussions similaires

  1. Erreur accés fichier? Vba
    Par antoine1504 dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/07/2008, 11h38
  2. Erreur Requete en VBA
    Par Kalvin_20 dans le forum VBA Access
    Réponses: 9
    Dernier message: 06/05/2008, 15h09
  3. Erreur requete en vba
    Par Renardo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/01/2007, 22h17
  4. Erreur requete en VBA
    Par temar dans le forum Access
    Réponses: 15
    Dernier message: 19/05/2006, 19h50
  5. erreur inconnue en VBA
    Par rapace dans le forum Access
    Réponses: 3
    Dernier message: 06/10/2005, 14h42

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