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 :

Recopie d'un array dans une range FormulaR1C1 [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Gestion comptable
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestion comptable

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut Recopie d'un array dans une range FormulaR1C1
    Bonjour le forum !

    D'habitude la littérature en ligne est suffisamment bien fournie pour que je m'en sorte, mais là je bloque complètement..

    J'ai une feuille que je souhaite corriger et mettre en forme.

    - Je bascule les datas dans une Tabl()

    - Je me crée une Tabl Inter() où je recrée intégralement et proprement le tableau ligne par ligne avec un redim preserve classique,
    et où j'importe seulement les données saisies initialement de la première Tabl,
    inscrivant des formules R1C1 vérifiées dans les autres cases

    - Je transpose la Tabl Inter dans une Tabl Finale(), prête à être exportée

    Et là le classique Sh.Range("A1").Resize(Ubound(TablF, 1), Ubound(TablF, 2)).Value = TablF me renvoie une première erreur : Quantité de mémoire insuffisante !

    Contrariant.. J'aimerais bien savoir en quoi recopier un tableau de 4000 lignes et 60 colonnes d'un array à un range le bloque tout d'un coup..? Première question intéressante !

    Mais bon, j'ai besoin d'avancer donc je passe outre, en libérant la mémoire juste avant cette ligne plutôt qu'en fin de macro, avec les erase ad-hoc, prenant bien soin de ne pas delete la TablFinale.

    Nouvelle erreur :
    Erreur d'execution '1004' : Erreur définie par l'application ou par l'objet


    Je me dis que c'est parce qu'il a du mal avec la recopie des formules R1C1, j'essaie autrement en remplaçant Value par FormulaR1C1 : Même erreur !

    Là je fais quelques essais en me créant un bac à sable : Value comme FormulaR1C1 marchent !

    Pige pas d'où ça vient..


  2. #2
    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
    A ma connaissance (je peux me tromper), on peut transférer en une seule instruction l'ensemble des valeurs d'une zone de cellules vers une variable Variant pour en faire un tableau mais il n'est pas possible de faire l'inverse.

    A ta place, j'éviterai de me prendre le chou pendant 107 ans et je ferrais deux boucles For To pour réaliser ce transfert.
    Ca prendra peut être quelques secondes de plus à l'exécution mais ça fonctionnera et le codage ne prendra que quelques secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Lig As Long, Col As Long
    For Lig = 1 To Ubound(TablF, 1)
       For Col = 1 To Ubound(TablF, 2)
          Sh.Cells(Lig, Col).FormulaR1C1 = TablF(Lig, Col)
       Next Col
    Next Lig

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne comprends pas trop bien.

    Qu'as-tu chargé en table source ? Valeur + formule ou valeur uniquement
    Effectues-tu des calculs dans la table à remettre en plage cible ?
    Es-tu certain que les bornes inférieures de la table commence bien à 1
    Sans visualiser ton code, il est difficile de t'aider

    Petite info : Si tu as chargé en table, les valeurs + les formules de la plage source et que ce sont des formules structurées (exemple =[@Qté]*[@Prix]), le code se met en erreur 1004
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre du Club
    Homme Profil pro
    Gestion comptable
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestion comptable

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut
    Bonjour Menhir, Philippe, merci pour vos réponses.

    @ Menhir : Je vais faire ça, en essai chronométré, mais je te confirme que normalement la retranscription d'une table variant dans un range se fait, permettant de gagner un temps considérable par rapport à une retranscription cellule par cellule.. Je te tiens au courant.

    @ Philippe :
    - Valeur fixe + Formule R1C1 type =SUM(R[1]C:R[3]C, R[5]C), sous format String donc. Pas d'appel de champ ou de plage nommé dans ces formules.
    - Option base à 1 en début de Module, et plus important une redéfinition de l'array du type TableF(1 to NbLig, 1 to NbCol).

    Edit :

    La méthode de Menhir m'a permit de voir que la retranscription bloque lorsqu'il essaie d'inscrire la formule de division dans une cellule.
    Rapport de l'espion : Tabl(j, i) : "=RC[-1]/R[428C[-1]" : Variant/String
    Il me manque un crochet fermant

    Au moins on a une solution de débuggage

    Je re-test après correction.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si ce sont des formules classiques, je n'ai aucun problème avec l'exemple ci-dessous (j'utilise la propriété Formula au lieu de Formula R1C1 mais c'est du pareil au même


    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
    Sub T()
      '
      Dim tblSource()
      Dim tblTarget()
      Dim Elem As Long
      Dim rngTarget As Range
      Dim r As Long, c As Integer
      Set rngTarget = Range("L1")
      tblSource = Range("tableau1").Formula
      '
      For r = 1 To UBound(tblSource)
       If tblSource(r, 5) = "A" Then
        Elem = Elem + 1: ReDim Preserve tblTarget(1 To UBound(tblSource, 2), 1 To Elem)
        For c = 1 To UBound(tblSource, 2)
          tblTarget(c, Elem) = tblSource(r, c)
        Next
       End If
      Next
      rngTarget.Resize(UBound(tblTarget, 2), UBound(tblTarget, 1)).Formula = Application.Transpose(tblTarget)
      Set rngTarget = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre du Club
    Homme Profil pro
    Gestion comptable
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestion comptable

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut
    Victoire !!

    Range("A1").Resize(Ubound(tabl,1), Ubound(tabl,2)).FormulaR1C1 = Tabl marche sans problème !

    Il faut quand même s'assurer que toutes les formules saisies dans l'array sont correctes, pour cela faire preuve d'astuce pour savoir où s'est glissé l'erreur, jonglant entre Debug.Print et la gestion d'erreur.

    Je gagne 8 secondes sur 10 par rapport à la solution de Menhir, sans qui cependant je n'aurais pas pu déboguer mon truc ! Merci donc à vous deux ! Yec’hed mat !

    Le problème de mémoire insuffisante a bien entendu disparu de lui-même. (m'étonnais aussi!)

    Et je me suis pris la tête avec une limitation Excel que je ne connaissais pas : Si Plage (String), dans Range(Plage).PasteSpecial, dépasse 255 caractères, j'obtiens une erreur d'exécution 1004 :
    La méthode 'Range' de l'objet '_Global' a échoué
    C'est étonnant non ?

    Sujet résolu !

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

Discussions similaires

  1. [XL-2016] Utilisation d'un range en tant qu'array dans une formule ?
    Par Frqise09 dans le forum Excel
    Réponses: 2
    Dernier message: 23/07/2018, 15h10
  2. [Tableaux] copier tout un array dans une autre variable
    Par XavierWRC dans le forum Langage
    Réponses: 3
    Dernier message: 06/01/2010, 17h07
  3. array dans une proc report pour surligner certaines cellules
    Par debdev dans le forum ODS et reporting
    Réponses: 3
    Dernier message: 26/06/2009, 15h31
  4. mise à jour d'array dans une fonction
    Par Kassar dans le forum Langage
    Réponses: 3
    Dernier message: 09/11/2008, 16h32
  5. [MySQL] Insérer complètement un array dans une base
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/12/2005, 19h52

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