Se connecter / S'enregistrer
Votre question

VBA, tri selon une variable de nombre impair ou pair.

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
3 Avril 2006 11:35:06

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.

Autres pages sur : vba tri variable nombre impair pair

3 Avril 2006 15:00:28

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.
4 Avril 2006 08:54:49

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.
4 Avril 2006 09:24:33

re,

quelle est la liste complete des regles qui permettent de trier les numéros ?
4 Avril 2006 10:34:23

Lol LeGhola, cest compliquer ton systeme de repere pair impair je trouve.

Tu peux faire tout simplement:

if (valeur % 2)
impair
else
pair
4 Avril 2006 10:45:00

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.
4 Avril 2006 10:50:55

Jai fait juste un modulo, niveau 6 ou 5eme cest pas tres compliquer meme pour un novice en prog.
4 Avril 2006 11:35:58

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-)

++
4 Avril 2006 11:40:24

Cest vrai que jai pas mit dexplication lol, desoler.
4 Avril 2006 15:59:43

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.


4 Avril 2006 16:38:28

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 ;) 
4 Avril 2006 17:01:58

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.
4 Avril 2006 17:07:27

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
4 Avril 2006 17:25:19

la fonction MOD n'est pas reconnue par VBA.... :-(
4 Avril 2006 17:34:14

Utilise lautre systeme proposer alors.
Il est plus lourd mais marche tous aussi bien.
4 Avril 2006 17:34:41

Si, la fonction Mod est reconnu par VBA:
  1. result = number1 Mod number2


si ça marche pas chez toi, dis-nous comment tu écris ton code avec la fonction Mod
5 Avril 2006 09:46:10

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
5 Avril 2006 12:09:57

De rien ;)  .
5 Avril 2006 13:41:03

ca fait plaisir de voir quelqu'un dire merci !! :) 

Si autre probleme , contacte nous :D 
(en plus ca nous donnera une occasion de plus de nous chamailler sur les techniques a employer ! ;-))

++

Nico.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS