Coller un tableau

CISCO

XLDnaute Barbatruc
Bonsoir

Sur une feuille j'ai une plage de données, par exemple en B4:C10, avec une ligne sur deux vides. J'aimerai copier cette plage dans un tableau et ne recoller ailleurs que les lignes contenant des données à partir de E4, exactement dans le même ordre.

Pour le moment, j'ai écrit ça :

Code:
Sub transfert()
Dim tablo(), tablo2()

tablo = Range("B4:C10").Value
tablo2 = Range("E4:F7").Value

        For col = 1 To 2
                For i = 1 To UBound(tablo) Step 2
                lig = Int(i / 2) + 1
                tablo2(lig, col) = tablo(i, col)
                Next i
         Next col

Range("E4").Select
.......

End Sub

Bien sûr, il manque des lignes.
On pourrait obtenir le résultat désiré en mettant une ligne de code du style Range(...,...) = tablo (i, col) à la place de tablo2 (lig, col) = tablo (i, col).
Je pourrais aussi coller ces valeurs avec deux boucles à la place des pointillés, mais j'aimerai savoir s'il est possible de coller le tablo2 en une seule fois, sans utiliser une ou des boucles, histoire de gagner en rapidité.

@ plus

P.S : Dans la réalité, les plages initiales contiennent une soixantaine de lignes, et il faut faire cela à partir de 120 feuilles.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir à tous, salut Si...,

Puisque CISCO veut éviter les boucles :
Code:
Sub Copie()
With [B4:C10] 'tableau source
    .Copy
    .Offset(1000).Insert xlDown 'décalage à adapter
    With .Offset(1000)
        .UnMerge 'défusionne
        Intersect(.SpecialCells(xlCellTypeConstants).EntireRow, .Cells).Copy
        [E4].PasteSpecial xlPasteValues
        .Delete xlUp
    End With
    With .Parent.UsedRange: End With 'actualise les barres de défilement
End With
End Sub
Je laisse CISCO voir la mise en forme (bordures etc)

A+
 

job75

XLDnaute Barbatruc
Re,

Avec ceci pas besoin de collage spécial et la mise en forme est copiée :
Code:
Sub Copie()
With [B4:C10] 'tableau source
    .Copy
    .Offset(1000).Insert xlDown 'décalage à adapter
    With .Offset(1000)
        .UnMerge 'défusionne
        Intersect(.SpecialCells(xlCellTypeConstants).EntireRow, .Cells).Copy [E4]
        .Delete xlUp
    End With
    With .Parent.UsedRange: End With 'actualise les barres de défilement
End With
End Sub
Fichier joint.

A+
 

Pièces jointes

  • essai transfert sans lignes vides(1).xlsm
    24.7 KB · Affichages: 29

CISCO

XLDnaute Barbatruc
Bonjour à tous, bonjour Si et Job75.

@ Si : Merci. Apparemment, tu jongles avec deux tableaux, t et ti.

@ Job75 : Merci. C'est nickel. Cela fait tout à fait ce que je voulais.

Je vais essayer de comprendre davantage comment cela fonctionne. F8, F8, F8...

Au plaisir

@ plus
 

job75

XLDnaute Barbatruc
Bonjour CISCO, le forum,

Une solution plus élaborée dans ce fichier (2) :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
Range("E4:F" & Rows.Count).Clear 'RAZ
With [B4:C10] 'tableau source
    If Application.CountIf(.Cells, "?*") Then
        Set P = .Offset(UsedRange.Row + UsedRange.Rows.Count - .Row) 'décalage hors du UsedRange
        .Copy P
        P.UnMerge 'défusionne
        Intersect(P.SpecialCells(xlCellTypeConstants).EntireRow, P).Copy [E4]
        P.Delete xlUp
    End If
End With
With UsedRange: End With 'actualise les barres de défilement
Application.EnableEvents = True 'réactive les évènements
End Sub
Bonne journée.
 

Pièces jointes

  • essai transfert sans lignes vides(2).xlsm
    24.9 KB · Affichages: 26

job75

XLDnaute Barbatruc
Re,

Il faut savoir que le copier-coller d'un nombre important de plages disjointes a ses limites.

Voyez ce que donne le fichier joint avec un tableau source de seulement 2000 lignes (1000 plages disjointes).

Chez moi la macro s'exécute en 55 secondes, c'est la limite de l'acceptable.

Conclusion : sur un grand tableau il faut travailler avec des tableaux VBA.

A+
 

Pièces jointes

  • essai transfert 2000 lignes non vides(1).xlsm
    60.5 KB · Affichages: 29

CISCO

XLDnaute Barbatruc
Bonjour à tous

Merci Job75 pour ces précisions. Chez moi, l'exemple que tu as donné tourne en 11 s. C'est tout à fait acceptable. Je vais essayer d'adapter cela sur un fichier plus lourd que la pièce jointe que j'avais mis en exemple. Je te dirais ce que cela donne, si j'y arrive. Pour ce qui est de l'utilisation des tableaux VBA, c'était mon idée initiale...

@ plus
 

CISCO

XLDnaute Barbatruc
Bonjour à tous

@ Job75 : Je viens d'adapter ta dernière proposition à mon fichier réel, et cela tourne vraiment très vite, disons deux ou trois secondes contre une quinzaine avec une boucle. Merci pour cette méthode.

Malheureusement, cela ne fait pas exactement ce dont j'ai besoin, à savoir que cela supprime trop de lignes. Cf. un autre exemple en pièce jointe pour mieux comprendre mon besoin. En réalité, l'objectif n'est pas de supprimer les lignes vides, mais uniquement celles du bas des cellules fusionnées, toutes les lignes impaires dans l'exemple ci-joint. Comme déjà dit, je sais le faire tout simplement avec une boucle avec un step 2, mais j'aimerai bien trouver une méthode plus rapide. Peut-être avec autre chose que xlCellTypeConstants dans Intersect(P.SpecialCells(xlCellTypeConstants).EntireRow, P).Copy [E4]. Je vais, de ce pas, chercher...

@ plus
 

Pièces jointes

  • essai transfert sans lignes vides3.xlsm
    20.4 KB · Affichages: 23

job75

XLDnaute Barbatruc
Bonjour CISCO, mapomme,
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, ncol%, tablo, resu(), i&, n&, j%
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
Set P = [B4:C14] 'tableau source, à adapter
ncol = P.Columns.Count
tablo = P.Value
ReDim resu(1 To UBound(tablo), 1 To ncol)
For i = 1 To P.Rows.Count
    n = n + 1
    For j = 1 To ncol
        resu(n, j) = tablo(i, j)
    Next j
    i = i + P(i, 1).MergeArea.Rows.Count - 1
Next i
With [E4] '1ère cellule des résultats, à adapter
    .Resize(n, ncol) = resu
    .Resize(n, ncol).Borders.Weight = xlThin
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol).Delete xlUp 'RAZ sous le tableau
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Fonctionne quel que soit le nombre de cellules fusionnées sur chaque ligne du tableau source.

Bien sûr ici les formats ne sont pas copiés.

Fichier joint.

A+
 

Pièces jointes

  • essai transfert sans lignes vides(3).xlsm
    26.8 KB · Affichages: 30

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 082
Membres
103 112
dernier inscrit
cuq-laet