Erreur 1004 définie par l'application ou par l'objet

Florian53

XLDnaute Impliqué
Bonjour à tous,

Je réalise une macro qui me récupère les "X" plus grande valeurs et les "X" valeurs plus petite dans une plage ( rows2).

Mais mon code m'indique une erreur 1004 sur la ligne "wsBoard.Range(Cells((10 + x) + (1 * x), 11), Cells((10 + x) + (1 * x), 15)).Merge" et si je saute cette instruction j'ai la même erreur à la ligne du dessous.

Pouvez vous m'expliquer ou se trouve l'erreur ?

VB:
Private Sub grandevaleurs()
Dim x, y As Integer
Dim NombreG, NombreP As Double
Dim ColonneG, colonneP As Integer
Dim wsDonnees, wsBoard As Object
   
Select Case quantite ' quantite: variable Public
    Case Is > 10
    y = 5
    Case Is < 10 > 7
    y = 3
    Case Is > 4 < 7
    y = 2
    Case Is = 2
    y = 1
    Case Is < 2
    Exit Sub
End Select

    For x = 1 To y 'boucle pour récupérer les plus grandes valeurs et les plus petites
   
         Set wsDonnees = ThisWorkbook.Worksheets("Donnees")
         Set wsBoard = ThisWorkbook.Worksheets("Tableau")
        'récupère la Xieme valeur la plus élevée dans la 2eme ligne
        NombreG = wsDonnees.Application.WorksheetFunction.Large(Rows(2), x) ' Valeur de la "X" valeur la plus grande
        NombreP = wsDonnees.Evaluate("Small(IF(" & Rows(2).Address & ">1," & Rows(2).Address & ")," & x & ")") ' Valeur de la "X" valeur la plus petite
        'recherche le numéro de la colonne pour la valeur trouvée
        ColonneG = wsDonnees.Application.Match(NombreG, Rows(2), 0) 'repupere le N° de colonne de la "X" valeur la plus grande
        colonneP = wsDonnees.Application.Match(NombreP, Rows(2), 0) 'repupere le N° de colonne de la "X" valeur la plus petite
       
        If x = y Then Exit Sub ' si x à atteint y alors on sort du Sub
       
        ' Afin d'éviter d'avoir des doublons, si la valeur "x" est égale à la valeur de "X+1" alors on sort du sub
        If wsDonnees.Application.WorksheetFunction.Large(Rows(2), x) = wsDonnees.Application.WorksheetFunction.Large(Rows(2), x + 1) Then Exit Sub
       
        ' Afin d'éviter d'avoir des doublons, si la valeur "x" est égale à la valeur de "X+1" alors on sort du sub
        If wsDonnees.Evaluate("Small(IF(" & Rows(2).Address & ">1," & Rows(2).Address & ")," & x & ")") = wsDonnees.Evaluate("Small(IF(" & Rows(2).Address & ">1," & Rows(2).Address & ")," & x + 1 & ")") Then Exit Sub
       
         wsBoard.Range(Cells((10 + x) + (1 * x), 11), Cells((10 + x) + (1 * x), 15)).Merge ' Fusion d'une plage de cellule
       
        ' Copie de l'entete de la valeur  "X"  la plus grande dans une autre feuille
         wsDonnees.Range(Cells(1, ColonneG)).Value.Copy wsBoard.Range(Cells((10 + x) + (1 * x), 11), Cells((10 + x) + (1 * x), 15))
       
         wsBoard.Range(Cells((10 + x) + (1 * x), 17), Cells((10 + x) + (1 * x), 18)).Merge ' Fusion d'une plage de cellule
           
         wsBoard.Range(Cells((10 + x) + (1 * x), 17), Cells((10 + x) + (1 * x), 18)) = NombreG ' Copie de la "X" valeur la plus grande
       
         wsBoard.Range(Cells((20 - x) - (1 * x), 22), Cells((20 - x) - (1 * x), 26)).Merge ' Fusion d'une plage de cellule
        
         ' Copie de l'entete de la valeur  "X"  la plus petite dans une autre feuille
         wsDonnees.Range(Cells(1, colonneP)).Value.Copy wsBoard.Range(Cells((20 - x) - (1 * x), 22), Cells((20 - x) - (1 * x), 26))
       
         wsBoard.Range(Cells((20 - x) - (1 * x), 27), Cells((20 - x) - (1 * x), 29)).Merge ' Fusion d'une plage de cellule
        
         Range(Cells((20 - x) - (1 * x), 27), Cells((20 - x) - (1 * x), 29)) = NombreP ' Copie de la "X" valeur la plus petite
       
    Next x
End Sub

Merci
 

pierrejean

XLDnaute Barbatruc
Re
Salut Herve
3 problemes
1) Excel refuse a juste titre de fusionner des cellules déjà fusionnées différemment
Il faut donc de-fusionner au préalable C5:AE21 de la feuille tableau
2)on ne peut pas reporter une valeur unique dans un ensemble de cellules fusionner
Il faut faire le report avant la fusion
3)Excel n’apprécie pas cette formulation
wsBoard.Range(Cells((10 + x) + (1 * x), 17), Cells((10 + x) + (1 * x), 18))
il faut lui préférer:
wsBoard.Range(Cells((10 + x) + (1 * x), 17).Address &":" Cells((10 + x) + (1 * x), 18).Address)

J'ai fait la modif pour le 1er cas
A toi de t'en inspirer pour les autres
 

Pièces jointes

  • test (49).xlsm
    93.3 KB · Affichages: 15

Discussions similaires

Réponses
2
Affichages
140
Réponses
1
Affichages
160

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth