Limitation Application.Transpose

Bonjour à tous,

Etant un peu bloqué sur un code et un dépassement de capacité, je viens vers vous pour essayer de trouver une solution.

Pour faire simple, j'utilise la fonction application.transpose Hors dans la table que je crée, je dépasse les 65000 lignes (en fait j'en suis à 120000 lignes). Je me retrouve avec une incompatibilité de type.

Quelqu'un aurait il une solution pour contourner le problème ?

Voici mon code :

Option Explicit
Option Private Module

Public Sub Create_Table()
Dim wb As Workbook
Dim wsData As Worksheet, wsTable As Worksheet
Dim lo As ListObject
Dim Cell As Range
Dim tbl, Arr()
Dim I As Long, J As Long, k As Long

    Set wb = ActiveWorkbook
    Set wsData = wb.Worksheets("Compil")
    Set wsTable = wb.Worksheets("Table")
    Set lo = wsTable.ListObjects(1)

    With lo
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
        Set Cell = .InsertRowRange.Cells(1)
    End With

    tbl = wsData.Cells(1).CurrentRegion.Value
    For I = 2 To UBound(tbl)
        For J = 13 To UBound(tbl, 2)
            If tbl(I, J) <> "" Then
                ReDim Preserve Arr(12, k + 1)
                Arr(0, k) = tbl(I, 1)
                Arr(1, k) = tbl(I, 2)
                Arr(2, k) = tbl(I, 3)
                Arr(3, k) = tbl(I, 4)
                Arr(4, k) = tbl(I, 5)
                Arr(5, k) = tbl(I, 6)
                Arr(6, k) = tbl(I, 7)
                Arr(7, k) = tbl(I, 8) & ", " & tbl(I, 9)
                Arr(8, k) = tbl(I, 10)
                Arr(9, k) = tbl(I, 11)
                Arr(10, k) = tbl(I, 12)
                Arr(11, k) = CLng(tbl(1, J))
                Arr(12, k) = tbl(I, J)
                k = k + 1
            End If
        Next J
    Next I

    If k > 0 Then Cell.Resize(k, 13).Value = Application.Transpose(Arr)
    lo.HeaderRowRange.EntireColumn.AutoFit

End Sub

Bonjour,

arrange-toi pour ne pas devoir faire de .transpose (inverse tes indices dans ton tableau Arr()), cela voudra dire que tu devras estimer la taille maximum que pourra prendre ce tableau et l'indiquer dans une instruction dim, par exemple dim Arr(200000,12) (le redim preserve ne fonctionne pas que si il y a redimensionnement du dernier indice).

une autre manière de faire est de copier ton tableau vers la feuille et de le réinitialiser chaque fois que tu arrives à 65000.

Bonjour,

a priori le tableau Arr ne contiendra pas plus de lignes que le tableau tbl,

on peut donc déclarer directement :

Dim Arr(1 to Ubound( tbl,1), 1 to 12)

et donc plus besoin de Application.Transpose

A+

EDIT: Bonjour h2so4

Bonjour à vous deux,

Déjà bien le merci pour vos réponses.

@AlgoPlus je suis partisan de ton retour, je suis entrain de revoir mon code en fonction de ton aide, mais je bloque encore un peu, surtout qu'en déclarant comme cela, j'ai des constantes requises...

Je vais essayer de me triturer les méninges avec ce que tu m'as donné.

bonjour,

essaie ceci

dim Arr()
ReDim Arr(0 to Ubound( tbl,1), 1 to 12)

Ah bah ! oui !

Boulette !!!

Merci pour ta précision @h2so4

Néanmoins, 2 précisions :

  • La première, pour revenir au premier post de AlgoPlus, le nombre de lignes va être différent. En effet, je suis sur un tableau de départ qui comporte 336 lignes et 382 colonnes. Je cherche donc à transformer ces informations en les mettant sous forme d'un autre tableau (pour générer un TCD) ensuite. Quand je par d'un tableau de 70 lignes, mon code fonctionne correctement. Mais là effectivement je me retrouve limité par le transpose.
  • La deuxième, j'ai testé différemment les bouts de code fournis. Soit je m'y prends mal, soit j'ai pas pigé une chose, mais je suis bloqué le code me revient en incompatibilité de type.

Pour être plus clair, enfin j'espère, je mets un fichier exemple en pièce jointe (fichier ne comportant pas toutes les lignes de départ sous "compil")

14excel-pratique.xlsm (617.66 Ko)

Bonjour à tous,

Ca bien longtemps que je n'utilise plus Application.Transpose, depuis que je me la suis ré-écrite avec des entiers-longs pour manipuler les "gros" tableaux.

Tiens, c'est cado :

' *****  CODE PierreP56 : http://tatiak.canalblog.com/  *****
Function Transpose(Ttk As Variant) As Variant
Dim T As Variant, lg As Long, cl As Long, i As Long, j As Long

    lg = UBound(Ttk, 1)
    cl = UBound(Ttk, 2)
    ReDim T(LBound(Ttk, 2) To cl, LBound(Ttk, 1) To lg)
    For i = LBound(Ttk, 2) To cl
        For j = LBound(Ttk, 1) To lg
            T(i, j) = Ttk(j, i)
        Next j
    Next i
    Transpose = T
End Function

Elle est déjà présente dans nombreux de mes fichiers proposés sur ce forum.

Pierre

bonjour,

proposition de correction de ton code

Public Sub Create_Table()
    Dim wb As Workbook
    Dim wsData As Worksheet, wsTable As Worksheet
    Dim lo As ListObject
    Dim Cell As Range
    Dim tbl, Arr()
    Dim I As Long, J As Long, k As Long

    Set wb = ActiveWorkbook
    Set wsData = wb.Worksheets("COMPIL")
    Set wsTable = wb.Worksheets("TABLE")
    Set lo = wsTable.ListObjects(1)

    With lo
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
        Set Cell = .InsertRowRange.Cells(1)
    End With
    tbl = wsData.Cells(1).CurrentRegion.Value
    ReDim Arr(UBound(tbl, 1) * UBound(tbl, 2), 12)

    For I = 2 To UBound(tbl)
        For J = 13 To UBound(tbl, 2)
            If tbl(I, J) <> "" Then
                Arr(k, 0) = tbl(I, 1)
                Arr(k, 1) = tbl(I, 2)
                Arr(k, 2) = tbl(I, 3)
                Arr(k, 3) = tbl(I, 4)
                Arr(k, 4) = tbl(I, 5)
                Arr(k, 5) = tbl(I, 6)
                Arr(k, 6) = tbl(I, 7)
                Arr(k, 7) = tbl(I, 8) & ", " & tbl(I, 9)
                Arr(k, 8) = tbl(I, 10)
                Arr(k, 9) = tbl(I, 11)
                Arr(k, 10) = tbl(I, 12)
                Arr(k, 11) = tbl(1, J)
                Arr(k, 12) = tbl(I, J)
                k = k + 1
            End If
        Next J
    Next I

    If k > 0 Then Cell.Resize(k, 13).Value = (Arr)
    lo.HeaderRowRange.EntireColumn.AutoFit

End Sub

Bonjour pierrep56,

Bien sympa ta fonction, chose à laquelle je n'avais jamais pensé sous vba, faire des fonctions personnalisées.

En tout cas, en effet, cela fonctionne parfaitement.

Tout comme pour @h2so4. A vrai dire, c'est moi qui ai pas été très bon sur ce coup, j'ai mal positionné la ligne dans le code, je comprends mieux mon erreur.

En tout cas merci beaucoup à tous les 3, j'ai appris quelque chose de nouveau aujourd'hui sur excel et le vba !

Rechercher des sujets similaires à "limitation application transpose"