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

explications sur tableaux et split

8 réponses
Avatar
Patrick
Hello à toutes zé tous :)

y a t-il qq un ici qui puisse m'expliquer un truc sur lequel j'ai buté, on
me l'a résolu mais je ne comprends pas les lignes 200 et 210 et plus
spécifiquement le split

Avant et après, je les ai écrites tout seul comme un grand mais pour ne pas
embeter mon interlocuteur, je ne lui ai pas demandé ** pas osé :) **
d'expliquer ces lignes.

Je montre le petit XLSM au besoin qui quelqu'un veut le voir , sur dropbox
:)
https://www.dropbox.com/s/2n736b50biuugce/essai%20array.xlsm?dl=0


Merci
ps: j'ai bcp de mal avec les tableaux, donc ici j'ai tenté de compiler les
données qui peuvent être très nombreuses vers le bas et je voulais (pour le
plaisir de la masturbation intellectuelle un peu, comme aurait dit JPS au
temps du MPFE) faire ça avec un dictionnaire :) **et c'est encore plus
difficile si on y ajoute des redim 1 to** ....

alors là je rame, mais je sais péniblement faire jusque la ligne 180, tout
n'est pas perdu :)

commençons par ce code ci:
j'en aurai un autre plus tard à vous faire lire, car là aussi , je rame
sec...


Option Explicit
Sub Regrouper1()
10 Application.ScreenUpdating = False
Dim Ws1, Mnom, Rep, Dest
Dim A, Mondico, I, Clé, C, B, S As Long
Dim Zone, Zone2
Dim Col2, Col3
20 Set Ws1 = Sheets("feuil2")
30 Application.ScreenUpdating = False
40 With Ws1
50 Set Dest = .Range("I15")
60 Set Zone = .Range("zone")
70 A = Zone
80 Set Mondico = CreateObject("Scripting.Dictionary")
90 For I = 1 To UBound(A)
100 Clé = A(I, 1)
110 Col2 = IIf(A(I, 2) = "OUI", A(I, 3), "/")
120 Col3 = IIf(A(I, 4) = "OUI", A(I, 5), "/")
130 Mondico(Clé) = Mondico(Clé) & Col2 & Col3
140 Next I
150 If Mondico.Count = 0 Then Exit Sub
160 .[I14].Resize(Mondico.Count) = Application.Transpose(Mondico.Keys)
170 A = Mondico.Keys ' ARRAY
180 B = Mondico.items
'--------------------------ICI
190 For I = 0 To UBound(A)
'Ici une boucle pour parcourir la clé à la recharge des
informations valides
200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COMPRENDS
SPLIT MAIS PAS LES / SONT ENLEVéS !
'Test validité pour affectation
210 If Split(B(I), "/")(S) <> "" And .Cells(I + 14, 10) = "" Then
.Cells(I + 14, 10).Value = Split(B(I), "/")(S): GoTo passe
220 If Split(B(I), "/")(S) <> " " And .Cells(I + 14, 11) = "" Then
.Cells(I + 14, 11).Value = Split(B(I), "/")(S)
passe:
230 Next S
240 Next I
' -----------------------------------
250 End With
End Sub


Sub Regrouper2() ' ne splitte pas les "/" :( :(
10 Application.ScreenUpdating = False
Dim Ws1, Mnom, Rep, Dest
Dim A, Mondico, I, Clé, C, B, S As Long
Dim Zone, Zone2
Dim Col2, Col3
20 Set Ws1 = Sheets("feuil2")
30 Application.ScreenUpdating = False
40 Range("A1").Select
50 Selection.CurrentRegion.Select
60 Selection.Name = "zone"
70 With Ws1
80 Set Dest = .Range("I15")
90 Set Zone = .Range("zone")
100 A = Zone
110 Set Mondico = CreateObject("Scripting.Dictionary")
120 For I = 1 To UBound(A)
130 Clé = A(I, 1)
140 Col2 = IIf(A(I, 2) = "OUI", A(I, 3), "/")
150 Col3 = IIf(A(I, 4) = "OUI", A(I, 5), "/")
160 Mondico(Clé) = Mondico(Clé) & Col2 & Col3
170 Next I
180 If Mondico.Count = 0 Then Exit Sub
190 .[I14].Resize(Mondico.Count) = Application.Transpose(Mondico.Keys)
200 A = Mondico.Keys ' ARRAY
210 B = Mondico.items
220 For I = 0 To UBound(A)
'Ici une boucle pour parcourir la clé à la recharge des
informations valides
230 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de /
'Test validité pour affectation
240 If Split(B(I), "/")(S) <> "" And .Cells(I + 14, 10) = "" Then
.Cells(I + 14, 10).Value = Split(B(I), "/")(S): GoTo passe
250 If Split(B(I), "/")(S) <> " " And .Cells(I + 14, 11) = "" Then
.Cells(I + 14, 11).Value = Split(B(I), "/")(S)
passe:
260 Next S
270 Next I
280 End With
290 End Sub
End Sub



