IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Besoin d'aide pour comprendre un test dans un IF


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Besoin d'aide pour comprendre un test dans un IF
    Bonjours,
    J'ai une application qui sert à vérifier si des salles sont disponibles pour faire des réunions en fonction d'une date et d'un horaire.
    Elle sert aussi à voir si des video projecteurs sont disponibles.

    je voudrais créer une fonction qui test si le video-projecteur est disponible ou pas. L'ancien programmeur avait créé une fonction qui permettait de vérifier si les salles etaient vides.

    La voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Function isFree(ByVal pStartCol As String, ByVal pStartRow As Integer, ByVal pEndCol As String, ByVal pEndRow As Integer, pFile As String, pSheet As String) As Boolean
     
    Dim free As Boolean
     
    free = True
        While (pStartCol <> pEndCol Or pStartRow <> pEndRow) And free = True
            If (Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex > 0 _
            And Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex <> 2 _
            And Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex <> 15) _
            Then
                free = False
            Else
                pStartCol = nextCol(pStartCol)
                If (pStartCol = "B") Then
                    pStartRow = pStartRow + 1
                End If
            End If
        Wend    
     
        isFree = free    
     
    End Function
    Il faudrait donc que je réutilise ce code et que je l'adapte. Cependant, ne connaissant pas grand choses au VBA 2003 (je suis étudiant en deuxième année de BTS et que je n'ai appris que le VB.NET) je ne comprend pas trés bien le test dans le IF. Quelqu'un pourrait-il m'éclairer sur la question?

    Au passage, je souhaiterais faire en sorte que dans une colonne il soit impossible de marquer autre chose que des x, est-ce possible à réaliser ?

    Enfin comment fait-on pour tester, dans cette meme colonne, s'il y a de x ou que la case est vide. Il faudrait au moins tester si la case est remplie ou pas.

    Merci d'avance.
      0  0

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut dante33 te le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Function isFree(ByVal pStartCol As String, ByVal pStartRow As Integer, ByVal pEndCol As String, ByVal pEndRow As Integer, pFile As String, pSheet As String) As Boolean
    Dim free As Boolean    '=> logique
    'pStartCol  => texte    => colonne de début
    'pStartRow  => entier   => ligne de début
    'pEndCol    => texte    => colonne de fin
    'pEndRow    => entier   => ligne de fin
    'pFile      => texte    => nom fichier
    'pSheet     => texte    => nom feuille
    Application.Volatile
    'recalcule la fonction à chaque calcul de la feuille
    free = True
    'free = Vrai
    While (pStartCol <> pEndCol Or pStartRow <> pEndRow) And free = True
    'tant que ni la ligne de fin, ni la colonne de fin ne sont atteiente et que free=vrai
        If (Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex > 0 _
        And Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex <> 2 _
        And Workbooks(pFile).Sheets(pSheet).Range(pStartCol & pStartRow).Cells.Interior.ColorIndex <> 15) _
        Then
        'si dans le fichier(pfile) dans la feuille(psheet)
        'la couleur de la cellule est blanche ou grise (à moins que ce ne soit pas la palette d'origine)
        'alors
            free = False
            'free=faux
        Else
        'sinon
            pStartCol = nextCol(pStartCol)
            'colonne suivante
            If (pStartCol = "B") Then
            'si la colonne de départ est "B", alors (???)
                pStartRow = pStartRow + 1
                'on change de ligne (suivante)
            End If
        End If
    Wend
    'remonter au test de boucle
    isFree = free
    'la réponse = free
     
    End Function
    c'est ta fonction avec des commentaires
    Volatile permet que la fonction se recalcule automatiquement, comme les autres fonctions d'origine dans Excel (somme, etc...)

    Comme on a comme indication que la fonction, je ne peux pas aller beaucoup plus loin. Mais quelques réflexions sur son fonctionnement :

    - comme du passe à la colonne suivante par une autre fonction (nextcol), je suppose que celle-ci te pose des problème : Ne la connaissant pas, je ne peux que supposer que son but est de boucler sur la première colonne quand on atteint la dernière. C'est ce qui me semblerait le plus logique, mais dans ce cas, il manque des arguments : au moins celui de la dernière colonne a être prsie en compte.

    - la syntaxe de la condition de la boucle m'embête : elle est difficilement interprétable pour un néophyte :
    elle boucle jusqu'à ce que free soit Faux ou que la dernière ligne de la dernière colonne soit atteinte. Je préfère cette formulation à
    elle boucle tant que, la colonne est différente de la dernière ou que la ligne et différente de la dernière, et que free est à vrai
    Je préfère la condition de sortie plutot que la condition de non sortie

    Il faudrait donc que je réutilise ce code et que je l'adapte. Cependant, ne connaissant pas grand choses au VBA 2003 (je suis étudiant en deuxième année de BTS et que je n'ai appris que le VB.NET)
    Si tu veux donner des informations, qu'elles soient précises et que ça nous serve : 2me année de BTS menuisier n'a pas la même résonnance (ici) qu'en informatique (mais je chipote hein !!)

    Au passage, je souhaiterais faire en sorte que dans une colonne il soit impossible de marquer autre chose que des x, est-ce possible à réaliser ?
    tu peux le faire par macro, mais plus simplement avec :
    tu sélectionnes les cellules concernées et
    Menu Données>>Validation>>Onglet options
    Autoriser : liste
    Ignorer si vide : coché
    Source : x

    Enfin comment fait-on pour tester, dans cette meme colonne, s'il y a de x ou que la case est vide. Il faudrait au moins tester si la case est remplie ou pas.
    if isempty(range("A1")) then
    si A1 est vide alors

    A+
      0  0

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/05/2014, 13h04
  2. Réponses: 7
    Dernier message: 04/01/2013, 16h25
  3. Réponses: 3
    Dernier message: 05/12/2005, 02h30
  4. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo