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

Variable Tableau

7 réponses
Avatar
DesseJ
Bonjour =E0 tous,

J'ai toujours du mal =E0 ins=E9rer un tableau, r=E9sultat =E0 une unique
variable dans une plage de cellules.
Le r=E9sultat de la premi=E8re macro, c'est la m=EAme occurrence
r=E9p=E9t=E9e autant de fois qu'il y a de r=E9sultats possibles (cellules
en gras).
En revanche, dans la seconde, en "rusant" et en faisant croire =E0 Excel
que mon tableau a deux variables, l=E0 c'est juste. J'ai bien le contenu
de toutes mes cellules en gras dans la plage d=E9di=E9e.
O=F9 p=EAche-je, svp ?

Merci
Steph D.

Sub MaMacroQuiNeMarchePas()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30)
i =3D 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold =3D True Then
MesDonnees(i) =3D MaCellule.Value
i =3D i + 1
End If
Next MaCellule
ReDim Preserve MesDonnees(i - 1)
Sheets("Feuil2").Range("A1:A" & i - 1) =3D MesDonnees
End Sub

Sub MaMacroQuiMarche()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30, 1 To 1)
i =3D 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold =3D True Then
MesDonnees(i, 1) =3D MaCellule.Value
i =3D i + 1
End If
Next MaCellule
Sheets("Feuil2").Range("A1:A" & i - 1) =3D MesDonnees
End Sub

7 réponses

Avatar
michdenis
Bonjour DesseJ,

Essaie ceci :

'--------------------------------
Sub MaMacroQuiNeMarchePas()

Dim C As Range, Rg As Range
Dim MesDonnees()
Dim i As Long

With Worksheets("Feuil1")
Set Rg = .Range("B2").CurrentRegion
End With

For Each c In Rg
If c.Font.Bold = True Then
ReDim Preserve MesDonnees(i)
MesDonnees(i) = c.Value
i = i + 1
End If
Next
'Pour avoir ton résultat en colonne ... sinon tu
'enlève cette section WorksheetFunction.Transpose
Sheets("Feuil2").Range("A1").Resize(i).Value = _
WorksheetFunction.Transpose(MesDonnees)

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


Salutations!


"DesseJ" a écrit dans le message de news:
Bonjour à tous,

J'ai toujours du mal à insérer un tableau, résultat à une unique
variable dans une plage de cellules.
Le résultat de la première macro, c'est la même occurrence
répétée autant de fois qu'il y a de résultats possibles (cellules
en gras).
En revanche, dans la seconde, en "rusant" et en faisant croire à Excel
que mon tableau a deux variables, là c'est juste. J'ai bien le contenu
de toutes mes cellules en gras dans la plage dédiée.
Où pêche-je, svp ?

Merci
Steph D.

Sub MaMacroQuiNeMarchePas()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30)
i = 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold = True Then
MesDonnees(i) = MaCellule.Value
i = i + 1
End If
Next MaCellule
ReDim Preserve MesDonnees(i - 1)
Sheets("Feuil2").Range("A1:A" & i - 1) = MesDonnees
End Sub

Sub MaMacroQuiMarche()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30, 1 To 1)
i = 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold = True Then
MesDonnees(i, 1) = MaCellule.Value
i = i + 1
End If
Next MaCellule
Sheets("Feuil2").Range("A1:A" & i - 1) = MesDonnees
End Sub
Avatar
michdenis
Bonjour DesseJ,

Une variante:

Si tu désires contrôler lors de la boucle sur ta plage de cellules, si excel doit procédure en ligne ou en colonne pour la lectures,
Tu n'as qu'à inverser l'ordre des 2 boucles.


'-----------------------------------
Sub Test()

Dim R As Long, C As Integer
Dim MesDonnees()
Dim i As Long, Rg As Range

With Worksheets("Feuil1")
Set Rg = .Range("B2").CurrentRegion
End With

R = Rg.Rows.Count
C = Rg.Columns.Count

For a = 1 To Rg.Rows.Count
For b = 1 To C
If Rg(a, b).Font.Bold = True Then
ReDim Preserve MesDonnees(i)
MesDonnees(i) = Rg(a, b)
i = i + 1
End If
Next
Next
'Recopie en ligne
Sheets("Feuil2").Range("A1").Resize(, i).Value = _
MesDonnees
End Sub
'-----------------------------------


Salutations!




"DesseJ" a écrit dans le message de news:
Bonjour à tous,

