Coller un Array dans une feuille

Bonjour à tous

Je viens vers vous pour avoir un éclaircissement

Je rencontre un problème

J'ai codé du VBA a la maison et tout marche très bien, mais une fois tester sur le Excel de la boite, sa ne fonctionne pas, le tableau VBA refuse de se coller dans la feuille alors qu'a la maison cela fonctionne

Auriez-vous des pistes ?

Je vous transfert le morceau du code qui pose souci, le code part chercher une réponse csv sur un site interne, ensuite je le parse et le colle sous forme de tableau

En mode debug les variables reçoivent bien les split, mais c'est au moment de

Range("A1:L" & UBound(DataArray)).FormulaArray = DataArray
Dim BackArray() As String, DataArray() As Variant

BackArray = Split(.responseText, Chr(10))

ReDim DataArray(LBound(BackArray) To UBound(BackArray))

For i = LBound(BackArray) To UBound(BackArray)
   DataArray(i) = Split(BackArray(i), ",")
Next i

Range("A1:L" & UBound(DataArray)).FormulaArray = DataArray

J'ai testé plusieurs choses mais ne fonctionne

Merci pour vos pistes

Bonjour Shenzar,

Déjà, je pense qu'il y a un petit souci au niveau des bases des tableaux : BackArray est en base 0 (résultant d'un split) et ça ne pose pas de problème.

Mais ensuite, DataArray est lui aussi en Base 0 est destiné au collage sur la feuille de calcul sur une logique de base 1.

Ensuite, DataArray est un tableau 1D dont chaque élément contient un tableau 1D. Il faut le convertir en tableau 2D via transpose ou par une fonction si ça ne marche pas :

Dim BackArray() As String, DataArray() As Variant

BackArray = Split(.responseText, Chr(10))

ReDim DataArray(LBound(BackArray) To UBound(BackArray))

For i = LBound(BackArray) To UBound(BackArray)
   DataArray(i) = Split(BackArray(i), ",")
Next i

Range("A1:L" & UBound(DataArray) + 1).FormulaArray = application.transpose(application.transpose(DataArray)) 'double transpose convertit en tableau 2D, de base 1

Et encore faut-il que chaque ligne de BackArray contienne autant de "," que les autres. Sinon, ça échouera fatalement...

Cdlt,

Merci pour ton point de vue

Chaque ligne de BackArray a le même nombre de "," même si vide

J'avais testé un peu le transpose d'une autre façon, j'ai essayé ton exemple mais ça ne marche toujours pas :( je regarde la piste de la fonction

Mais quand tu dis que ça ne marche pas, tu veux dire qu'il y a un bug ou qu'il ne se passe rien ?

En effet, la fonction transpose est sujette à des bugs notamment si le tableau contient des chaines de caractères trop longues.

Il ne se passe rien, la page reste vierge

Mais les tableaux sont complet en mémoire, c'est plus le collage qui foire, mais ce que je ne comprends pas c'est que les test à la maison fonctionner, c'est vraiment quand je suis arriver au taffe qu'en cliquant c'est rester vierge

Niveau chaines de caractère, chaque cellules contient un nombre assez court

Et est-ce que tu pourrais poster la procédure ? Parce que l'extrait est issu d'un bloc with, au sein duquel il y a peut-être une gestion d'erreur empêchant de constater un bug lors de la restitution.

Et pourquoi .formulaarray ? Pourquoi pas .value tout simplement ?

C'est étonnant que tes essais aient été concluants. Il est assez rare d'éviter le bug avec un tableau de tableaux (je dis ça de mémoire, maintenant je ne réfléchis plus et je transpose pour mettre à plat les imbrications).

J'ai tenté un .value mais j'avais une erreur à la maison, le .FormulaArray lui à fonctionner

J'ai finalement une erreur de Mismatch qui se déclare au taffe, je sais pas pourquoi a la maison le .formulaarray marche sans erreur mismatch, voici le code

Je dois avoir un problème comme tu avais dis au départ :(

Sub SearchYOY()

    Dim FAC As String, H As Object, Url As String, Body As String
    Dim LineArray() As String, DataArray() As Variant, i As Long
    Dim Chemin As String

    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    Set H = CreateObject("WinHTTP.WinHTTPRequest.5.1")

    FAC = ""

    With H

        .SetAutoLogonPolicy 0
        .SetTimeouts 0, 0, 0, 0
        .Open "GET", ""
        .send
        .WaitForResponse

        Body = "" & Split(Split(.responseText, """:""", , vbBinaryCompare)(1), """", , vbBinaryCompare)(0)

        .Open "POST", ""
        .setRequestHeader "Referer", ""
        .setRequestHeader "Host", ""
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .send Body
        .WaitForResponse

        .Open "Get", "" & FAC
        .send
        .WaitForResponse

        Url = ""

        .Open "GET", Url, False
        .setRequestHeader "Cookie", ""
        .send
        .WaitForResponse

        'Debug.Print .responseText

        LineArray = Split(.responseText, Chr(10))

    End With

    ReDim DataArray(LBound(LineArray) To UBound(LineArray))

    For i = LBound(LineArray) To UBound(LineArray)
        DataArray(i) = Split(LineArray(i), ",")
    Next i

'    Range("A1:L" & UBound(DataArray) + 1).FormulaArray = Application.Transpose(Application.Transpose(DataArray))

    Dam.Range("A1:L" & UBound(DataArray)).FormulaArray = DataArray

    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With

End Sub

Je te remercie pour le code.

Sur quelle ligne a lieu l'erreur ? Es-tu certain que les tableaux soient bien de même taille, notamment DataArray ? J'inspecterais bien les tailles des tableaux et un peu leur contenu si j'étais toi.

C'est la galère, du coup j'ai suivi ta piste et tu as raison sur la contenance du tableau, sa peut venir de ça

image

Il recup une dernière ligne vide sa doit venir du split chr(10) de la dernière peut être

Du coup le second tableau dataArray ne recup rien

image

Faut t'il passer par une suppression de ligne, dire au code de supprimer la dernière ligne du tableau ?

Le tableau peut varier de 400 a plus de 1000, faut que je test chaque jour si sa reviens comme ça, a la maison sa marchait parce que je n'avais pas ce type de retour en dernière ligne

Du coup mon souci est résolu enfin je pense

J'ai donc incrémenter les tableaux par -1

    ReDim DataArray(LBound(LineArray) To UBound(LineArray) - 1)

    For i = LBound(LineArray) To UBound(LineArray) - 1
        DataArray(i) = Split(LineArray(i), ",")
    Next i

Le tableau se colle dans le sheet :) par la formule :

Dam.Range("A1:L" & UBound(DataArray)).FormulaArray = DataArray

La formule que tu m'avais donné fonctionne du coup maintenant

Range("A1:L" & UBound(DataArray)).Value = Application.Transpose(Application.Transpose(DataArray))

A voir si sa va tenir dans le temps :)

Merci pour tes conseils :)

Salut Shenzar,

Merci du retour et bravo pour la résolution ! La solution -1 est très bien ! Sinon, peut-être qu'il serait possible d'utiliser la fonction Filter sur le tableau LineArray pour écarter la valeur vide.

C'est un scoop que le premier collage fonctionne correctement. Tant mieux, je me renseignerai davantage pour comprendre pourquoi ça a déjà bloqué par le passé (c'était peut-être à cause de mon mac...).

A plus,

Salut,

Merci pour la piste Filter, je vais check comment l'utiliser sa peut être utile pour le futur, jamais utiliser pour le moment dans ce contexte :)

A plus,

Rechercher des sujets similaires à "coller array feuille"