fonction modifier plage de cellule

estopa88

XLDnaute Nouveau
Bonjour,

alors mon problème sous vba est le suivant:

j'ai un traitement à faire sur un nombre de cellule: plus concretement: supposant qu'on a 5 cellule à coté l'un de l'autre, si on a une cellule negative et le reste des cellules positives alors on met la cellule negative à zero et on réparti la valeur negative sur les cellule positives

Exemple

5 10 -6 3 0 => 3 8 0 1 0

Ce n'était pas difficil je l'ai déja fait! le probleme que j'ai c'est de le mettre sous forme de fonction et de l'appliquer à tous les plages de cellules que je veux!

C'est à dire mettre un truc genre :

for i in ("A10:F10","H12:L12"....)
modifier_plage(i)

Je ne sais pas si ça existe sous vba mais je suis resté bloqué la dessus pendant 2 jours

voilà le code auquel je suis arrivé


Private Sub CommandButton1_Click()
modifier_plage(("A10"), ("E10"))
modifier_plage(("G10"), ("N10"))
modifier_plage(("S10"), ("V10"))
modifier_plage(("A5"), ("E5"))
End Sub





Public Function modifier_plage(ByRef Y As Range, ByRef Z As Range)
Dim Plage_calcul As Range
Set Plage_calcul = Range(Y.Address & ":" & Z.Address)
Dim Plage As Range, Cellule As Range
Dim Position As Integer
Dim valeurneg As Integer
Dim nbpos As Integer

nbpos = 0
valeurneg = 0

For Each Cellule In Plage_calcul
If Cellule.Value < 0 Then valeurneg = -Cellule.Value
' And Cellule.Value = 0

If Cellule.Value > 0 Then nbpos = nbpos + 1

Next Cellule

If valeurneg <> 0 Then

For Each Cellule In Plage
If Cellule.Value > 0 Then Cellule.Value = Cellule.Value - valeurneg / nbpos
If Cellule.Value < 0 Then Cellule.Value = 0

Next Cellule

End If





End Function


Je voudrais aussi savoir si c'est possible pour des worksheet différents


Je vous remercie d'avance pour votre aide
 

WUTED

XLDnaute Occasionnel
Re : fonction modifier plage de cellule

Bonjour estopa88,

Je suis pas encore très expérimenté en vba, mais je pense que créer un tableau avec tes plages et utiliser le For Each devrait
te permettre de boucler sur toutes les plages que tu auras mis dans ton tableau. J'ai pas compris ta question sur les worksheets par contre, si tu pouvais donner plus de précisions sur ce que tu comptes faire.

Bonne journée,
WUTED
 
Dernière édition:

estopa88

XLDnaute Nouveau
Re : fonction modifier plage de cellule

Je te remercie WUTED pour ta réponse :)

Avec worksheets différents je voulais dire que je voulais appliquer cette fonction sur des plages de cellules appartennant à des feuilles différentes. Mais ceci n'est pas grave.

Le grand soucis c'est que je n'arrive pas à construire ma fonction car lorsque je lance mon prog ils me sortent : erreur de compilation! erreur de syntaxe

Toute aide est la bienvenue
 

WUTED

XLDnaute Occasionnel
Re : fonction modifier plage de cellule

Re,

Ben normalement tu devrais pas avoir de soucis à au moins voir sur quelle partie du code porte ton erreur, joins ton fichier au cas où.

EDIT : Pour la question des worksheets, ça devrait pas poser de problèmes.
 

estopa88

XLDnaute Nouveau
Re : fonction modifier plage de cellule

Vous trouverez en pièce jointe mon fichier excel

Je vous remercie encore une fois



Re,

Ben normalement tu devrais pas avoir de soucis à au moins voir sur quelle partie du code porte ton erreur, joins ton fichier au cas où.

EDIT : Pour la question des worksheets, ça devrait pas poser de problèmes.
 

Pièces jointes

  • prorata2.xls
    32.5 KB · Affichages: 32

frangy

XLDnaute Occasionnel
Re : fonction modifier plage de cellule

Bonjour,

J’ai simplement modifié la déclaration des arguments afin qu’ils soient reconnus comme plage et ça semble fonctionner.

