Aménagement d’une macro qui me semble incomplète

Vieupot

XLDnaute Occasionnel
Bonsoir,

J’ai à ma façon créé cette petite macro qui en un premier temps est chargée d’effacer les données enregistrées dans la feuille ‘’6010 ‘’….ça fonctionne



Ensuite elle va chercher dans une autre feuille les données sélectionnées par un filtre pour les copier à la place des données qui ont été effacées précédemment…. Ça marche aussi



Ensuite elle va chercher en I6 la date qui est dans cette cellule (fonction aujourdhui ) pour la copier en I5

J’ai créé un formule qui me dit que la différence entre I6 et I5 ne doit pas dépasser 8 jours c'est-à-dire ne pas oublier de mettre à jour tous les huits jours …. Ça marche aussi



Mais après toutes ces opérations la cellule I6 qui a été sélectionnée reste encadrée de pointillés et je suis obligé de faire ‘’Echap ‘’ pour les supprimer. Ce n’est pas bien grave mais ça fait ‘’pas fini’’

Je pense qu’il manque une instruction. D’autre part si tout cela peut être écrit plus simplement, je ne demande qu’ a être corrigé…ça me permettra de voir mes erreurs



Merci de votre réponse……Macro ci-dessous



Sub cpte_6010()

'

' cpte_6010 Macro

' va sélectionner les données de ce compte dans les dépenses et recopie en cpte 6010

'



'

Sheets("6010").Select

Range("D12:H2500").Select

Range("D12:H2500").ClearContents

Sheets("Comptes ").Select

ActiveSheet.ListObjects("Tableau_dep").Range.AutoFilter Field:=2, Criteria1:= _ "6010"

Range("A5:E10").Select

Selection.Copy

Sheets("6010").Select

Range("D12").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Range("I6").Select

Selection.Copy

Range("I5").Select

Selection.PasteSpecial Paste:=xlPasteValues

Range("B5").Select

End Sub


Lorsque la sélection du compte demandé par le filtre 6010 dans la feuille ‘’comptes ‘’ a été faite, et que je retourne dans cette feuille, l’affichage ne donne que bien normalement les lignes qui portent le compte ‘’6010’’.suite au filtre appliqué

Comment puis-je faire avec cette macro pour qu’après en avoir fini avec cette sélection je puisse dans cette feuille ‘’comptes’’ visualiser à nouveau l’ensemble des comptes présents. C'est a dire sélectionner "tout " pour l'affichage

Merci par avance
Bernard
 

Jacky67

XLDnaute Barbatruc
Bonsoir,

Comment puis-je faire avec cette macro pour qu’après en avoir fini avec cette sélection je puisse dans cette feuille ‘’comptes’’ visualiser à nouveau l’ensemble des comptes présents. C'est a dire sélectionner "tout " pour l'affichage
Bernard
Bonjour,
Pour visualiser toutes les données filtrées, il y a l'instruction "ShowAllData "
Ce qui dans ce code devrait être: " Sheets("Comptes ").ShowAllData"
En ce qui concerne la macro , celle-ci (épurée) devrait faire l'affaire
Code:
Sub cpte_6010()
' va sélectionner les données de ce compte dans les dépenses et recopie en cpte 6010

Sheets("6010").Range("D12:H2500").ClearContents
With Sheets("Comptes ")
.ListObjects("Tableau_dep").Range.AutoFilter Field:=2, Criteria1:="6010"
.ListObjects("Tableau_dep").Range.SpecialCells(xlCellTypeVisible).Copy
End With
With Sheets("6010")
.Activate
.Range("D12").PasteSpecial Paste:=xlPasteValues
.Range("I5") = .Range("I6")
.Range("B5").Select
End With
If Sheets("Comptes ").FilterMode Then Sheets("Comptes ").ShowAllData
End Sub

*Non testé, par défaut de classeur
**Il y a un espace inutile derrière le nom de la feuille "Comptes ". Cela est une source d'erreur
 
Dernière édition:

Vieupot

XLDnaute Occasionnel
Bonjour Jacky67 et Catho..
merci de votre aide

Je rencontre toutefois un petit souci avec la macro qui crée un petit problème que je vous explique dans le fichier joint
Mon niveau n'est pas élevé et j'ai besoin de voir comment résoudre ce problème sans avoir a reconsidérer l'ensemble du projet avec des tableaux croisés dynamiques, mais ce sera pour plus tard car nous sommes en Mars et il y a déja un trimestre de compta a enregistrer. l'idée finale étant de parvenir à établir mon bilan simple sans avoir à intervenir mais ça ce sera "aprés"
A bientôt
Bernard
 

Pièces jointes

  • Test2.xlsm
    245.5 KB · Affichages: 50

cathodique

XLDnaute Barbatruc
le problème est que en D 2501 j'ai une formule qui totalise les dépenses pour D7 et informe en cas de dépassement de budget en F2
La je ne vois pas comment à mon faible niveau éviter l'addition de D2501 et (dans cet exemple) D16
On commence par la sommation des dépenses. Je te propose de nommée la cellule D10 (DepCmpt6010)
Ensuite tu écris ta formule (=somme(D7:2500), elle sera juste au dessus du tableau.

Quand tu nommes une cellule, tu pourras la déplacer sans modification des calculs.

Pour la ligne d'en-tête, je vois bien qu'elle est en double comment as-tu fait? Il n'y a aucune macro dans ton fichier.

@+
 

cathodique

XLDnaute Barbatruc
Voilà, j'ai supprimé la ligne 2501 sur les 2 feuilles. le total dépense est en D10 est se nomme DepCmpt6010. J'ai repris la macro de Jacky. J'y ai remplacé le critère de filtre par le nom de la feuille Active (soit 6010), il y avait juste une erreur sur le numéro de la ligne pour la recopie des données après filtre. J'espère que ça va te convenir.

edit: Salut Jacky, pas vu:)
 

Pièces jointes

  • Vieupot- gestion comptabilité.xlsm
    264.3 KB · Affichages: 50

Vieupot

XLDnaute Occasionnel
Bonsoir Jacky67 et Catodique

Pour Jacky...ça coince Mais le raiage des deux avec Catho c'est bon
Pour Cathodique..ok ça marche mais j'en reparlerai demain car encore une petite question. Plus de possibilité pour ce soir
A demain et merci
Bernard
 

Vieupot

XLDnaute Occasionnel
Bonjour
Dans la macro proposée par cathodique,sur le fichier Vieupot gestion comptabilité, le choix du filtre se fait par le nom de l'onglet actif si j'ai bien compris ! ça c'est parfait
par contre je vois que pour la copie des données la sélection de la feuille de destination est inscrite lors de l'écriture de la macro .
C'est trés bien et ça fonctionne
je me demandais la chose suivante:
j'ai en gros 40 comptes différents chacun dans une feuille différente, dans le même classeur
Le conception des feuilles que je vais créer se fera par une simple copie de la feuille "6010" que je renommerai et aménagerai pour le nouveau compte.
Serait -il possible afin d'éviter d'avoir autant de macros que de comptes de pouvoir modifier la deuxième partie de la macro pour que la copie se fasse en référence à l'onglet actif. De la sorte je n'aurai qu'une macro pour tous les comptes, qui s'ajusterait en fonction de l'onglet actif.
Si pas faisable, pas grave.... mais il y a des genies parmi vous
cordialement
Bernard
 

cathodique

XLDnaute Barbatruc
Avec ce code, mais le nom des onglets doit être numérique comme tu l'as fait. Avec ce code, plus besoin de filtrer, le code ne prend que les lignes du compte concerné.
VB:
Sub extraction()
    Dim Tblo() As Variant, orders As ListObject
    Dim Cel As Range, f As Integer, Mafeuille As String
    ActiveSheet.Range("D12:H2500").ClearContents
    ''''''''''''''''''''''''''''''''
    Mafeuille = CInt(ActiveSheet.Name)

    Set orders = Sheets("Comptes").ListObjects("Tableau_dep")
    For Each Cel In orders.DataBodyRange.Columns(2).Cells
        If Cel.Value = Mafeuille Then
            f = f + 1
            ReDim Preserve Tblo(1 To 5, 1 To f)
            Tblo(1, f) = CDbl(Cel.Offset(0, -1).Value)  'format source monetaire
            Tblo(2, f) = Cel.Value
            Tblo(3, f) = Cel.Offset(0, 1).Value
            Tblo(4, f) = Cel.Offset(0, 2).Value
            Tblo(5, f) = Cel.Offset(0, 3).Value
        End If
    Next Cel

    ActiveSheet.Range("D12").Resize(UBound(Tblo, 2), UBound(Tblo, 1)) = Application.Transpose(Tblo)
Application.Transpose(tablo)
End Sub
 

Vieupot

XLDnaute Occasionnel
Merci Cathodique pour ta réponse. Rien à voir avec le code précédant et il va me falloir décoder tout ça pour bien comprendre le mécanisme et ça commence !
ReDim Preserve Tblo(1 To 5, 1 To f)
Tblo(1, f) = CDbl(Cel.Offset(0, -1).Value) 'format source monetaire
Je t'avoue être perdu ! Pourrais tu me m'expliquer cette ligne

De plus je commence a être exaspéré par ces pubs " Pub matic ''qui viennent s'insérer dans le forum et m'obligent à imprimer pour essayer de comprendre

Je vais tester et reviendrai certainement pour de plus amples explications, mais j'essaye d'abord par moi même
Cordialement
Bernard
 

cathodique

XLDnaute Barbatruc
Re,

Je t'avoue que je suis parti du code proposé par Jacky67 du post#2, je n'ai pas l'habitude de travailler avec les tableaux d'Excel (appelé plutôt table). J'ai pas mal pataugé, alors je suis reparti sur les variables tableaux (qu'on appelle Array).

