Récupération de donnée dynamique besoin expert VBA

Bonjour,

J'ai un tableau de données générales que j'aimerai traité dans plusieurs feuilles différentes.Celles-ci sont crées par une autre macro et on ne peut pas savoir leur nombre. Sur ces feuilles j'ai mis un bouton de commande pour mettre à jour des données.

Ces données seront copiées à partir de la feuille de donnée générale. J'ai différents problèmes, lorsque j'appuie sur le bouton j'aimerai sélectionner deux cellules pour prendre une valeur de température de consigne et Emt (écart de mesure). Voici mon code : (je mets // pour mes commentaires)

Sub Maj_pallier_temp()
///////////////////////////////////////////////////////////////////////////////////// Variables ///////////////////////////////////////////////////////////////////////////////////////////
Dim Val_homo_tab As Integer
Dim derniere_val_homo_tableau As Integer
Dim LastValue_Tab_homo As Integer
Dim Val_homo_tab2 As Integer
Dim homogeneite As Integer
Dim homogeneite_moy As Integer
Dim homogeneite_moy_prec As Integer
Dim moyenne_temperature_moy As Integer
Dim moyenne_, As Integer
Dim Temperature_consigne As Integer
Dim Emt As Integer

/////////////////////////////////// Prends Le bouton de la Feuille x est appuyé on récupère ces 2 valeurs mais ne marche pas/////////////////////////////////////////////////////////////////////////////////

Sheets(ActiveSheet.Shapes(Application.Caller)).Activate

Temperature_consigne = Cells(3,2).Value
Emt = Cells(3,3).Value

/// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////// Feuille Donnée Générale ON l'active et on vient détecter la valeur de ligne de la dernière cellule remplis du tableau dynamique. on ne connait pas à l'avance de quelle quantitée de données il sera remplis ////////////////////////////////////////////////////////////////////////////////////////////

Feuil10.Activate

LastCell_Tab_homo = Feuil10.Range("K11").End(xlDown).Row

'LastValue_Tab_homo = Cells.Find("*", SearchOrder:=xlByColum, SearchDirection:=xlPrevious, LookIn:=xlValues).Column // en commentaire autre solution peut-être

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


////////////// On récupère cette valeur pour l'itérer dans une boucle FOR ainsi on traite toutes les données du tableau dont la colone important commence en K11 =Cells (11,11) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

For Val_homo_tab = 11 To LastCell_Tab_homo Step 1

Val_homo_tab2 = Val_homo_tab

For i = Val_homo_tab2 To i + 60 Step 1 /////////////////// Je veux traiter toutes les données du tableau en prenant par paquet de 60 et ainsi celui qui a la meilleure moyenne et autre variables dans ce paquet est enregistrer//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

homogeneite = Cells(i, 11).Value
homogeneite_moy = homogeneite_moy + homogeneite

moyenne_temperature = Cells(i, 12).Value
moyenne_temperature_moy = moyenne_temperature_moy + moyenne_temperature


Next i

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////// On copie toutes les valeurs des 60 lignes à traiter ///////////////////////////////////////////////////////////////////////////

Feuil10.Range(Cells(Val_homo_tab2, 1), Cells(Val_homo_tab2 + 60, 10)).Copy

homogeneite_moy = homogeneite_moy / 60
moyenne_temperature_moy = moyenne_temperature_moy / 60
//////////////////////////////////////////////////////////////////////////////////////////////////////// Si respect condition colle ces valeurs dans la feuille du bouton du module /////////////////////////////////////////
If homogeneite_moy < homogeneite_moy_prec And Temperature_consigne - Emt <= moyenne_temperature_moy <= Temperature_consigne + Emt Then


homogeneite_moy_prec = homogeneite_moy

'colle les 60 valeurs homogeneite si homogeneite la plus basse dans la feuille ou la commande a été activé //
Sheets(ActiveSheet.Shapes(Application.Caller)).Activate.Range("A11:L72").PasteSpecial

End If
///////////////////////////////////////////////////////////////////////////////////////////////////// passe nouvelle valeurs du tableau de donnée générale ///////////////////////////////////////////////////////////////////////////
Next Val_homo_tab

End Sub

Ma première question :

-Quelle fonction renvoie au bouton de commande lancé dans la feuille ou je dois collé les 60 meilleurs valeurs ? j'ai trouvé Sheets(ActiveSheet.Shapes(Application.Caller)) mais en semble pas marcher. Ma problématique c'est que je ne connais pas le numéro de feuil car elles peuvent autant êter 2 que 15 à remplir à partir des données générales

Si quelqu'un a une idée je suis preneur car la je bloque.

bonne journée

Bonjour Smarko, bonjour le forum,

Pas sûr d'avoir bien compris mais si tu souhaites mémoriser l'onglet à partir duquel tu as cliqué, pourquoi ne pas le stocker dans une variable avec un code du style :

Dim OD As Worksheet 'déclare la variable OD (Onglet de Départ)

Set OD = Activesheet

Par la suite utilise OD pour faire référence à l'onglet du bouton.

Merci,

Merci pour ta réponse rapide c'est cool :). J'ai toujours le même problème c'est que cela ne me colle rien dans ma feuille ^^ j'ai remplacé dans mon code par ce que tu m'as dis :

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Dim OD As Worksheet 'Déclare la variable OD (Onglet de départ)

////////////////////////////////////////////////////////////////////////////////// au dessus variable //////////////////////////////////////////////////////////////////////////////////////////////////////////////
Set OD = ActiveSheet


Temperature_consigne = Cells(3, 3).Value
Emt = Cells(7, 3).Value

Feuil10.Activate // C'est ma feuille base de donnée

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

.................................

////////////////////////////////////////////////////////////////////////////////////////////////////////////// En dessous condition IF ///////////////////////////////////////////////////////////////////////////////

If homogeneite_moy < homogeneite_moy_prec And Temperature_consigne - Emt <= moyenne_temperature_moy <= Temperature_consigne + Emt Then


homogeneite_moy_prec = homogeneite_moy

'colle les 60 valeurs homogeneite si homogeneite la plus basse dans la feuille ou la commande a été activé
OD.Range("A11:L72").PasteSpecial

End If

Next Val_homo_tab

End Sub

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Penses tu que lorsque j'appuie sur le bouton la feuille passe direct en activesheet ? Bon après mon code qui prends meilleurs valeur ne marche pas totalement il me copie que la dernière ligne de mon tableau dynamique (je le vois car j'ai un carré en pointillé de 60 valeurs derniere ligne + 59 ligne vide ) mais cette dernière à des valeurs et je ne la retrouve pas dans ma feuille ou il y a le bouton :/. Du coup peut-être que soit le OD est mal définis ou le collage spécial ne marche pas.

OD.Range("A11:L72").PasteSpecial

Re,

Utilse les balises de code </>, c'est tellement plus lisible !...

Il y a plein d'incohérences dans ton code. Commence par les supprimer :

Sub Maj_pallier_temp()
Dim OD As Worksheet
Dim OB As Worksheet
Dim Val_homo_tab As Integer
Dim derniere_val_homo_tableau As Integer 'VARIABLE NON UTILISÉE DANS LE CODE
Dim LastValue_Tab_homo As Integer 'VARIABLE NON UTILISÉE DANS LE CODE
Dim Val_homo_tab2 As Integer
Dim homogeneite As Integer
Dim homogeneite_moy As Integer
Dim homogeneite_moy_prec As Integer
Dim moyenne_temperature_moy As Integer
Dim moyenne_ As Integer 'VARIABLE NON UTILISÉE DANS LE CODE (IL Y AVAIT UNE VIRGULE EN TROP DANS LE NOM DE CETTE VARIABLE)
Dim Temperature_consigne As Integer
Dim Emt As Integer

Set OD = ActiveSheet
Set OB = Worksheets("Base de donnée") 'NOM À ADAPTER À TON CAS
Temperature_consigne = OD.Cells(3, 2).Value 'OD ou OB ?
Emt = OD.Cells(3, 3).Value 'OD ou OB ?
LastCell_Tab_homo = OB.Range("K11").End(xlDown).Row 'OD ou OB ?
For Val_homo_tab = 11 To LastCell_Tab_homo
    Val_homo_tab2 = Val_homo_tab
    homogeneite = OB.Cells(i, 11).Value 'OD ou OB ? D'OÙ SORT CETTE VARIABLE I ?!
    homogeneite_moy = homogeneite_moy + homogeneite
    moyenne_temperature = OD.Cells(i, 12).Value 'OD ou OB ?
    moyenne_temperature_moy = moyenne_temperature_moy + moyenne_temperature
Next i 'que fout se Next i ? INCOHÉRENT !
OB.Range(OB.Cells(Val_homo_tab2, 1), OB.Cells(Val_homo_tab2 + 60, 10)).Copy 'vérifier les onglets
homogeneite_moy = homogeneite_moy / 60
moyenne_temperature_moy = moyenne_temperature_moy / 60
If homogeneite_moy < homogeneite_moy_prec And Temperature_consigne - Emt <= moyenne_temperature_moy <= Temperature_consigne + Emt Then
    homogeneite_moy_prec = homogeneite_moy
    OD.Range("A11:L72").PasteSpecial
End If
Next Val_homo_tab 'INCOHÉRENT !
End Sub
Sub Maj_pallier_temp()

Dim Val_homo_tab As Integer
Dim derniere_val_homo_tableau As Integer
Dim LastValue_Tab_homo As Integer
Dim Val_homo_tab2 As Integer

Dim homogeneite As Integer
Dim homogeneite_moy As Integer
Dim homogeneite_moy_prec As Integer
Dim moyenne_temperature_moy As Integer
Dim moyenne_temperature As Integer

Dim Temperature_consigne As Integer
Dim Emt As Integer

Dim OD As Worksheet 'Déclare la variable OD (Onglet de départ)
Dim OB As Worksheet

Set OD = ActiveSheet
Set OB = Worksheets("Données Générales")

Temperature_consigne = OD.Cells(3, 3).Value
Emt = OD.Cells(7, 3).Value

   LastCell_Tab_homo = OB.Range("K11").End(xlDown).Row
   'LastValue_Tab_homo = Cells.Find("*", SearchOrder:=xlByColum, SearchDirection:=xlPrevious, LookIn:=xlValues).Column

        For Val_homo_tab = 11 To LastCell_Tab_homo Step 1

               Val_homo_tab2 = Val_homo_tab

                For i = Val_homo_tab2 To i + 60 Step 1

                    homogeneite = OB.Cells(i, 11).Value
                    homogeneite_moy = homogeneite_moy + homogeneite

                    moyenne_temperature = OB.Cells(i, 12).Value
                    moyenne_temperature_moy = moyenne_temperature_moy + moyenne_temperature

                Next i

                     OB.Range(OB.Cells(Val_homo_tab2, 1), OB.Cells(Val_homo_tab2 + 60, 10)).Copy

                     homogeneite_moy = homogeneite_moy / 60
                     moyenne_temperature_moy = moyenne_temperature_moy / 60

                         If homogeneite_moy < homogeneite_moy_prec And Temperature_consigne - Emt <= moyenne_temperature_moy <= Temperature_consigne + Emt Then

                         homogeneite_moy_prec = homogeneite_moy

                         'copy les 60 valeurs homogeneite si homogeneite la plus basse dans la feuille ou la commande a été activé
                        OD.Range("C11:L72").PasteSpecial

                         End If

          Next Val_homo_tab

End Sub

J'ai remplacé par la retenue des onglets dans des variables ce qui est très cool merci. Mais le copier coller de valeurs ne marche toujours pas. J'ai remplis 400 valeurs par le chiffre 45 et au milieu j'ai mis 100 valeurs égale à 20. Ma variable température de consigne récupère ce chiffre 20 pour l'intégrer dans la condition. Donc mon code s'éxécute bien car je copie ces 60 valeurs jusqu'à la fin du tableau général de donnée, je vois en pointillé un carré de 60 variables en attende d'être coller donc mon code va bien jusqu'à la dernière ligne. Par contre lorsque le copier passe sur les chiffres 20 il ne colle jamais ces valeurs dans OD.range("C11:L72").pasteSpecial.

Donc la commande OB=activesheet n'ai pas bien comprise non ?

Re,

Quel est le code appliqué au bouton sur lequel tu cliques ?
Le mieux serait que tu nous fasse un petit fichier exemple avec juste 2 ou trois onglets et la structure nécessaire à faire tourner la macro...

Re,

Je copie ton code dans in fichier vierge et j'ai encore des incohérences. Variable non déclarée : LastCell_Tab_homo ou une variable déclarée mais non utilisée : derniere_val_homo_tableau... Je passe la main...

Rechercher des sujets similaires à "recuperation donnee dynamique besoin expert vba"