blocage sous vba excel

blocage sous vba excel - VB/VBA/VBS - Programmation

Marsh Posté le 19-02-2004 à 23:13:04    

bonjour, je programme une application vba sous excel et je bloque...  
 
j'ai une 1ere feuille (résa) dans laquelle j'ai une date de début et une date de fin, avec le nb de jours entre les 2 calculé automatiquement  
 
et une 2nde feuille (planning) avec :  
- toutes les dates (de 01/01/2004 à 31/12/2050) dans la 1ere colonne à partir de la 4eme ligne  
-sur la 3°ligne à partir de la 2°colonne, des immatriculations  
 
et je dois écrire une macro qui , lorsque les dates de début et date de fin sont saisies et le nb de jours calculés, va voir dans la feuille planning à la ligne de la date début, dans la 2°colonne (1ere immatriculation), regarde si la cellule est vide. si elle est vide, elle doit vérifier si les n cellules en dessous le sont aussi. Si non, elle doit se repositionner sur la ligne de la date début, dans la 3°colonne (2°immatriculation) et refaire le mm controle.  
tant qu'elle n'a pas trouvé de colonne où toutes les cellules entre date de début et date de fin sont libres, elle passe à la colonne suivante.  
Lorsqu'elle en a trouvé une, elle doit renvoyer le numéro d'immatriculation correspodant, qui se trouve à la ligne 3 de la colonne avec laquelle ca marche  
enfin, elle doit écrire cette immatriculation dans une cellule de ma feuille réservation....  
 
au secour !!!

Reply

Marsh Posté le 19-02-2004 à 23:13:04   

Reply

Marsh Posté le 20-02-2004 à 05:32:57    

Bonjour,
 
Un debut d'aide (y a beaucoup de varaiables, mais je trouve le code plus clair avec):
 
Sub analysis()
Dim nb_columns_to_analyze, fin, i, date_debut, _
date_fin, lgn1, lgn2, col, j As Integer
 
'<<<Indique le nombre de column dans la feuille 2 a partir desquelles
'il faut trouver le numero d'immatriculation>>>
nb_columns_to_analyze = 3
 
'<<<trouve le nombre de date qu'il faut analyser>>>
fin = Sheets(1).Cells(1, 1).CurrentRegion.Rows.Count
 
'<<<Commence la boucle pour analyser toutes les dates de la feuille 1>>>
For i = 1 To fin
 
'<<<Valeur de la date de debut>>>
date_debut = Sheets(1).Cells(i, 1).Value
 
'<<<Valeur de la date de fin>>>
date_fin = Sheets(1).Cells(i, 2).Value
 
'<<<Recherche dans la feuille 2 la ligne correposndant a la date...
With Sheets(2)
With .Columns(1)
 
'... de debut>>>
lgn1 = .Find(date_debut).Row
 
'... de fin>>>
lgn2 = .Find(date_fin).Row
End With
 
'<<<Nombre de colonne dans la feuille 2 a analyser>>>
For col = 2 To 1 + nb_columns_to_analyze
 
'<<<Intervalle (en ligne) dans lequel il faut faire le test>>>
For j = lgn1 To lgn2
 
'<<<Si la cellule n'est pas vide>>>
If Not IsEmpty(.Cells(j, col)) Then
 
'<<<Alors la valeur de la cellule correspondant a la colonne a analyser
' et a la ligne 3 est copie dans la feuille 1 (colonne 4)>>>
Sheets(1).Cells(i, 4).Value = .Cells(3, col).Value
End If
Next
Next
End With
Next
End Sub
 
Bon courage
 
I.

Reply

Marsh Posté le 20-02-2004 à 12:32:27    

merci beaucoup pour votre réponse .... mais je dois avouer que je n'y comprend rien !
il y a plein de termes que je ne comprend pas très bien, comme
fin = Sheets(1).Cells(1, 1).CurrentRegion.Rows.Count  
ou les .value et les .row
c'est la première fois que je fais de la programmation, et je n'ai pas le vocabulaire de base ...
 
pouvez vous m'expliquer ces 3 termes ?
 
merci encore
 
A

Reply

Marsh Posté le 20-02-2004 à 12:53:19    

Bonjour,
 
Currentregion: A partir de la cellule selectionnee, ca determine un range, qui est limite par a droite et a gauche une colonne vide, et en bas et en haut, une ligne vide.
 
Par exemple j'ai dans ma feuille les cellule B2, C3, D4 qui sont remplis, et les autres vides. quelles sont les ligne et les colonne entierement vide qui borde la cellule a B2 ?
La ligne A est vide, la colonne 1 est vide (ca determine ainsi mes limite haute et gauche), et la colonne E, et la ligne 5 sont vide, ca determine mes limite basse et droite.
Ainsi la range de cells(2, 2).currentregion sera : "B2:D4"
C'est utile pour rentrer des enregistrement les un a la suites des autres.
 