Code:
Private Sub CommandButton1_Click()
modifier_plage [A10], [E10]
modifier_plage [G10], [N10]
modifier_plage [S10], [V10]
modifier_plage [A5], [E5]
End Sub
Public Function modifier_plage(ByRef Y As Range, ByRef Z As Range)
Dim Plage_calcul As Range
Set Plage_calcul = Range(Y.Address & ":" & Z.Address)
Dim Plage As Range, Cellule As Range
Dim Position As Integer
Dim valeurneg As Integer
Dim nbpos As Integer
    nbpos = 0
    valeurneg = 0
    For Each Cellule In Plage_calcul
        If Cellule.Value < 0 Then valeurneg = -Cellule.Value
        ' And Cellule.Value = 0
        If Cellule.Value > 0 Then nbpos = nbpos + 1
    Next Cellule
    If valeurneg <> 0 Then
        For Each Cellule In Plage_calcul
            If Cellule.Value > 0 Then Cellule.Value = Cellule.Value - valeurneg / nbpos
            If Cellule.Value < 0 Then Cellule.Value = 0
        Next Cellule
    End If
End Function

Cordialement.
 

estopa88

XLDnaute Nouveau
Re : fonction modifier plage de cellule

Je te remercie enormement frangy en effet ça marche!!! tu me sauves la vie!

Il me reste juste une dernière question! vu que je suis débutant en vba, j'ai écrie le code sur Feuil1(Feuil1) par contre je n'ai mis que
Code:
Sub macro1()

End Sub
sur module. Je voudrais appliquer la fonction modifier_plage sur toutes les feuil excel, c'est à dire par exemple feuil2(A22:E22) ou feuil3(A33:E33)

Est ce qu'il faut rajouter un préfixe lors de la déclaration des arguments?

Je te remercie encore une fois


Bonjour,

J’ai simplement modifié la déclaration des arguments afin qu’ils soient reconnus comme plage et ça semble fonctionner.

Code:
Private Sub CommandButton1_Click()
modifier_plage [A10], [E10]
modifier_plage [G10], [N10]
modifier_plage [S10], [V10]
modifier_plage [A5], [E5]
End Sub
Public Function modifier_plage(ByRef Y As Range, ByRef Z As Range)
Dim Plage_calcul As Range
Set Plage_calcul = Range(Y.Address & ":" & Z.Address)
Dim Plage As Range, Cellule As Range
Dim Position As Integer
Dim valeurneg As Integer
Dim nbpos As Integer
    nbpos = 0
    valeurneg = 0
    For Each Cellule In Plage_calcul
        If Cellule.Value < 0 Then valeurneg = -Cellule.Value
        ' And Cellule.Value = 0
        If Cellule.Value > 0 Then nbpos = nbpos + 1
    Next Cellule
    If valeurneg <> 0 Then
        For Each Cellule In Plage_calcul
            If Cellule.Value > 0 Then Cellule.Value = Cellule.Value - valeurneg / nbpos
            If Cellule.Value < 0 Then Cellule.Value = 0
        Next Cellule
    End If
End Function

Cordialement.
 

frangy

XLDnaute Occasionnel
Re : fonction modifier plage de cellule

Tu as plusieurs possibilités.
La plus courante, c’est d’utiliser le nom de feuille Feuil1(Feuil1) :
Code:
Worksheets ("Feuil1").range("A10") ou Worksheets("Feuil1").[A10]
Tu peux également utiliser le codename Feuil1(Feuil1) :
Code:
Feuil1.range("A10") ou Feuil1.[A10]
Pour commencer, je te conseillerais d’opter pour la première solution.

Code:
Option Explicit
Private Sub CommandButton1_Click()
Dim param1 As Range, param2 As Range, param3 As Range, param4 As Range
Dim param5 As Range, param6 As Range, param7 As Range, param8 As Range

    With Worksheets("Feuil1")
        Set param1 = .Range("A10")
        Set param2 = .Range("E10")
        Set param3 = .Range("G10")
        Set param4 = .Range("N10")
        Set param5 = .Range("S10")
        Set param6 = .Range("V10")
        Set param7 = .Range("A5")
        Set param8 = .Range("E5")
    End With
    
    modifier_plage param1, param2
    modifier_plage param3, param4
    modifier_plage param5, param6
    modifier_plage param7, param8
    
    Set param1 = Nothing
    Set param2 = Nothing
    Set param3 = Nothing
    Set param4 = Nothing
    Set param5 = Nothing
    Set param6 = Nothing
    Set param7 = Nothing
    Set param8 = Nothing
    
End Sub

Cordialement.
 

estopa88

XLDnaute Nouveau
Re : fonction modifier plage de cellule

en mettant en place le code le suivant sur microsoft excel objects feuil1(feuil1):

Code:
Option Explicit
Private Sub CommandButton1_Click()
Dim param1 As Range, param2 As Range, param3 As Range, param4 As Range
Dim param5 As Range, param6 As Range, param7 As Range, param8 As Range

    With Worksheets("Feuil1")
        Set param1 = .Range("A10")
        Set param2 = .Range("E10")
        Set param3 = .Range("A22")
        Set param4 = .Range("E22")
        Set param5 = .Range("S10")
        Set param6 = .Range("V10")
        Set param7 = .Range("A11")
        Set param8 = .Range("E11")
      
    End With
   
    modifier_plage param1, param2
    modifier_plage param3, param4
    modifier_plage param5, param6
    modifier_plage param7, param8
   
    Set param1 = Nothing
    Set param2 = Nothing
    Set param3 = Nothing
    Set param4 = Nothing
    Set param5 = Nothing
    Set param6 = Nothing
    Set param7 = Nothing
    Set param8 = Nothing
   
   
   
   
       With Worksheets("Feuil3")
        Set param1 = .Range("A10")
        Set param2 = .Range("E10")
        Set param3 = .Range("A22")
        Set param4 = .Range("E22")
        Set param5 = .Range("S10")
        Set param6 = .Range("V10")
        Set param7 = .Range("A11")
        Set param8 = .Range("E11")
      
    End With
   
    modifier_plage param1, param2
    modifier_plage param3, param4
    modifier_plage param5, param6
    modifier_plage param7, param8
   
    Set param1 = Nothing
    Set param2 = Nothing
    Set param3 = Nothing
    Set param4 = Nothing
    Set param5 = Nothing
    Set param6 = Nothing
    Set param7 = Nothing
    Set param8 = Nothing

      
End Sub

J'arrive à appliquer modifier_plage sur feuil1 mais pas sur feuil3. L'intérêt majeur étant de juste en appuyant sur le boutant se trouvant à la feuil1 appliquer la fonction modifier_plage à toutes les valeurs des différents feuils.

Merci
 

frangy

XLDnaute Occasionnel
Re : fonction modifier plage de cellule

Re,

L'argument qui est passé à la fonction est maintenant la plage associée à la feuille en cours de traitement.
Ex : Worksheets("Feuil1").Range("A10:E10") => param1 => Plage_calcul.
Je suis allé au plus simple en déclarant des plages identiques pour les 2 feuilles, ce qui permet de faire une boucle pour traiter ces 2 feuilles. Si tu dois agir sur des plages différentes, il faudra adapter le code.
Code:
Option Explicit
Private Sub CommandButton1_Click()
Dim param1 As Range, param2 As Range, param3 As Range, param4 As Range
Dim Tablo()
Dim Sh
    Tablo = Array("Feuil1", "Feuil2")
    For Each Sh In Tablo
        With Worksheets(Sh)
            Set param1 = .Range("A10:E10")
            Set param2 = .Range("A22:E22")
            Set param3 = .Range("S10:V10")
            Set param4 = .Range("A15:E15")
        End With
        modifier_plage param1
        modifier_plage param2
        modifier_plage param3
        modifier_plage param4
        
        Set param1 = Nothing
        Set param2 = Nothing
        Set param3 = Nothing
        Set param4 = Nothing
    Next
End Sub
Public Function modifier_plage(Plage_calcul As Range)
Dim valeurneg As Integer
Dim nbpos As Integer
Dim Cellule As Range
    nbpos = 0
    valeurneg = 0
    For Each Cellule In Plage_calcul
        If Cellule.Value < 0 Then valeurneg = -Cellule.Value
        ' And Cellule.Value = 0
        If Cellule.Value > 0 Then nbpos = nbpos + 1
    Next Cellule
    If valeurneg <> 0 Then
        For Each Cellule In Plage_calcul
            If Cellule.Value > 0 Then Cellule.Value = Cellule.Value - valeurneg / nbpos
            If Cellule.Value < 0 Then Cellule.Value = 0
        Next Cellule
    End If
End Function

Cordialement.
 

Statistiques des forums

Discussions
312 677
Messages
2 090 821
Membres
104 677
dernier inscrit
soufiane12