En vba, on peut déclarer une variable tableau et y mettre les valeurs de toute une plage.

Mais revenons à ta question
ReDim Preserve Tblo(1 To 5, 1 To f) 'ici avant cette ligne le tableau Tblo n'était pas dimensionné
ReDim c'est pour le redimensionner et Preserve pour sauvegarder les valeurs misent auparavant

Tblo(1, f) = CDbl(Cel.Offset(0, -1).Value) 'ici Tblo est déclaré comme variant le transfert sur la feuille s'effectue en string (petit triangle rouge en haut à gauche de la cellule); la fonction CDbl transforme le string en chiffre (plus de triangle rouge).

Une fois le tableau en mémoire, on ne travaille plus sur la feuille mais en mémoire.
le code balaie tous les comptes et ne récupère que les données du compte concerné (soit l'onglet actif).

à la fin le résultat est injecté en une seule fois sur la feuille. J'espère que c'est un peu plus clair.

Moi aussi, je suis en phase d'apprentissage. Avec les arrays, l’exécution est plus rapide car se passe en mémoire. Je suis entrain de suivre ce tuto.
le code aurait pu être comme ci-dessous
VB:
Sub extraction()
    Dim Tblo() As Variant, orders As ListObject
    Dim Cel As Range, f As Integer
    ActiveSheet.Range("D12:H2500").ClearContents
    ''''''''''''''''''''''''''''''''
    Set orders = Sheets("Comptes").ListObjects("Tableau_dep")
    For Each Cel In orders.DataBodyRange.Columns(2).Cells 'on balaie chaque cellule de la colonne 2 (compte)
        If Cel.Value = CInt(ActiveSheet.Name) Then 'si cellule=nomFeuilActive converti en entier
            f = f + 1 ' compteur
            ReDim Preserve Tblo(1 To 5, 1 To f) 'à chaque tour le tblo est redimenssionné avec sauvegarde des données
'lignes ci-dessous les données récupérer
            Tblo(1, f) = CDbl(Cel.Offset(0, -1).Value)  'format source monetaire
           Tblo(2, f) = Cel.Value
            Tblo(3, f) = Cel.Offset(0, 1).Value
            Tblo(4, f) = Cel.Offset(0, 2).Value
            Tblo(5, f) = Cel.Offset(0, 3).Value
        End If
    Next Cel

'copie des données sur la feuille en une seule fois
    ActiveSheet.Range("D12").Resize(UBound(Tblo, 2), UBound(Tblo, 1)) = Application.Transpose(Tblo)
Application.Transpose(tablo)
End Sub
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Voilà, voilà, je suis enfin retombé sur les pieds.

Si tu tiens à garder ton code initial, je l'ai un peu allégé.
nb: le code doit être exécuter à partir de la feuille du compte concerné.
VB:
Option Explicit
Sub LesComptes()
' va sélectionner les données de ce compte dans les dépenses et recopie en compte concerné
    ActiveSheet.Range("D12:H2500").ClearContents
    With Sheets("Comptes")
        .ListObjects("Tableau_dep").Range.AutoFilter Field:=2, Criteria1:=CInt(ActiveSheet.Name) 'ActiveSheet.Name
        .ListObjects("Tableau_dep").Range.SpecialCells(xlCellTypeVisible).Copy
    End With

        Range("D11").PasteSpecial Paste:=xlPasteValues
        Range("I5") = Range("I6")
    
    If Sheets("Comptes").AutoFilterMode Then Sheets("Comptes").ShowAllData
End Sub
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
Merci Cathodique pour ta réponse. Rien à voir avec le code précédant

Je vais tester et reviendrai certainement pour de plus amples explications, mais j'essaye d'abord par moi même
Cordialement
Bernard
Re..
Si tu testes..:D teste aussi celui en Pj
Il y a une ligne de code dans le ThisWorkbook
La mise à jour des feuilles se fait à leurs sélection
J'ai supposé que toutes les feuilles ont la même structure

Bon courage
 

Pièces jointes

  • Test2 v2.xlsm
    350.1 KB · Affichages: 59

cathodique

XLDnaute Barbatruc
Salut Jacky,

Je t'avoue que je m'embrouille avec ListObject surtout en vba.

j'ai bidouillé un peu ton dernier fichier. Il me semble qu'avec un bouton de mise à jour c'est mieux.

ça sera moins gênant pour l'utilisateur, surtout s'il a beaucoup de saisie à faire sur la feuille comptes.

en plus je viens juste de rajouter des comptes et la mise à jour ne se fait pas (pas de création de feuilles).

Notre ami n'a pas encore réagi à nos proposition. Je crois qu'il a beaucoup avancé sur son projet avec ton

code de départ. Je comprends qu'il n'est pas évident de tout ou en partie revoir ce qu'il accompli.

Bon week-end.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87