VBA, tri selon une variable de nombre impair ou pair.
Forum Programmation : VBA, tri selon une variable de nombre impair ou pair.
Bonjour,
je suis actuellement en stage pour mon IUT de stats, et j'ai desoin de faire un petit progr sur VBA pour trier une variabel. Le but est d'attribuer un nombre à une variable (perimetre) selon le nombre d'une autre variable (identifiant rue).
Pour une rue, le coté pair est dans un secteur et le coté impair dans un autre, j'aimerais savoir comment faire pour distinguer ca? c'est pas tres clair hein?
voici un petit bout de mon programme simple :
Sub TriRuesBdDcomplete()
Dim i As Variant
For i = 2 To 1958
Select Case Cells(i, 20)
Case 1, 2, 16, 17, 20, 21, 22, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45, 48, 49, 53, 104, 106, 108, 111, 112, 113, 115, 116, 123, 125, 126, 128, 131, 132, 133, 136, 137, 143, 146, 147, 148, 150, 217, 219, 236, 241, 248, 251, 258, 262, 263, 264, 267, 272, 277, 278, 281, 288, 290, 291, 293, 294, 296, 301, 302, 304, 305, 306, 308, 309, 313, 316
Cells(i, 21) = 1
Case 4, 5, 6, 7, 9, 10, 11, 13
Cells(i, 21) = 2
Case 14, 172, 212, 213, 214, 218, 220, 221, 224, 225, 229, 230, 231, 232, 233, 234, 237, 238
Cells(i, 21) = 3
Case 152, 153, 154, 155, 158, 159, 162, 167, 168, 169, 170, 175, 181, 183, 184, 186, 192, 193, 196, 199, 201, 204, 206, 208, 242, 244, 252, 255, 269, 274, 275, 299, 303, 314, 315, 323, 324
Cells(i, 21) = 4
Case 156, 157, 160, 161, 163, 164, 165, 166, 171, 173, 174, 176, 177, 178, 179, 180, 182, 185, 187, 188, 189, 191, 194, 195, 197, 198, 202, 203, 205, 207, 209, 210, 215, 222, 228, 321, 322
Cells(i, 21) = 5
Case 105, 107, 109, 114, 117, 118, 119, 120, 121, 122, 124, 127, 129, 130, 134, 135, 138, 139, 141, 142, 144, 145, 149, 151, 318, 320
Cells(i, 21) = 6
Case 200, 226, 227, 239, 242, 244, 247, 249, 252, 254, 255, 260, 261, 268, 269, 274, 275, 276, 281, 283, 285, 287, 289, 295, 297, 299, 303, 310, 311, 312, 317, 324
Cells(i, 21) = 7
Case 18, 23, 26, 27, 37, 39, 41, 42, 43, 44, 46, 47, 51, 52, 55, 57, 60, 64, 67, 69, 70, 71, 75, 76, 77, 79, 80, 82, 94, 99, 250, 256, 265, 266, 273, 286, 298, 307, 325
Cells(i, 21) = 8
Case 3, 54, 56, 58, 59, 61, 62, 65, 66, 68, 72, 73, 74, 78, 81, 83, 85, 86, 87, 88, 91, 92, 93, 95, 96, 97, 100, 101, 102, 103, 243, 246
Cells(i, 21) = 9
Case 140
If Cells(i, 12) <= 11 Then
Cells(i, 21) = 1
ElseIf Cells(i, 12) = 12 Then
Cells(i, 21) = 1
ElseIf Cells(i, 12) = 14 Then
Cells(i, 21) = 1
ElseIf Cells(i, 12) = 16 Then
Cells(i, 21) = 1
Else: Cells(i, 21) = 6
End If
(......)
la "cells(i,12)" est l'identifiant de la rue, et la "cells(i,21)" la case ou sera inscrit l'identifiant du perimetre. La rue posant probleme porte l'identifiant 235 "case 235..." et voilà les données :
IDrue de 1 a 15 -> perimetre 7
ID rue de 24 a 9999 (nb uniquement pairs) -> perimetre 5
IDrue de 61 à 127(nb uniquement impairs) -> perimetre 3
Je sais pas si je suis tres clair, mais si vous avez compris pourriez vous m'apporter une reponse le plus vite possible svp? Ce serait meme fantastique si vous pouviez me repondre directement sur mon adresse mail "alexandre_heran@yahoo.fr"
Merci d'avance.
arf, heu je comprends pas ton probleme ..
si c'est pour différencier un valeur paire ou impair :
if valeur = round((valeur/2),0) * 2 then
valeur est pair
else
valeur est impaire
endif
je m'explique :
je prends la valeur, je la divise par deux, je l'arrondi sans virgule, et je la remultiplie par 2 ...
si c'est une valeur paire, je retombe sur ma valeur de base sinon, y'a différence.
ex : 5 / 2 = 2.5 donc arrondi a 2 ... 2 * 2 = 4 .. 4 <>5 donc 5 est impair.
++
Nico.
Merci beaucoup d’avoir pris le temps de me repondre, sinon, ce n’est pas exactement ca mais prenons un exemple :
Vous avez une rue (identifiant « 235 ») et 2 secteurs (perimetres) geographiques (un de chaque coté de la rue), ainsi qu’une base de donnée des gens qui habitent cette rue. Si les gens habitent du coté impair de la rue, ils sont administrativement dans le secteur A, et s’ils habitent du coté pair ils sont administrativment dans le secteur B. Le but du jeu est donc de trier à l’aide d’un petit programme les gens selon s’ils sont dans le secteur A ou B dans la colonne perimetre (dans la colonne perimetre il sera indiquer A ou B en face de chaque nom de famille et de leur adresse).
Je pense avoir mieux expliqué le probleme, j’espere que vous prendrez le temps de me repondre.
Merci.
re,
quelle est la liste complete des regles qui permettent de trier les numéros ?
Lol LeGhola, cest compliquer ton systeme de repere pair impair je trouve.
Tu peux faire tout simplement:
if (valeur % 2)
impair
else
pair
J'ai fait un algo complet (complexe aussi) pour qu'un débutant informatique retrouve ses petits...
J'aurai tres bien put utiliser un simple
if rest(valeur/2) = 0 then
pair
else
impair
end if
La première loi du programmeur :
Se mettre a la portée de l'utilisateur.
++
Nico.
Jai fait juste un modulo, niveau 6 ou 5eme cest pas tres compliquer meme pour un novice en prog.
Et c'est quel langage ton modulo ? car en vba c'est "mod"..
Le pauvre va pas comprendre ta phrase (même si elle est correcte et pertinente
) car pas d'explication (perso je savais pas que % correspondait a modulo) et mauvais langage (ou sinon donne moi la version
)
Sans rancune . 8-)
++
Cest vrai que jai pas mit dexplication lol, desoler.
Merci de vous soucier de mon cas. Je vais vous présenter les choses simplement en esperant que vous pourrez m'apporter une réponse.
Je simplifie ma base de donnée au maximum :
j'ai donc:
-une colonne "idrue" ou est inscrit l'identifiant de la rue (ex: "235" dans mon cas qui pose probleme)
-une colonne "numRue" qui est LE NUMERO DE L'ADRESSE de la personne (ex:"29" si la personne habite le "29 de la rue 235" -> ex:29 rue St Jean))
-une colonne "perimetre" vide, c'est le but du ptit progr de remplir cette colonne avec le numero du perimetre correspondant au bon coté de la rue.
probleme :
-si "numRue" de la rue "235" est un nombre IMPAIR compris entre 61 et 127, le progr inscrit "3" dans la case "perimetre".
-si "numRue" de la rue "235" est IMPAIR et compris entre 135 et 9999 -> perimetre 4
-si "numRue" de la rue "235" est un nombre PAIR entre -> perimetre 5
Avez vous compris? j'espere que j'embrouille pas trop vos esprits...
je pense que si vous comparez au bout du progr qque je vous ai mis la haut vous allez comprendre(ce qu'il y a derriere "case" est la colonne "idrue",la colonne 12 est "numRue" et la colonne 21 est "perimetre" ).
Je sais que je suis chiant mais je vous serais vraiment reconnaissant de m'aider car il faut que j'avance dans mon stage et ce point me bloque pour la suite.
Merci.
Normalement avec une batterie de if sa devrai coller lol.
Avec la solution que lon a ta donner pour les pair/impair sa devrai coller.
Tu nous a donner ton 'algo' tu es donc capable de le faire
donc première chose tu cherches si ton n° est pair ou impair
=> Fonction MOD dans VBA
seconde chose fait toi une table de correspondance :
TYPE / MINI / MAXI / PERIMETRE
IMPAIR / 61 / 127 / 3
IMPAIR / 135 / 9999 / 4
PAIR / 1 / 9999 / 5
Il suffit de tester ensuite ou on se trouve et tu as ton périmètre
dis moi si tu veux plus d'explications
++
Nico.
merci, je vais tester avec MOD. Euh sinon en effet jai reussi a faire mon algo pour les autres rues mais comme tu dis il me faudrait ici une veritable batterie de "if" ce qui rendait la chose impossible!
merci bcp d'avoir pris le temps de me repondre. :-D
la fonction MOD n'est pas reconnue par VBA.... :-(
Utilise lautre systeme proposer alors.
Il est plus lourd mais marche tous aussi bien.
Si, la fonction Mod est reconnu par VBA:
Code :
|
si ça marche pas chez toi, dis-nous comment tu écris ton code avec la fonction Mod
AYYYAIIIIII!!!! merci tout le monde, ca marche.
voilà ce que ca donne:
Case 235
If Cells(i, 8) <= 15 Then
Cells(i, 19) = 7
ElseIf ((0 <> Cells(i, 8) Mod 2) And (61 <= Cells(i, 8) <= 127)) Then
Cells(i, 19) = 3
ElseIf ((0 = Cells(i, 8) Mod 2) And (Cells(i, 8) >= 24)) Then
Cells(i, 19) = 5
ElseIf ((0 <> Cells(i, 8) Mod 2) And (Cells(i, 8) >= 135)) Then
Cells(i, 19) = 4
ElseIf ((0 = Cells(i, 8) Mod 2) And (14 <= Cells(i, 8) <= 22)) Then
Cells(i, 19) = 3
End If
merci, j'aurais pas trouver tout seul.... :-D ;-) :-D :-D
De rien
.
ca fait plaisir de voir quelqu'un dire merci !!
Si autre probleme , contacte nous
(en plus ca nous donnera une occasion de plus de nous chamailler sur les techniques a employer ! ;-))
++
Nico.
Il y a 479 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