---
L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast.
http://www.avast.com

8 réponses

Avatar
GL
Le 16/03/2015 21:22, Patrick a écrit :
Hello à toutes zé tous :)

y a t-il qq un ici qui puisse m'expliquer un truc sur lequel j'ai buté, on
me l'a résolu mais je ne comprends pas les lignes 200 et 210 et plus
spécifiquement le split



Il me semble que Split est documenté : c'est le contraire de Join.
Il prend une chaine de caractère (String) et renvoie un tableau
(Variant de type String) après avoir cassé la chaîne aux caractère
donné.

Le caractère délimiteur est éliminé dans l'opération Split.

Mais peut-être que je suis à côté de votre question...

Cdt.


Avant et après, je les ai écrites tout seul comme un grand mais pour ne pas
embeter mon interlocuteur, je ne lui ai pas demandé ** pas osé :) **
d'expliquer ces lignes.

Je montre le petit XLSM au besoin qui quelqu'un veut le voir , sur dropbox
:)
https://www.dropbox.com/s/2n736b50biuugce/essai%20array.xlsm?dl=0


Merci
ps: j'ai bcp de mal avec les tableaux, donc ici j'ai tenté de compiler les
données qui peuvent être très nombreuses vers le bas et je voulais (pour le
plaisir de la masturbation intellectuelle un peu, comme aurait dit JPS au
temps du MPFE) faire ça avec un dictionnaire :) **et c'est encore plus
difficile si on y ajoute des redim 1 to** ....

alors là je rame, mais je sais péniblement faire jusque la ligne 180, tout
n'est pas perdu :)

commençons par ce code ci:
j'en aurai un autre plus tard à vous faire lire, car là aussi , je rame
sec...


Option Explicit
Sub Regrouper1()
10 Application.ScreenUpdating = False
Dim Ws1, Mnom, Rep, Dest
Dim A, Mondico, I, Clé, C, B, S As Long
Dim Zone, Zone2
Dim Col2, Col3
20 Set Ws1 = Sheets("feuil2")
30 Application.ScreenUpdating = False
40 With Ws1
50 Set Dest = .Range("I15")
60 Set Zone = .Range("zone")
70 A = Zone
80 Set Mondico = CreateObject("Scripting.Dictionary")
90 For I = 1 To UBound(A)
100 Clé = A(I, 1)
110 Col2 = IIf(A(I, 2) = "OUI", A(I, 3), "/")
120 Col3 = IIf(A(I, 4) = "OUI", A(I, 5), "/")
130 Mondico(Clé) = Mondico(Clé) & Col2 & Col3
140 Next I
150 If Mondico.Count = 0 Then Exit Sub
160 .[I14].Resize(Mondico.Count) = Application.Transpose(Mondico.Keys)
170 A = Mondico.Keys ' ARRAY
180 B = Mondico.items
'--------------------------ICI
190 For I = 0 To UBound(A)
'Ici une boucle pour parcourir la clé à la recharge des
informations valides
200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COMPRENDS
SPLIT MAIS PAS LES / SONT ENLEVéS !
'Test validité pour affectation
210 If Split(B(I), "/")(S) <> "" And .Cells(I + 14, 10) = "" Then
.Cells(I + 14, 10).Value = Split(B(I), "/")(S): GoTo passe
220 If Split(B(I), "/")(S) <> " " And .Cells(I + 14, 11) = "" Then
.Cells(I + 14, 11).Value = Split(B(I), "/")(S)
passe:
230 Next S
240 Next I
' -----------------------------------
250 End With
End Sub


Sub Regrouper2() ' ne splitte pas les "/" :( :(
10 Application.ScreenUpdating = False
Dim Ws1, Mnom, Rep, Dest
Dim A, Mondico, I, Clé, C, B, S As Long
Dim Zone, Zone2
Dim Col2, Col3
20 Set Ws1 = Sheets("feuil2")
30 Application.ScreenUpdating = False
40 Range("A1").Select
50 Selection.CurrentRegion.Select
60 Selection.Name = "zone"
70 With Ws1
80 Set Dest = .Range("I15")
90 Set Zone = .Range("zone")
100 A = Zone
110 Set Mondico = CreateObject("Scripting.Dictionary")
120 For I = 1 To UBound(A)
130 Clé = A(I, 1)
140 Col2 = IIf(A(I, 2) = "OUI", A(I, 3), "/")
150 Col3 = IIf(A(I, 4) = "OUI", A(I, 5), "/")
160 Mondico(Clé) = Mondico(Clé) & Col2 & Col3
170 Next I
180 If Mondico.Count = 0 Then Exit Sub
190 .[I14].Resize(Mondico.Count) = Application.Transpose(Mondico.Keys)
200 A = Mondico.Keys ' ARRAY
210 B = Mondico.items
220 For I = 0 To UBound(A)
'Ici une boucle pour parcourir la clé à la recharge des
informations valides
230 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de /
'Test validité pour affectation
240 If Split(B(I), "/")(S) <> "" And .Cells(I + 14, 10) = "" Then
.Cells(I + 14, 10).Value = Split(B(I), "/")(S): GoTo passe
250 If Split(B(I), "/")(S) <> " " And .Cells(I + 14, 11) = "" Then
.Cells(I + 14, 11).Value = Split(B(I), "/")(S)
passe:
260 Next S
270 Next I
280 End With
290 End Sub
End Sub



---
L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast.
http://www.avast.com

Avatar
DanielCo
Bonjour,
Les lignes 200 et 210 concernent un dictionnaire, pas "Split". Est-ce
vraiment "Split" qui te pose problème. Dans ce cas, regarde la réponse
de GL. J'ajouterai seulement que "Split peut découper une chaîne en
utilisant un ou plusieurs caractères :
Var = Split("toto***tutu", "***")
donnera :
Var(0) = "toto"
Var(1) = "tutu"
Cordialement.
Daniel
Avatar
Patrick
Oui documenté mais pas pour ça que l'on comprend le code...
merci de la réponse :)

P.


"GL" a écrit dans le message de news:
550757a0$0$3052$
Il me semble que Split est documenté : c'est le contraire de Join.
Il prend une chaine de caractère (String) et renvoie un tableau
(Variant de type String) après avoir cassé la chaîne aux caractère
donné.

Le caractère délimiteur est éliminé dans l'opération Split.

Mais peut-être que je suis à côté de votre question...

Cdt.





---
L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast.
http://www.avast.com
Avatar
Patrick
Merci :)

il y a un split dans ces 2 lignes :)

200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COMPRENDS
SPLIT MAIS PAS LES / SONT ENLEVéS !

c'est sans doute la boucle du for I qui me perturbe et qui me donne un peu
de mal à comprendre :)

en fait autant le dictionnaire que le split me créent des difficultés de
compréhension, et les BONS exemples sont rares et celui ci est court mais
clair , merci Daniel !



"DanielCo" a écrit dans le message de news:
5507eccf$0$3175$
Bonjour,
Les lignes 200 et 210 concernent un dictionnaire, pas "Split". Est-ce
vraiment "Split" qui te pose problème. Dans ce cas, regarde la réponse de
GL. J'ajouterai seulement que "Split peut découper une chaîne en utilisant
un ou plusieurs caractères :
Var = Split("toto***tutu", "***")
donnera :
Var(0) = "toto"
Var(1) = "tutu"
Cordialement.
Daniel





---
L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast.
http://www.avast.com
Avatar
MichD
Bonjour,

Voici un exemple utilisant tableaux et dictionnary.

Pour aller dans le détail du code, il faudrait voir ce que
la plage de cellules contient, et ce que tu cherches à
obtenir comme résultat.

A ) Remarque générale : Un objet "dictionary" est surtout utile
lorsque l'on veut éliminer les doublons. Comme dans mon exemple,
Un test est fait à savoir si une clé particulière existe déjà dans l'objet
"dictionary" dans cette ligne de code : If Not X.Exists(C.Value) Then

L'auteur du code ne fait pas cette distinction...Je m'interroge sur la
nécessité d'utiliser ce type d'objet pour ta procédure...Comme tous
les chemins mènent à Rome, demande une bénédiction... ;-)))

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

'L'objet "dictionary" est plus facile à coder
'si tu ajoutes la référence "Microsoft Scripting Runtime"
'en la cochant dans la liste des références sous le
'menu "outils" de la barre des menus.
'Chaque fois que tu écris le point après la variable X
'tu as droit à une liste déroulante t'affichant les
'propriétés et méthodes du dictionnaire.

'pour cela, tu dois définir le type de variable
'comme dans mon exemple : Dim X As Scripting.Dictionary

Dim X As Scripting.Dictionary
Dim Rg As Range, C As Range
Dim A As Variant, B As Variant

'Créer un objet range que l'on désire évaluer
Set Rg = Worksheets("Feuil1").Range("A1:A10")

'Créer un objet dictionary
Set X = CreateObject("Scripting.dictionary")

'Boucle sur chaque cellule de la plage
For Each C In Rg
'Afin de ne pas ajouter 2 fois la même valeur pour
'les keys du dictionary
If Not X.Exists(C.Value) Then
'ajoute la valeur C au dictionnaire comme Key
'Ajoute l'adresse de la cellule c comme item
'Si tu désires, tu pourrais ajouter le contenu
'de la cellule C comme item
'X.Add C.value, C.value
X.Add C.Value, C.Address
End If
Next

'Pour savoir si le dictionary a des items
If X.Count > 0 Then
'Je place toutes les Keys de l'objet dictionnaire dans
'une variable A, elle est déclarée en début de procédure
'comme variant et après l'exécution de la signe suivante
'A deviendra un tableau rempli des Keys du dictionnaire.
A = Mondico.Keys ' ARRAY
'même chose pour la variable B et le contenu des "items"
'du dictionnaire.
B = Mondico.Items

'Ubound(A) 'Nombre d'items dans le tableau A
For I = 0 To UBound(A)
'Split(B(I), "/") Retourne une variable de type tableau
'Cette variable Tableau contient les chaînes de
'caractères séparées par le caractère "/"
'Si on écrit UBound(Split(B(I), "/")) cela détermine
'le nombre d'éléments que contient le tableau Split(B(I), "/")
'B(I) représente la valeur de l'item du dictionnaire
For S = 1 To UBound(Split(B(I), "/"))
'Reste du code
Next
Next
End If

'une ligne de code comme celle-ci : Split(B(I), "/")(S):
'Split(B(I), "/") représente le tableau
'(S) représente l'index du tableau.

End Sub
'-------------------------------------------------------------------------------
Avatar
DanielCo
A condition de prendre la bonne macro ;-)))
Finalement, est-ce que c'est clair ? N'hésite pas à le dire.
Daniel


Merci :)

il y a un split dans ces 2 lignes :)

200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COMPRENDS
SPLIT MAIS PAS LES / SONT ENLEVéS !

c'est sans doute la boucle du for I qui me perturbe et qui me donne un peu de
mal à comprendre :)

en fait autant le dictionnaire que le split me créent des difficultés de
compréhension, et les BONS exemples sont rares et celui ci est court mais
clair , merci Daniel !