J'ai toujours du mal à insérer un tableau, résultat à une unique
variable dans une plage de cellules.
Le résultat de la première macro, c'est la même occurrence
répétée autant de fois qu'il y a de résultats possibles (cellules
en gras).
En revanche, dans la seconde, en "rusant" et en faisant croire à Excel
que mon tableau a deux variables, là c'est juste. J'ai bien le contenu
de toutes mes cellules en gras dans la plage dédiée.
Où pêche-je, svp ?

Merci
Steph D.

Sub MaMacroQuiNeMarchePas()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30)
i = 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold = True Then
MesDonnees(i) = MaCellule.Value
i = i + 1
End If
Next MaCellule
ReDim Preserve MesDonnees(i - 1)
Sheets("Feuil2").Range("A1:A" & i - 1) = MesDonnees
End Sub

Sub MaMacroQuiMarche()
Dim MaCellule As Range
Dim MesDonnees
Dim i As Double
ReDim MesDonnees(1 To 30, 1 To 1)
i = 1
For Each MaCellule In Range(Worksheets("Feuil1").Range("B2"),
Worksheets("Feuil1").Range("B2").CurrentRegion)
If MaCellule.Font.Bold = True Then
MesDonnees(i, 1) = MaCellule.Value
i = i + 1
End If
Next MaCellule
Sheets("Feuil2").Range("A1:A" & i - 1) = MesDonnees
End Sub
Avatar
DesseJ
Bonjour,

Merci Denis, parfait comme toujours. De plus, l'écriture est plus
claire et élégante.
Puis-je abuser, stp, en te demandant pourquoi les données sont bien
recopiées à partir de la cellule A2, et non A1 ?
Sheets("Feuil2").Range("A1").Resize(i).Value =
WorksheetFunction.Transpose(mesdonnees)

Bonne journée à tous
Steph D.
Avatar
michdenis
Bonjour Steph,

les 2 procédures proposées sur ce fil fonctionne très bien. Si tu as une difficulté particulière, il faudra que tu sois plus
explicite dans tes explications.


Salutations!


"DesseJ" a écrit dans le message de news:
Bonjour,

Merci Denis, parfait comme toujours. De plus, l'écriture est plus
claire et élégante.
Puis-je abuser, stp, en te demandant pourquoi les données sont bien
recopiées à partir de la cellule A2, et non A1 ?
Sheets("Feuil2").Range("A1").Resize(i).Value WorksheetFunction.Transpose(mesdonnees)

Bonne journée à tous
Steph D.
Avatar
DesseJ
Re-bonjour Denis,

Autant pour moi, j'avais testé tes procédures en ajoutant, en début
de procédure après la déclaration des variables, un i = 1 (je
pensais qu'il fallait toujours initialiser les variables après
déclaration, un i = 0 aurait suffit bien que ce soit implicite).

Désolé, et merci encore
Steph
Avatar
michdenis
Bonjour Desse,

Pourquoi ceci :

un i = 0

Quand tu déclares le TYPE d'une variable en début de procédure que ce soit par exemple :
i As integer, i As Double, i As long

La valeur de la variable est déjà à zéro. Zéro est à ce type de variable ce que rien ("") est au type String. Pourquoi ajouter une
ligne de code qui n'apporte rien de plus à une procédure. C'est autre chose si la variable n'est pas déclarée, ou, on lui a attribué
le TYPE variant. Dans ce cas, Excel ne sait pas avant que l'on lui attribue une valeur, si c'est une valeur numérique, texte ou un
Array(tableau) et au pis aller, un objet (worksheet, range....)


Salutations!




"DesseJ" a écrit dans le message de news:
Re-bonjour Denis,

Autant pour moi, j'avais testé tes procédures en ajoutant, en début
de procédure après la déclaration des variables, un i = 1 (je
pensais qu'il fallait toujours initialiser les variables après
déclaration, un i = 0 aurait suffit bien que ce soit implicite).

Désolé, et merci encore
Steph
Avatar
DesseJ
Bonjour Denis,

A ta question "Pourquoi ceci un i = 0", je te répondrai simplement que
je ne savais pas, avant tes explications, que le fait de déclarer le
type (integer double ou long) initialisait implicitement la variable à
0, ce qui est un peu honteux.
Comme souvent, par excès de facilité, je boucle ou je gère mes
tableaux en débutant l'indice à 1, c'est vite devenu une très
mauvaise habitude.

Autant la corriger pour s'approcher un peu plus de "l'écriture
parfaite" ;o)))

Merci pour tes réponses. Bonne journée.
Steph D.