mettre un nombre si cellule rempli

  • Initiateur de la discussion mike
  • Date de début
M

mike

Guest
Bonjour à tous,

J'ai un document pour une agence de voyage,
avec des noms sur 3 colonnes B,C,D et et dans les cellules H,I,J ce sont des nombre qui se mettent pour indiquer si c'est 1 personnes qui part, 2 personnes, ou trois personnes dans la meme chambre.

Explication:

dans les colonnes b, c, d j'ai des nom et
dans les colonnes h, i, j je dois mettre des nombres,
alors si b et rempli mettre "1" dans la colonnes h, en restant sur la meme ligne, si "c" et aussi rempli en restant toujours sur la meme ligne je dois mettre "2" dans la colonne "i", et je dois effacer le "1" dans la colonne h, si la colonne "d" et rempli aussi je dois mettre "3" dans la colonne "j", effacer "2" dans la colonne "i" et tout cela en restant sur la meme ligne, et ainsi dessuite sur 300 lignes environs.

j'espère avoir été comprehensible dans mon explication.

merci d'avance pour votre aide

mike
 
J

Jean-Marie

Guest
Bonjour, Mike

dans la cellule de la colonne H mettre la formule =SI(NBVAL(B1:D1)=1;1;0)
dans la cellule de la colonne I mettre la formule =SI(NBVAL(B1:D1)=2;2;0)
dans la cellule de la colonne J mettre la formule =SI(NBVAL(B1:D1)=3;3;0)

Bonne soirée

@+Jean-Marie
 
@

@+Thierry

Guest
Re Mike,

Non pas assez clair !!

Mais bon voilà ce que j'ai imaginé !

Tu saisis en B(x) Papa...
Immédiatement en H(x) il y aura "1"

Puis tu Saisis en C(x) Maman...
Immédiatement en H(x) il n'y aura plus rien et en I(x) il y aura "2"

Puis tu Saisis en D(x) Grand Maman...
Immédiatement en H(x) et I(x) il n'y aura plus rien et en J(x) il y aura "3"

Par contre si tu saisis dans un ordre inverse tu auras un message car sinon c'est l'intégrité du truc qui va pas être au top !

Donc essaies le code ci-dessous dans le private module de la Sheet en question...

Par contre ci Grand Papa se pointe avec le fiston tu es dans la M.... (lol)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim L As Integer, C As Byte
If Not Application.Intersect(Target, Range("B2:D300")) Is Nothing Then

L = Target.Row
C = Target.Column

If C = 2 And Cells(L, 2) <> "" And Cells(L, 3) = "" And Cells(L, 4) = "" Then
Cells(L, 8) = 1: Cells(L, 9) = "": Cells(L, 10) = ""

ElseIf C = 3 And Cells(L, 3) <> "" And Cells(L, 2) <> "" And Cells(L, 4) = "" Then
Cells(L, 8) = "": Cells(L, 9) = 2: Cells(L, 10) = ""

ElseIf C = 4 And Cells(L, 4) <> "" And Cells(L, 2) <> "" And Cells(L, 3) <> "" Then
Cells(L, 8) = "": Cells(L, 9) = "": Cells(L, 10) = 3

Else
MsgBox "Il s'avère que les cellule de B à C ne sont pas toutes remplie correctement"

End If
End If

End Sub



Bon Travail "Mikuriel" !!!

@+Thierry
 
M

mike

Guest
bonjour à tous,

je vous remercie tous pour votre aide.

Thierry ta macro est vraiment très bien et c'est d'elle dont je vais me servir,
mais mon tableau est déjà rempli car je fais un copier d'un document pour le coller dans celui là, et là il y a un hic car si j'ecris les nom ça marche très bien mais si je fais un copier/coller ça ne marche pas.

Est -ce que c'est possible ou pas ?

et si oui ce sera genial,

merci pour tout le temps que tu me cosacres,

@++
 
@

@+Thierry

Guest
Salut Mike, les gens du fil et le Forum...

Le copié collé fonctionne à condition que tu colles dans l'orde de saisie cellule par cellule, et évidemment pas un avec un tableau complet, ce que tu n'avais pas spécifié au départ.

On pourrait trafiquer la macro évènementielle avec le risque de mettre en péril son intégrité... mais étant donné que tu dis que c'est quelque chose de ponctuel, juste pour récupérer un tableau existant... Tu as deux solutions ...

Une première toute simple, tu mixtes les formules qui t'ont été proposées soit ci-dessus par Jean-Marie soit dans Lien supprimé par LaurentTBT.

Ces formules auront l'avantage de mettre à jour la feuille... Puis tu fais un copié/collé "Valeur Seule" sur la plage H2:J300.....Ensuite la Macro évènemetielle gérera la feuille normalement, même en cas de changement dans les plages déjà remplies... Dans cette hypothèse je te conseille la Macro de Laurent qui, elle, permet de compléter des test avec les If si la Colonne B(x) est vide et pas les autres (etc comme je fais par macro), chose que ne fait pas NBVal.

Maintenant la seconde solution, si tu veux tout faire par VBA, il ne faut donc pas traffiquer la macro évènementielle qui est donc prévue pour un "Watching" pendant la saisie. Il faut juste faire tourner une boucle après avoir importé tes données par copié/collé...

Voici une boucle qui analysera tous les cas de figure et te fera une liste des anomalies...

Sub BouclePourCopierColler()
Dim Plage As Range, Cell As Range
Dim CareVide As Integer
Dim Msg As String

Set Plage = Sheets("Feuil1").Range("B2:B300")

For Each Cell In Plage
'Cas cellule B(x) vide => on vide tout:
If IsEmpty(Cell) Then
Range(Cell.Offset(0, 6), Cell.Offset(0, 8)) = ""

'Cas cellule C(x) vide mais pas D(x) => on vide tout
ElseIf IsEmpty(Cell.Offset(0, 1)) And Not IsEmpty(Cell.Offset(0, 2)) Then
Range(Cell.Offset(0, 6), Cell.Offset(0, 8)) = ""
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf

Else

'Une fois les tests faits.... Maintenant on remplit

'Cas Cellule C(x) vide, donc seule B(x) remplie => 1
If IsEmpty(Cell.Offset(0, 1)) Then Cell.Offset(0, 6) = 1

'Cas Cellule D(x) vide, donc seule B(x) et C(x) remplies => 2
If IsEmpty(Cell.Offset(0, 2)) Then Cell.Offset(0, 7) = 2

'Cas Cellule D(x) remplie, et donc B(x) et C(x) remplies => 3
If Not IsEmpty(Cell.Offset(0, 2)) Then Cell.Offset(0, 8) = 3

End If
'ici pour le message only

'Cas cellule B(x) vide mais pas C(x) on Comptabilise l'erreur (déjà vidé par first If)
If IsEmpty(Cell) And Not IsEmpty(Cell.Offset(0, 1)) Then
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf
End If

'Cas cellule B(x) vide mais pas D(x) on Comptabilise l'erreur (déjà vidé par first If)
If IsEmpty(Cell) And Not IsEmpty(Cell.Offset(0, 2)) Then
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf
End If

Next Cell

If CareVide > 0 Then
MsgBox "Des anomalies on été constatées : " & vbCrLf & _
"Nombre de Lignes Comportant des Trous : " & CareVide & vbCrLf & vbCrLf & Msg, vbInformation, "Warning"
End If
End Sub

Grosso Modo, tu pourras être tranquille avec çà... Ensuite la Macro Evènementielle sur Change dans les colonnes B à D prendra le relais.

Bon Dimanche à tous et toutes
@+Thierry

[/i]PS : Pas trop chaud à Amien ?[/i]
 
M

mike

Guest
bonjour thierry,

heu !! je sais pas si j'ai bien tout compris, alors je t'explique comment j'ai fait et tu me dis si c'est ça, parce que là ça marche pas, lol !

alors j'ai fais un copie coller de ta formule et je l'ai mise en dessous de la précédente formule que tu m'a donné, c'est peut-etre pas ça, n'est ce pas ?

et si c'est ça que dois je faire pour que ça marche, car là j'ai fais un copie/coller ça marchait pas, ensuite j'ai fermer et ré-ouvert non plus, rien de nouveau juste toujours pareil, alors que je vois bien dans ta formule que ça à l'air d'etre ok ?

merci thierry de passer du temps sur cele, très sympa de ta part,

bon dimanche,

mike
 
M

mike

Guest
je t'envoie aussi mon tableau pour que tu comprennes mieux, je pense que ce sera plus claire pour toi que des explications à n'en plus finir.

bonne reception et merci,

mike
 

Pièces jointes

  • tableau.zip
    17.4 KB · Affichages: 60
  • tableau.zip
    17.4 KB · Affichages: 63
  • tableau.zip
    17.4 KB · Affichages: 58
@

@+Thierry

Guest
RE et Non !

Je pense que je n'ai pas besoin de regarder ton tableau.zip, enfin pas pour l'erreur que tu décris toi même, et qui semble démontrer que tu n'es pas de nature curieuse .

