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 :

VBA : Appel de fonctions


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Par défaut VBA : Appel de fonctions
    Bonjour,

    Je suis débutant sur Visual Basic et je recontre quelques problèmes dans l'exécution de mon code.
    En fait, je fais appel à une fonction dans une boucle (do while) et pendant la compilation, on me renvoit le message d'erreur suivant : "type d'argument byref incompatible". La fonction est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recherche ( Cells (1,i).Value as double, ffseq as WorkSheet) as integer
    (la fonction est sensé renvoyer un numéro de ligne).

    Si il y a déjà un problème à ce niveau là, merci de m'éclairer et pour les plus courageux, voici le code un peu plus en détail :

    Le principe est le suivant : à partir d'une première base de données, je dois créer une moulinette pour organiser la base de donnée d'une façon différente (plus claire on va dire). La base de donnée initiale est appelée "fi" (avec MaxLignefi, je pense que c'est explicite), j'utilise une feuille "fv" pour feuille variable et la base de donnée finale est appelé ffseq.
    La procédure n'a pour but que de détruire les lignes vides. Pour cela, elle fait appel à une fonction qui cherche la prochaine cellule non vide d'une colonne et qui renvoie le numéro de la ligne.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Function ProchaineCelluleNonVide_Colonne(Initialisation As Integer, Colonne As Integer, TableauUtilise As Worksheet) As Integer
     
    Dim n As Integer
    Dim MaxLigne As Integer
     
    MaxLigne = Range("A65536").End(xlUp).Row
     
    n = Initialisation
     
    While n < MaxLigne And TableauUtilise.Cells(n, Colonne).Value = ""
     
        n = n + 1
     
    Wend
     
        ProchaineCelluleNonVide_Colonne = n
     
    End Function
     
     
    Sub DetruireLigneVide()
     
    Dim ffseq As Worksheet
    Dim i, L As Integer
    Dim MaxLigne, MaxColonne As Integer
     
    Set ffseq = Worksheets("Base_finale")
    ffseq.Activate
     
    MaxLigne = Range("A65536").End(xlUp).Row
    MaxColonne = ffseq.UsedRange.Columns.Count
     
    i = 5
     
    Do While i < MaxLigne
     
        i = i + 1
     
        If Cells(i, 1) <> "" Then
     
        L = ProchaineCelluleNonVide_Colonne(i, 1, ffseq)
     
            If L = i Then
     
                i = i + 1
     
            Else
     
                Range(Cells(i, 1), Cells(L - 1, MaxColonne)).Delete
                i = i + 1
     
            End If
     
        Else
     
            i = i + 1
     
        End If
     
    MaxLigneffseq = Range("A65536").End(xlUp).Row
     
    Loop
     
    End Sub
    Et lors de la compilation, le message d'erreur s'affiche à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = ProchaineCelluleNonVide_Colonne(i, 1, ffseq)
    Voilà, c'est surement une erreur de débutant, mais j'ai commencé visual basic depuis très peu de temps et je ne connais pas toutes les fonctions disponibles par exemple. Merci d'avance de m'éclairer.


    PS : Je suppose qu'il existe un code plus "efficace" que celui décrit plus haut, mais le problème apparait dans un autre endroit du code (trop long à décrire) et qui ne peut pas être écrit de 36 façons différentes tellement il est spécifique.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,

    je ne vais pas répondre directement à ton souci, mais te donner une autre syntaxe pour supprimer les lignes dont la cellule de la colonne A est vide...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim ffseq As Worksheet
    Set ffseq = Worksheets("Base_finale")
    With ffseq
        .Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End With

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 138
    Par défaut
    Oh l'usine à gaz !!!

    la solution de mapeh devrait convenir !

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Par défaut
    Merci pour cette aide assez... balèze pour ainsi dire! Je me doutais bien qu'il existait quelque chose pour faire ça directement...

    Malheureusement comme je l'ai écrit dans mon PS, le même problème survient un peu plus loin, et là je ne pense pas qu'il existe un moyen "éclair" comme celui-ci pour le résoudre. Le code est un peu long à décrire mais je le donne quand même:

    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
    Function Recherche_CodeSandre_Colonne(CodeSandre As Double, Ligne As Integer, TableauUtilise As Worksheet) As Integer
     
    Dim n, i As Integer
    Dim MaxColonne As Integer
     
    MaxColonne = TableauUtilise.UsedRange.Columns.Count
     
    n = 0
    i = 2
     
    Do While i < MaxColonne
     
        If Cells(Ligne, i).Value = CodeSandre Then
     
            n = n + 1
            i = i + 1
     
        Else
     
            i = i + 1
     
        End If
     
    Loop
     
    If n = 0 Then
     
        Recherche_CodeSandre_Colonne = 0 'Signifie : aucune valeur sandre correspondante
    Else
     
        Recherche_CodeSandre_Colonne = TableauUtilise.Range(Cells(Ligne, 2), Cells(Ligne, MaxColonne)).Find(CodeSandre, LookIn:=xlValues, SearchOrder:=xlByColumns).Column
     
    End If
     
    End Function
    (les lignes suivantes sont dans un Sub)

    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
    Do While j < MaxLignefi
     
        CodeSandre = Left(fv.Cells(j, 4).Value, 4)
     
        r = fv.Cells(j, 5).Value
        c = Recherche_CodeSandre_Colonne(CodeSandre, 4, ffseq)
     
        If c = 0 Then
     
            j = j + 1
     
      Else
     
            ffseq.Cells(r, c).Value = fi.Cells(j, 10).Value
            j = j + 1
     
        End If
     
    Loop
    En gros je dois placer toutes les valeurs de la colonne 10 de fi dans un tableau ammenagé où les lignes "r" se déduisent à partir d'un autre tableau et les colonnes "c" se déduisent de la place de la valeur "CodeSandre" dans un autre tableau.
    La fonction sert donc à renvoyer la valeur de la colonne dans laquelle apparait la valeur CodeSandre, et de renvoyer 0 si cette valeur n'apparait pas.

    EDIT : l'erreur apparaît comme précédemment à c =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recherche_CodeSandre_Colonne(CodeSandre, 4, ffseq)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 138
    Par défaut
    Je ne comprends pas bien ce que tu cherches à faire, mais je crois comprendre que cela peut se résumer à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Recherche_CodeSandre_Colonne(CodeSandre As Double) As Integer
     
     
    If Not ffseq.rows(4).Find(CodeSandre, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
        Recherche_CodeSandre_Colonne = ffseq.rows(4).Find(CodeSandre, LookIn:=xlValues, LookAt:=xlWhole).Column
    Else
        Recherche_CodeSandre_Colonne = 0
    End If
     
    End Function
    Quand à ce code

    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
    Do While j < MaxLignefi
     
    CodeSandre = Left(fv.Cells(j, 4).Value, 4)
     
    r = fv.Cells(j, 5).Value
    c = Recherche_CodeSandre_Colonne(CodeSandre, 4, ffseq)
     
     
    If c = 0 Then
     
    j = j + 1
     
    Else
     
    ffseq.Cells(r, c).Value = fi.Cells(j, 10).Value
    j = j + 1
     
    End If
     
    Loop

    Il doit être remplacable par un truc de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For j= 1 to MaxLignefi
        CodeSandre = Left(fv.Cells(j, 4), 4)
        r = fv.Cells(j, 5)
        c= Recherche_CodeSandre_Colonne(CodeSandre)
     
        If c<>0 Then
            ffseq.Cells(r, c) = fi.Cells(j, 10)
        end if
    Next j

Discussions similaires

  1. VBA appel de fonction
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/02/2008, 08h28
  2. Réponses: 10
    Dernier message: 19/03/2007, 17h55
  3. [VBA] Excel : Appel de fonction au clique sur un boutton
    Par nanu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/09/2006, 19h30
  4. [VBA-E] Appel de fonction/procédure depuis une variable
    Par truman dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/05/2006, 16h20
  5. [VBA][Excel] appel de fonction
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/12/2005, 10h53

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