.value = correspond a la valeur de ta cellule. SI en b3 tu rentre le text "Bonjour", la formule cells(3, 2).value te donnera "Bonjour"
 
.row: c'est le numero de la ligne de la cellule correspondante. Ainsi B3 aura comme numero de ligne : 3
 
.rows: c'est le nombre de ligne de la selection.
 
En combinant currentregion and rows, tu peux avoir la ligne dans laquelle tu dois ecrire ton provhain enregistrement.
 
Si on reprend l'exemple ci dessus (b2, c3, d4), un cells(2, 2).currentregion.rows.count donnera 3 (ligne 2, 3 et 4).
 
Lit l'aide de microsoft, je la trouve tres bien faite, et nettement plus clair que mes explications incomprehensibles...
 
I.

Reply

Marsh Posté le 20-02-2004 à 14:21:56    

tes explications "incompréhensibles" :pt1cable:  m'ont qd mm donné quelques pistes ! (car je n'ai pas l'aide microsoft visual basic ....)
 
dans mon cas, en fait il faudrait que je fasse un :
while cells(L,c).currentregion.rows.count<L  
 c=c+1
 wend  
 ????
 avec dim l as integer (l étant le nombre de jours de location)
 et dim c as interger (c étant la colonne, qui commence à 1)
 
 c'est à dire vérifier que tant que le currentregion.... est inférieur à mon nombre de jours de location, ca refait le currentregion... sur la colonne suivante ?
 
j'ai écrit le programme suivant, mais ca ne marche pas ...  
(sachant que lorsque je lance le programme, je suis sur ma feuille réservation, dans la cellule numéros de réservation ( colonne1)  et que la feuille dispo cat A est la feuille sur laquelle figurent les dates dans la colonne 1 et les immatriculations en ligne)
 
Sub cchedateA()
    Dim daterés As Date
    daterés = ActiveCell.Offset(0, 2)
    Sheets("dispo cat A" ).Select
    Range("a4" ).Select
    While ActiveCell <> daterés
    ActiveCell.Offset(1, 0).Select
    Wend
End Sub
 
Sub verifdispoA()
    Dim nbjloc As Variant
    nbjloc = ActiveCell.Offset(0, 15)
    Dim n As Variant
    voit = 1
         
    Application.Run "cchedateA"
     
    While Cells(nbjloc, voit).CurrentRegion.Rows.Count < nbjloc
    voit = voit + 1
        If Cells(nbjloc, voit).CurrentRegion.Rows.Count = nbjloc Then
        ActiveCell.Offset(0, 3).Formula = "ok"
        End If
         
    Wend
     
end sub
 
 
et ca bug à la ligne en rouge, en me mettant "erreur d'exceution 1004" erreur definie par l'application ou par l'objet
 
c'est parce que ma variable nbjloc n'est pas comparable avec le résultat de Cells(nbjloc, voit).CurrentRegion.Rows.Count ?
 
 
PS, dis moi si ca t'embete que je te pose toutes ces questions !

Reply

Marsh Posté le 20-02-2004 à 15:52:31    

un ptit bouquin très utile : Master pro VBA Excel 2000
voir sur www.editions-eni.com

Reply

Marsh Posté le 23-02-2004 à 08:38:29    

Bonjour,
 
Defini correctement les informations que tu veux:
A la place de  
- daterés = ActiveCell.Offset(0, 2),
mets daterés = ActiveCell.Offset(0, 2).value
 
- et pour nbjloc, quelle est l'information que tu cherche a avoir (je suppose le numero de la ligne), donc dans ce cas, il faut que tu mettes
nbjloc = ActiveCell.Offset(0, 15).row
Si ce n'est pas le numero de la ligne, verifies que le contenu de la cellule n'est pas vide, ou qu'il ne contient pas autre chose qu'un numero. D'ailleur tu ne devrais pas definir nbjloc  comme variant, mais plutot comme integer.
 
De plus je ne comprend pas tres bien le fonctionnemt de tes procedures.
 
Quel est le rapport entre nbjloc (qui est le contenu d'une cellule) et Cells(nbjloc, voit).CurrentRegion.Rows.Count  ?
 
Et ca me semble bien risquer de jouer avec les activecell et non pas des cellules bien definie par ton programme.
 
Si tu veux tu peux m'envoyer un petit bout de ton fichier que je me fasse une meilleur idee (je n'ai pas beaucoup de temps pour essayer de comprendre sa structure).
 
I.
 
PS: sinon ca ne m'embete pas de repondre a tes questions, si mes fautes d'orthographe ne te deranges pas trop. Vive le partage de connaissance ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed