Intégrer code dans bouton

Flows

XLDnaute Nouveau
Bonjour à tous,

Voilà un problème qui semble très simple mais je n'y arrive pas du tout !!

En fait je souhaiterais intégrer un code VBA existant sur une feuille de mon classeur dans un bouton situé sur une autre feuille. A chaque fois cela m'efface l'ensemble de ma feuille. Voici le code en question :

Private Sub Worksheet_Activate()
Range("A3:H1000").ClearContents

For Each cell In Sheets("d. Devis").Range("A14:A" & Sheets("d. Devis").[a65000].End(xlUp).Row)
If cell <> "" Then
r = [b65000].End(xlUp).Row + 2
Range("a" & r) = cell.Value
Range("h" & r) = cell.Offset(0, 4) 'ou range("e" & cell.row)
For J = Cells(r, 2).Row + 1 To Cells(r, 2).End(xlDown).Row
Cells(J, 8).Formula = "=" & Range("h" & r).Address & "*E" & J
Next J
End If
Next cell
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim k&, i&, J&, m
[a1].Select

On Error GoTo fin
k = Application.Match(Target, Feuil2.Columns(1), 0)
m = Feuil2.Cells(k, 1).CurrentRegion.Value
Target.Offset(0, 1).Resize(UBound(m, 1), UBound(m, 2)) = m

fin:
End Sub

Si quelqu'un pouvait me donner la marche à suivre je lui serait reconnaissant :D

En vous remerciant.



Flows
 

Pièces jointes

  • bouton.xlsm
    74.9 KB · Affichages: 52
  • bouton.xlsm
    74.9 KB · Affichages: 56
  • bouton.xlsm
    74.9 KB · Affichages: 53

Flows

XLDnaute Nouveau
Re : Intégrer code dans bouton

Bonjour alienox,

En fait je veux qu'en cliquant sur un bouton situé en feuille 1 (devis), la macro s'exécute mais soit elle efface les données sur ma feuille soit un message d'erreur apparaît.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer code dans bouton

Bonjour le fil, bonjour le forum,

Flows, la macro événementielle s'exécute quand l'onget g. SSD est activé. Les cellules ou plages dans le code font donc référence à cet onglet. Si tu veux le même code à partir d'un bouton placé dans un autre onglet il te faudra rajouter systématiquement Sheets("g. SSD"). devant elles (les plages ou cellules). Ça devrait donner :
Code:
Sheets("g. SSD").Range("A3:H1000").ClearContents
 
For Each cell In Sheets("d. Devis").Range("A14:A" & Sheets("d. Devis").[a65000].End(xlUp).Row)
    If cell <> "" Then
    r = [b65000].End(xlUp).Row + 2
    Sheets("g. SSD").Range("a" & r) = cell.Value
    Sheets("g. SSD").Range("h" & r) = cell.Offset(0, 4) 'ou range("e" & cell.row)
        For J = Sheets("g. SSD").Cells(r, 2).Row + 1 To Sheets("g. SSD").Cells(r, 2).End(xlDown).Row
        Sheets("g. SSD").Cells(J, 8).Formula = "=" & Range("h" & r).Address & "*E" & J
        Next J
    End If
Next cell
 

Flows

XLDnaute Nouveau
Re : Intégrer code dans bouton

Bonjour Robert,

J'ai suivi ta procédure et le soucis c'est que mon pc commence à tourner pendant longtemps, j'ai l'impression qu'il fait toutes les cellules du tableur. Chose que la macro ne faisait pas avant. J'ai pourtant essayé plusieurs fois, peut-être que je ne rentre pas correctement les données.

alienox c'est une macro pour appeler des plages de cellules situées sur une autre feuille.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer code dans bouton

Bonsoir le fil, bonsoir le forum,

Je comprend Alienox quand il te demandes ce que tu veux faire car ton code est incohérent. Je te l'ai commenté ligne par ligne pour tu essaies de comprendre ton erreur. Nous on n'est pas dans ta tête et on ne devine pas ce que tu demandes avec ce code :
Code:
Private Sub CommandButton1_Click()
Dim r As Integer 'déclare la variable r (pense à déclarer tes variables ça aide à éviter les beugs)

'efface la plage A3:H100 de l'onglet "g. SSD"
'cette ligne va lancer la procédure événementielle "Change" de l'onglet "g. SSD"
Sheets("g. SSD").Range("A3:H1000").ClearContents
 
'boucle 1 : sur toutes les cellules cell de la plage A14:A(dernière ligne édité de la colonne A) de l'onglet "d. Devis"
'dans ton exemple la plage A14:A17
For Each cell In Sheets("d. Devis").Range("A14:A" & Sheets("d. Devis").[a65000].End(xlUp).Row)
    
    If cell <> "" Then 'condition : si la cellule cell n'est pas vide
        
        'définit la variable r (dernière ligne éditée + 2) de la colonne B de l'onglet "g. SSD"
        'dans ton exemple r vaut 3
        r = Sheets("g. SSD").[B65000].End(xlUp).Row + 2
            
        'renvoie dans la colonne A ligne r de l'onglet "g. SSD" la valeur de la cellule cell
        'dans ton exemple A3 vaut "1bbm10c:
        Sheets("g. SSD").Range("A" & r) = cell.Value
        
        'renvoie dans la colonne H ligne r de l'onglet "g. SSD" la valeur de la cellule cell décalée de 4 colonnes à droite
        'dans ton exemple H3 vaut "80,00"
        Sheets("g. SSD").Range("H" & r) = cell.Offset(0, 4) 'ou range("e" & cell.row)
        
        'boucle 2 : de la ligne / de la cellule en ligne r, colonne 2 / + 1 (pourquoi pas tout simplement 'For J = r + 1 to...)
        'à la dernière ligne éditée de la colonne 2 (=B) de l'onglet "g. SSD"
        'comme r est égal à 3 quand le tableu est vide, ça te fait une boucle de 3 à 65536 sous excel 2003
        'ou de 3 à 1048576 sous excel supérieur. Tu m'étonnes que ça mouline !...
        For J = Sheets("g. SSD").Cells(r, 2).Row + 1 To Sheets("g. SSD").Cells(r, 2).End(xlDown).Row
            
            'attribue à la cellule ligne J, colonne H de l'onglet Sheets("g. SSD") la formule = H(r) * E(J)
            Sheets("g. SSD").Cells(J, 8).Formula = "=" & Range("h" & r).Address & "*E" & J
        
        Next J 'prochaine ligne de la boucle 2
    
    End If 'fin de la condition

Next cell 'prochaine cellule de la boucle 1
End Sub
 

Flows

XLDnaute Nouveau
Re : Intégrer code dans bouton

Merci Robert pour ces explications,

Étant débutant, mon erreur ne me saute pas aux yeux mais si je suis tes explications, la source du problème viendrait de la seconde boucle qui prend en compte toute la colonne, donc je peux choisir de réduire la longueur de la colonne à prendre en compte.

Pour information, ce code doit identifier les codes écris en colonne A de la feuille DEVIS, les copier et les coller en feuille SSD, cette dernière va ensuite appeler des plages de cellules variables en feuille DEBOURS pour copier avec un espace entre chaque.
Voilà j'espère avoir été assez claire.

J'ai vu que tu as mis le code via un bouton j'ai essayé en recopiant directement (au lieu de retaper) et ça à l'air de fonctionner par contre la deuxième partie du code pose problème, l'éditeur me dit que la méthode select de la classe Range a échoué sur la ligne
:confused:

Bonne soirée,



Flows
 

alienox

XLDnaute Occasionnel
Re : Intégrer code dans bouton

Merci Robert,

pour ces explications, c beaucoup plus clair pour moi... parce que je ne comprenais pas le but avec ce code, même si je suis novice en VBA....

Autre chose, pardonne moi Flows, Robert pourrais-tu jeter (enfin pas trop fort) un œil à deux sujets que j'ai posté car là je bug...

https://www.excel-downloads.com/thr...e-recherche-faire-une-autre-recherche.218265/
Et

https://www.excel-downloads.com/thr...acro-et-retrecissement-classeur-excel.218267/

Merci d'avance pour ton aide
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Intégrer code dans bouton

Bonsoir le fil, bonsoir le forum,

@ Flows,
c'est normal car le bouton est sur un autre onglet que celui de la macro événementielle qui demande de sélectionner A1.
Solutions : dans le code du bouton, au début, sous la déclaration Dim r As Integer, tu ajoutes
Code:
Sheets("g SSD").Activate
Comme ça, à l'effacement de la plage A3:A100 qui engendre la macro événementielle Change, tu seras déjà sur le bon onglet et ça ne génèrera plus le message.

Pour faire simple : si l'onglet actif est Feuil1 et que tu dois sélectionner A1 (de l'onglet Feuil1), Range("A1").Select est suffisant.
En revanche si l'onglet actif est Feuil2 et que tu dois sélectionner A1 (de l'onglet Feuil1), il te faudra écrire :
Code:
Sheets("Feuil1").Activate 'ou Sheets("Feuil1").Select
Range("A1").Select
sinon ça plante...

@ Alienox Je regarde demain car il est tard...
 

Flows

XLDnaute Nouveau
Re : Intégrer code dans bouton

Bonjour Robert, bonjour alienox, bonjour le forum,

Robert, j'ai mis le code sur un bouton en suivant tes instructions et j'ai un message d'erreur me disant que la méthode select a échoué lors de l'exécution de la 2e partie de mon code, je mets
Worksheets("g. SDD").Activate
après la déclaration et ça ne marche pas.

Finalement pour éviter de trop m'énerver là-dessus j'ai opté pour une solution alternative. En repensant à mon projet, je me suis rendu compte que cette feuille n'était pas obligée d'être visible. Du coup, après avoir caché ma feuille, j'ai créé un bouton qui rend visible la feuille SSD, le code s'exécute, puis j'ai un aperçu de mon impression et ma feuille qui redevient cachée.

Je pense resté sur ça mais je compte me pencher sur ta solution pour découvrir ce que je ne faisais pas bien. En tout cas, il faut absolument que je réduise la taille de la boucle !

Je vous remercie d'avoir pris de votre temps pour m'aider et surtout merci d'avoir mis le doigt sur la taille de la boucle, ça permettra à mon pc de durer plus longtemps :)

Passez une bonne journée.



Flows
 

Discussions similaires

Réponses
1
Affichages
224
Réponses
5
Affichages
268
Réponses
7
Affichages
384

Statistiques des forums

Discussions
312 836
Messages
2 092 633
Membres
105 475
dernier inscrit
ramzi slama