Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Y'a-t-il un unconvénient dans cette déclaration ?

20 réponses
Avatar
Apitos
Bonsoir =E0 tous,

J'ai d=E9clar=E9 un tableau :

---
Public Tableau()
---
et =E0 l'aide du code VBA je le remplie de valeurs :

----
L =3D 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 =3D Cel.Offset(, -1).Value
Lst2 =3D Cel.Offset(, 1).Value
Tableau(L, 1) =3D Lst1: Tableau(L, 2) =3D Lst2
L =3D L + 1
End If
Next Cel

----

Est-ce une mani=E8re de proceder =E0 =E9viter de n'avoir pas utiliser Dim o=
u
Redim Preserve pour la d=E9claration ou le redimentionnement dynamique
du tableau ?

Merci.

10 réponses

1 2
Avatar
Nicolas B.
Bonjour,

Il faut absolument passer par un ReDim (ou prévoir dès le début une
taille de tableau fixée plus large que nécessaire).
De plus, on ne peut modifier que la dernière dimension d'un tableau par
ReDim, donc il faut que tu inverses les indices dans ton tableau :

Public Tableau(,)

'----
ReDim Tableau(2, 1)
L = 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
ReDim Preserve Tableau(2, L)
Tableau(1, L) = Lst1: Tableau(2, L) = Lst2
L = L + 1
End If
Next Cel


Nicolas

Apitos a écrit :
Bonsoir à tous,

J'ai déclaré un tableau :

---
Public Tableau()
---
et à l'aide du code VBA je le remplie de valeurs :

----
L = 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
L = L + 1
End If
Next Cel

----

Est-ce une manière de proceder à éviter de n'avoir pas utiliser Dim ou
Redim Preserve pour la déclaration ou le redimentionnement dynamique
du tableau ?

Merci.


Avatar
lSteph
Bonjour,

Ceci est intéressant aussi dans ce domaine
''''''''''de FS dans ce fil (voir le code ci après)
http://groups.google.fr/group/microsoft.public.fr.excel/browse_thread/threa d/43f741344dddeaaa/414a9577b9a6c7c9?lnk=gst&q=tableau+sans+dimension#41 4a9577b9a6c7c9

Cordialement.
--
lSteph

'''''''''''''''
Sub test2()
Dim MonTab(), i&
MonTab = Array("jacques", "paul", "martin", "colbert")
'cette syntaxe
For i = LBound(MonTab) To UBound(MonTab)
MsgBox MonTab(i)
Next i
'équivaut à
For i = 0 To 3: MsgBox MonTab(i): Next i
End Sub
'''''''''''''


On 1 août, 09:03, "Nicolas B." wrote:
Bonjour,

Il faut absolument passer par un ReDim (ou prévoir dès le début une
taille de tableau fixée plus large que nécessaire).
De plus, on ne peut modifier que la dernière dimension d'un tableau par
ReDim, donc il faut que tu inverses les indices dans ton tableau :

Public Tableau(,)

'----
ReDim Tableau(2, 1)
L = 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
ReDim Preserve Tableau(2, L)
Tableau(1, L) = Lst1: Tableau(2, L) = Lst2
L = L + 1
End If
Next Cel

Nicolas

Apitos a écrit :

> Bonsoir à tous,

> J'ai déclaré un tableau :

> ---
> Public Tableau()
> ---
> et à l'aide du code VBA je le remplie de valeurs :

> ----
> L = 1
> For Each Cel In sht2.Range("B2",
> sht2.Range("B65536").End(xlUp))
> On Error Resume Next
> If UCase(Motrech) Like UCase(Cel) Then
> Lst1 = Cel.Offset(, -1).Value
> Lst2 = Cel.Offset(, 1).Value
> Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
> L = L + 1
> End If
> Next Cel

> ----

> Est-ce une manière de proceder à éviter de n'avoir pas utiliser D im ou
> Redim Preserve pour la déclaration ou le redimentionnement dynamique
> du tableau ?

> Merci.


Avatar
Apitos
Bonjour,

Pour Nicholas : ça veut dire qu'on ne peut redimentionner que les
colonnes d'un tableau avec Redim Preserve ?

et merci pour LSteph.
Avatar
Nicolas B.
> Pour Nicholas : ça veut dire qu'on ne peut redimentionner que les


> colonnes d'un tableau avec Redim Preserve ?

Oui.

Pour éviter la gestion des dimensions d'un tableau, il faut passer par
un autre objet qu'un tableau : une collection.

Exemple :

Dim col As New Collection

For i = 1 To 5
col.Add Array(Chr(64 + i), i ^ 2)
Next

MsgBox "Deuxième élément de la collection : " _
& vbCrLf & col.Item(2)(0) & vbCrLf & col.Item(2)(1)

Set col = Nothing

Une collection peut contenir tout type d'éléments (ici, un tableau de
type String). On ajoute un élément à la collection à l'aide de la
méthode Add et on accède à un élément avec Item par son indice dans la
collection.


Nicolas

Apitos a écrit :
Bonjour,

Pour Nicholas : ça veut dire qu'on ne peut redimentionner que les
colonnes d'un tableau avec Redim Preserve ?

et merci pour LSteph.



Avatar
michdenis
Une variante, il est possible de faire ceci :

'-----------------------------------------
Sub test()
Dim Tableau(), DerLig As Long, L As Long
Dim Sh2 As Worksheet, Rg As Range
Dim NoTrech As Variant

'Variable à déterminer
Set Sh2 = ThisWorkbook.Worksheets("Feuil1")
Motrech = "????????" '

With Sh2
DerLig = .Range("B65536").End(xlUp).Row
Set Rg = .Range("B2:B" & DerLig)
End With
ReDim Tableau(1 To DerLig - 1, 1 To 2)
For Each c In Rg
If UCase(Motrech) Like UCase(c) Then
L = L + 1
Lst1 = c.Offset(, -1).Value
Lst2 = c.Offset(, 1).Value
Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
End If
Next

'Pour copier les données vers une autre destination
'de la feuille de calcul...
'Attention, le tableau a toujours le même nombre de lignes
'que la colonne B -1 (l'en-tête), mais les données seront
'regroupées ensemble dans les premières lignes de ce dernier.
Range("G1").Resize(UBound(Tableau, 1), UBound(Tableau, 2)) = Tableau

End Sub
'-----------------------------------------





"Apitos" a écrit dans le message de news:

Bonsoir à tous,

J'ai déclaré un tableau :

---
Public Tableau()
---
et à l'aide du code VBA je le remplie de valeurs :

----
L = 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
L = L + 1
End If
Next Cel

----

Est-ce une manière de proceder à éviter de n'avoir pas utiliser Dim ou
Redim Preserve pour la déclaration ou le redimentionnement dynamique
du tableau ?

Merci.
Avatar
Apitos
michdenis : comme je m'en sert de mon tableau pour alimenter une
Listbox, alors s'il n'y a que trois mots retrouvés sur 300 lignes, la
ListBox sera composée en plus des trois mots par 297 lignes vides !!!

alors je vais essayé avec l"idée de nicholas.

----
Sub test()
Dim Col As New Collection

For Each Cel In sht2.Range("B2", sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Col.Add Array(Lst1, Lst2)
End If
Next Cel
End Sub

---

Nicholas : tu as vu ? mechdenis a utilisé Redim pour redimentionner
aussi les lignes d'un tableau ?
Avatar
Nicolas B.
> Nicholas : tu as vu ? mechdenis a utilisé Redim pour redimentionner


> aussi les lignes d'un tableau ?

Oui, mais c'est avant que le tableau n'ait commencé à être rempli. Ce
sont les "ReDim Preserve" qui ne peuvent agir que sur la dernière dimension.


Nicolas

Apitos a écrit :
michdenis : comme je m'en sert de mon tableau pour alimenter une
Listbox, alors s'il n'y a que trois mots retrouvés sur 300 lignes, la
ListBox sera composée en plus des trois mots par 297 lignes vides !!!

alors je vais essayé avec l"idée de nicholas.

----
Sub test()
Dim Col As New Collection

For Each Cel In sht2.Range("B2", sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Col.Add Array(Lst1, Lst2)
End If
Next Cel
End Sub

---

Nicholas : tu as vu ? mechdenis a utilisé Redim pour redimentionner
aussi les lignes d'un tableau ?


Avatar
michdenis
Tu aurais pu utiliser quelque chose comme ceci :

Ce code suppose qu'il soit écrit dans le code feuille où
l'action se déroule.

'-----------------------------------------------------
Sub test()

Dim DerLig As Long
Dim Sh2 As Worksheet, Rg As Range
Dim NoTrech As Variant

'Variable à déterminer
Set Sh2 = ThisWorkbook.Worksheets("Feuil1")
Motrech = "?????" '

'Les caractéristiques du combobox au besoin
With Sh2
With ComboBox1
.ColumnCount = 2
.ColumnWidths = "50;50"
.Clear ' Vide le combobox !
End With

DerLig = .Range("B65536").End(xlUp).Row
Set Rg = .Range("B2:B" & DerLig)
End With

For Each c In Rg
If UCase(Motrech) Like UCase(c) Then
With Me.ComboBox1
.AddItem c.Offset(, -1).Value
.List(a, 1) = c.Offset(, 1).Value
End With
a = a + 1
End If
Next
End Sub
'-----------------------------------------------------



"Apitos" a écrit dans le message de news:

michdenis : comme je m'en sert de mon tableau pour alimenter une
Listbox, alors s'il n'y a que trois mots retrouvés sur 300 lignes, la
ListBox sera composée en plus des trois mots par 297 lignes vides !!!

alors je vais essayé avec l"idée de nicholas.

----
Sub test()
Dim Col As New Collection

For Each Cel In sht2.Range("B2", sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Col.Add Array(Lst1, Lst2)
End If
Next Cel
End Sub

---

Nicholas : tu as vu ? mechdenis a utilisé Redim pour redimentionner
aussi les lignes d'un tableau ?
Avatar
Apitos
Bon voila le code que j'utilise, peut-être que vous aurez une
meuilleure vue sur le problème :

-----
Public Tableau() As String
Public Sub affichagefen(ByVal Target As Range)
Dim Texte As String, ch As String, Motrech As String, ActiveFen As
String
Dim Cel As Range
Dim Lst1 As String, Lst2 As String

Set sht2 = Sheets("Feuil2")
Texte = ""
Motrech = ""
'ReDim Tableau(1, 2)
If Target.Column = 1 And Target.Count = 1 Then

ActiveFen = Right(Target.Value, 2)
Select Case ActiveFen
'----
Case Is = "--"
Motrech = RechercheMot(Target, ActiveFen)
'MsgBox "mot recherché = " & Motrech
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
L = L + 1
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
End If
Next Cel
ListePrixU.Show
End Select
End If
End Sub
Public Function RechercheMot(ByVal Target As Range, FinSaisie As
String) As String
G = Split(Target, "-")
If UBound(G) = 4 And FinSaisie = "--" Then G(1) = G(1) & "-" 'mo t
composé
If UBound(G) = 3 And FinSaisie = "-+" Then G(1) = G(1) & "-" 'mo t
composé
For a = 1 To UBound(G) - 1
RechercheMot = RechercheMot + G(a)
Next
End Function

----

Le code de la UseForm (ListPrixU) :

----
Private Sub CommandButton1_Click()
Dim i As Integer
With ListePrixU.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
ActiveCell.Offset(-1, 0).Value = ListBox1.List(i, 0)
ActiveCell.Offset(-1, 2) = ListBox1.List(i, 1)
ActiveCell.Offset(-1, 1).Select
End If
Next i
End With
End Sub

Private Sub CommandButton2_Click()
Unload ListePrixU
End Sub

Private Sub UserForm_Initialize()
ListBox1.List() = Tableau
ListBox1.MultiSelect = 2
ListBox1.BackColor = RGB(204, 204, 255)
End Sub
---

http://www.cijoint.fr/cjlink.php?file=cj200808/cijGw39EE9.xls

Merci d'avance.
Avatar
michdenis
J'ai ajouté un module "Denis" et j'y ai mis un bout de code.
Comme tu n'as donné aucune explication sur ce que tu voulais
faire...il m'est difficile de savoir !

http://cjoint.com/?icel3s6GOg





"Apitos" a écrit dans le message de news:

Bon voila le code que j'utilise, peut-être que vous aurez une
meuilleure vue sur le problème :

-----
Public Tableau() As String
Public Sub affichagefen(ByVal Target As Range)
Dim Texte As String, ch As String, Motrech As String, ActiveFen As
String
Dim Cel As Range
Dim Lst1 As String, Lst2 As String

Set sht2 = Sheets("Feuil2")
Texte = ""
Motrech = ""
'ReDim Tableau(1, 2)
If Target.Column = 1 And Target.Count = 1 Then

ActiveFen = Right(Target.Value, 2)
Select Case ActiveFen
'----
Case Is = "--"
Motrech = RechercheMot(Target, ActiveFen)
'MsgBox "mot recherché = " & Motrech
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
L = L + 1
Lst1 = Cel.Offset(, -1).Value
Lst2 = Cel.Offset(, 1).Value
Tableau(L, 1) = Lst1: Tableau(L, 2) = Lst2
End If
Next Cel
ListePrixU.Show
End Select
End If
End Sub
Public Function RechercheMot(ByVal Target As Range, FinSaisie As
String) As String
G = Split(Target, "-")
If UBound(G) = 4 And FinSaisie = "--" Then G(1) = G(1) & "-" 'mot
composé
If UBound(G) = 3 And FinSaisie = "-+" Then G(1) = G(1) & "-" 'mot
composé
For a = 1 To UBound(G) - 1
RechercheMot = RechercheMot + G(a)
Next
End Function

----

Le code de la UseForm (ListPrixU) :

----
Private Sub CommandButton1_Click()
Dim i As Integer
With ListePrixU.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
ActiveCell.Offset(-1, 0).Value = ListBox1.List(i, 0)
ActiveCell.Offset(-1, 2) = ListBox1.List(i, 1)
ActiveCell.Offset(-1, 1).Select
End If
Next i
End With
End Sub

Private Sub CommandButton2_Click()
Unload ListePrixU
End Sub

Private Sub UserForm_Initialize()
ListBox1.List() = Tableau
ListBox1.MultiSelect = 2
ListBox1.BackColor = RGB(204, 204, 255)
End Sub
---

http://www.cijoint.fr/cjlink.php?file=cj200808/cijGw39EE9.xls

Merci d'avance.
1 2