"DanielCo" a écrit dans le message de news:
5507eccf$0$3175$
Bonjour,
Les lignes 200 et 210 concernent un dictionnaire, pas "Split". Est-ce
vraiment "Split" qui te pose problème. Dans ce cas, regarde la réponse de
GL. J'ajouterai seulement que "Split peut découper une chaîne en utilisant
un ou plusieurs caractères :
Var = Split("toto***tutu", "***")
donnera :
Var(0) = "toto"
Var(1) = "tutu"
Cordialement.
Daniel





---
L'absence de virus dans ce courrier electronique a ete verifiee par le
logiciel antivirus Avast.
http://www.avast.com
Avatar
PatrIck
Merci à vous pour ces explications ainsi que celles dans l'autre post (de r des der) :)

Je vais essayer de digérer ça gentiment.... et je reviendrai vers vous si ça ne passe pas.

A très bientôt et encore merci !!


Le mardi 17 mars 2015 19:15:25 UTC+1, DanielCo a écrit :
A condition de prendre la bonne macro ;-)))
Finalement, est-ce que c'est clair ? N'hésite pas à le dire.
Daniel


> Merci :)
>
> il y a un split dans ces 2 lignes :)
>
> 200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COM PRENDS
> SPLIT MAIS PAS LES / SONT ENLEVéS !
>
> c'est sans doute la boucle du for I qui me perturbe et qui me donne un peu de
> mal à comprendre :)
>
> en fait autant le dictionnaire que le split me créent des difficult és de
> compréhension, et les BONS exemples sont rares et celui ci est court mais
> clair , merci Daniel !
>
>
>
> "DanielCo" a écrit dans le message de news:
> 5507eccf$0$3175$
>> Bonjour,
>> Les lignes 200 et 210 concernent un dictionnaire, pas "Split". Est-ce
>> vraiment "Split" qui te pose problème. Dans ce cas, regarde la ré ponse de
>> GL. J'ajouterai seulement que "Split peut découper une chaîne en u tilisant
>> un ou plusieurs caractères :
>> Var = Split("toto***tutu", "***")
>> donnera :
>> Var(0) = "toto"
>> Var(1) = "tutu"
>> Cordialement.
>> Daniel
>
>
>
> ---
> L'absence de virus dans ce courrier electronique a ete verifiee par le
> logiciel antivirus Avast.
> http://www.avast.com
Avatar
patrick
Je vais essayer de trouver un exemple concret (dont une partie vient du
net évidemment) où j'ai fais tourner un code, mais sans tout comprendre
à 100%, donc difficile de le reproduire quand j'en ai besoin sur un
autre type de feuille excel...


Le 18/03/2015 22:03, PatrIck a écrit :
Merci à vous pour ces explications ainsi que celles dans l'autre post (der des der) :)

Je vais essayer de digérer ça gentiment.... et je reviendrai vers vous si ça ne passe pas.

A très bientôt et encore merci !!


Le mardi 17 mars 2015 19:15:25 UTC+1, DanielCo a écrit :
A condition de prendre la bonne macro ;-)))
Finalement, est-ce que c'est clair ? N'hésite pas à le dire.
Daniel


Merci :)

il y a un split dans ces 2 lignes :)

200 For S = 1 To UBound(Split(B(I), "/")) 'Nombre de / JE COMPRENDS
SPLIT MAIS PAS LES / SONT ENLEVéS !

c'est sans doute la boucle du for I qui me perturbe et qui me donne un peu de
mal à comprendre :)

en fait autant le dictionnaire que le split me créent des difficultés de
compréhension, et les BONS exemples sont rares et celui ci est court mais
clair , merci Daniel !



"DanielCo" a écrit dans le message de news:
5507eccf$0$3175$
Bonjour,
Les lignes 200 et 210 concernent un dictionnaire, pas "Split". Est-ce
vraiment "Split" qui te pose problème. Dans ce cas, regarde la réponse de
GL. J'ajouterai seulement que "Split peut découper une chaîne en utilisant
un ou plusieurs caractères :
Var = Split("toto***tutu", "***")
donnera :
Var(0) = "toto"
Var(1) = "tutu"
Cordialement.
Daniel





---
L'absence de virus dans ce courrier electronique a ete verifiee par le
logiciel antivirus Avast.
http://www.avast.com








---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com