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