En effet si je ne précise pas comme auparavant "Donc essaies le code ci-dessous dans le private module de la Sheet en question" je parle de Macro Standard à mettre dans un Module Standard (désolé, je sous-entends tout ce qui est standard, par contre je détaille tout ce qui ne l'est pas)

Donc mets cette macro en Module1 (par exemple) et lance là soit depuis un bouton affecté à cette macro, soit depuis la barre d'outils Visual Basic "Exécuter une Macro..."tu verras que tout marchera correctement.

Bon Travail et bon dimanche
@+Thierry


PS si tu veux t'exprimer correctement dans des milieux informatiques, on ne parle pas de "formule" pour des Code VBA... Mais simplement de Procédure ou de Sub ou encore de Function (si c'est le cas) et au pire on parle en général de Codes (pas de Script non-plus qui sont quant à eux liés au VBScript ou encore Java etc)
 
M

mike

Guest
c'est genial thierry ça marche super bien, sauf que sur quand j'ai qu'une personne une sur la colonne h , les deux colonnes sont rempli h avec 1 et i avec 2, lol!

sinon ta formule est une véritable merveille, félicitation, clap,clap,clap

@++
mike

PS: je t'ai laissé un message avec une piece jointe dans l'autre fil tu l'as vu ?
 
@

@+Thierry

Guest
Re Mike, le Fil et le Forum

Bon alors j'ai tout repris dans ton fichier...

Tu as un Module "GeneralPublicInfo" qui contient des variables publiques qui permettront une maintenance aisée de ce programme...

J'ai trouvé bien plus grave que le 1 en "H" et le 2 en "J" en effet l'adjonction de la macro évènementielle sur l'évènement Change de la Feuille risque de faire perdre son latin à ton User (En fonction de ce qui à été rempli ou pas dans la plage, faut répondre 600 fois à la Message Box ""Il s'avère que les cellule de B à C ne sont pas toutes remplies correctement", risque de pas être très content ton User !! (lol) Je gère ce problème par une Public Variable Boolean "TriActif" et si elle "True" l'évènementielle est copurt-circuitée.

Sinon j'ai aussi retravaillé un peu partout, et j'ai donc solutionné ton problème que tu as sité, en effet c'était une erreur de programmation car mes If s'enchainaient et par conséquent ils 's'écrasaient les uns aux autres" d'où cette erreur, gérée maintenant par un Label GoTo Suite...

Enfin voilà, donc grace à Michel et maintenant ma contribution, ton appli peut voir le jour sous de meilleurs hospices... Quoique attention, maintenant que je vois le but final, il aurait été bien plus judicieux de tout faire par un Méga UserForm, qui gérerait absolument tout, car tel que c'est maintenant ce n'est qu'une mise bout à bout de petits codes qui forment une sorte de mini Usine à Gaz et où il risque encore d'y avoir des surprises ou carrément des bugs...

Bon Travail
@+Thierry
 

Pièces jointes

  • XLD-corrected-tableau.zip
    22.8 KB · Affichages: 43
M

mike

Guest
vraiment merci thierry, pour ce travail, c'est parfait, je fais des test et si il y a un bug je reviendrai vous voir.

je vais pouvoir profiter de cette fin de week-end, grace à vous tous,

alors je vais me répéter mes je remercie:

Jean-marie
LaurentBT

et puis pour ceux qui m'ont donner la structure, un remerciement tout spécial,

Arnaud
Michel

et pour le bouquet final,

Thierry

en esperant avoir oublié personne,

bon dimanche
et à bientot

mike
 
@

@+Thierry

Guest
Re

Donc oui j'ai vu ton message dans ce Lien supprimé et je t'y ai répondu.

De toute façon, le fichier ci-dessus gère aussi ce problème.

Par contre toi, as-tu vu/lu mon PS du 10-08-03 12:07, car à 12:33 tu me parles toujours de Formule...

Bon Dimanche Aprèm
@+Thierry
 
M

mike

Guest
bonsoir thierry,

desolée de ne pas avoir répondu à ton message avant, mais le virus msblaster m'a occupé toute la semaine, alors oui j'ai bien vu tous les messages sur les 2 fils, et je te remercie pour tout.
je n'ai pas eu le temps de faire tout les test, mais au premier abord cela à l'air d'être parfait.

Encore merci pour ta précieuse aide, et à bientôt,

mike
 
M

mike

Guest
bonjour thierry les gens du fil et le Forum,

J'ai essayé par moi meme et en regardant dans le forum mais je n'ai pas réussi à trouver la solution, trop nul, je suis vraiment trop nul en VBA...
Voilà dans le fichier ci-joint j'ai une macro avec "chercher et inserer un nom" mais je cherche à faire un bouton suplémentaire qui fait juste "inserer un nom" sans la fonction "rechercher".

d'avance merci pour votre aide à tous,

mike
 

Discussions similaires

Statistiques des forums

Discussions
312 681
Messages
2 090 882
Membres
104 686
dernier inscrit
obi009