Remplir un tableau sans boucle for

Bonjour à tous,

Je travaille sur un projet dans lequel j'ai besoin de remplir un tableau Tab() de dimension (n,m) à partir d'une range R de dimension (n,p).

J'aimerais savoir si il y a un moyen de mettre la colonne 1 (par exemple) de ma range dans la colonne 2 (par exemple) de mon tableau sans avoir à utiliser de boucle for?

J'ai pensé à un truc comme

'Tab(0,2) pour dire la colonne 2 de mon tableau (je me doute bien que c'est faux)
Tab(0,2)=R.columns(1)

vu que ma range R et mon tableau Tab() ont les même dimensions de lignes est ce qu'il existe un moyen de faire ce transfert de données sans utiliser les boucles ?

Merci d'avance

Bonjour,

Sans vouloir être choquant ; sans un fichier exemple ; pour moi la question actuelle c'est du charabia … la colonne de ma range ????

Je dois remplir un tableau çà ok avec quoi ? ou sont les données ? dans un userform ? dans une plage d'un onglet ?

Avec un fichier exemple et ce que vous souhaitez obtenir vous aurez sans doute plus de réponse.

Bonjour, salut xmenpl !

Je pense que le problème va être vite vu : à ma connaissance, c'est soit tu affectes la totalité d'une plage dans une variable tableau, soit tu affectes un tableau élément pas élément à l'aide de boucles par exemple.

Donc affecter en une instruction une plage à une partie uniquement de variable tableau, ça n'est pas possible. Il faut parcourir chaque élément du tableau à affecter.

Bonjour,

Il est assez rare de travailler sur des tableaux de tailles différentes.

Si tu Tableau "Source" est de taille "A1;H2125"

Tu peux très bien déclarer un array plus petit

Arr1=[B1:H2125].Value

ou un array décalé

Arr2=[B1:G2125].Value

mais si tu veux un décalage négatif, je mieux est d'insérer une colonne avant la colonne A

Arr3=[A1:G2125].Value

Ainsi ton Array couvrira tout le Tableau avec une colonne vide au début... Mais je ne vois pas trop l’intérêt ?

Le mieux serait que nous montre classeur à l'appui ce que tu envisages de faire.

A+

Bonjour,

Pourquoi ne pas tester par toi-même?

Pour une colonne :

Sub EssaiRange()
Dim maPlage As Range, Tb
    Set maPlage = Range("A1:K20")
    Tb = maPlage.Columns(2)
    Debug.Print "Nb lignes : " & UBound(Tb, 1) & " / Nb Colonnes : " & UBound(Tb, 2) & " / Tb(10, 1) = " & Tb(10, 1)
End Sub

Pour plusieurs (attention, les colonnes doivent être contiguës) :

Sub EssaiRange2()
Dim maPlage As Range, Tb
    Set maPlage = Range("A1:K20")
    Tb = Union(maPlage.Columns(2), maPlage.Columns(3), maPlage.Columns(4), maPlage.Columns(5)).Value
    Debug.Print "Nb lignes : " & UBound(Tb, 1) & " / Nb Colonnes : " & UBound(Tb, 2) & " / Tb(10, 3) = " & Tb(10, 3)
End Sub

Avec des colonnes non contiguës (ne retourne que la première colonne) :

Sub EssaiRange3()
Dim maPlage As Range, Tb
    Set maPlage = Range("A1:K20")
    Tb = Union(maPlage.Columns(2), maPlage.Columns(5)).Value
    Debug.Print "Nb lignes : " & UBound(Tb, 1) & " / Nb Colonnes : " & UBound(Tb, 2) & " / Tb(10, 1) = " & Tb(10, 1)
End Sub

EDIT : mauvaise lecture, pardon.

Comme dit par Pedro (salut) :

affecter, en une instruction, une plage à une partie uniquement de variable tableau de 2 dimensions, sans boucle, est impossible.

C'est toutefois possible sans boucle, mais sans garantie de rapidité, en passant par une feuille vierge (ou, dans l'exemple, l'ajout d'une nouvelle feuille).

Option Explicit

Sub Essai()
Dim maPlage As Range, Tb As Variant, Wsh As Worksheet
Const ADRESSE As String = "B2:J20"

    Set maPlage = Sheets("Feuil1").Range(ADRESSE)
    Tb = Sheets("Feuil2").Range(ADRESSE).Value
    Debug.Print "Avant traitement, Tb(10, 2)=" & Tb(10, 2)

'*********** TRAITEMENT ************
    '   1- Ajoute une feuille au classeur
    Set Wsh = ThisWorkbook.Worksheets.Add
    With Wsh
        '   2- Transfère la variable tableau Tb dans cette nouvelle feuille
        .Range(Split(ADRESSE, ":")(0)).Resize(UBound(Tb, 1), UBound(Tb, 2)).Value = Tb
        '   3- Insère, en 2ème colonne, le contenu de la 1ère colonne du Range
        .Range(ADRESSE).Columns(2).Value = maPlage.Columns(1).Value
        '   4- Transfert des données de la nouvelle feuille dans la variable tableau
        Tb = .Range(ADRESSE).Value
        '   5- Supprime la nouvelle feuille
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
'********* FIN TRAITEMENT **********

    Debug.Print "Après traitement, Tb(10, 2)=" & Tb(10, 2)
End Sub

EDIT :

On pourrait même faire une fonction qui insère n'importe qu'elle partie d'un Range dans n'importe qu'elle partie d'une variable tableau :

Function InsereDansTableau(Tableau As Variant, Plage As Range) As Variant
Dim wsh As Worksheet
    Set wsh = ThisWorkbook.Worksheets.Add
    With wsh
        .Range("A1").Resize(UBound(Tableau, 1), UBound(Tableau, 2)).Value = Tableau
        .Range(Plage.Address).Value = Plage.Value
        InsereDansTableau = .Range("A1").Resize(UBound(Tableau, 1), UBound(Tableau, 2)).Value
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    Set wsh = Nothing
End Function

exemple d'appel :

Sub Essai()
Dim maPlage As Range, Tb As Variant
    Set maPlage = Sheets("Feuil1").Range("B2:D10")
    Tb = Sheets("Feuil2").Range("A1:J20").Value
    Tb = InsereDansTableau(Tb, maPlage)
End Sub
Rechercher des sujets similaires à "remplir tableau boucle"