Macro VBA pour appli

C@thy

XLDnaute Barbatruc
Bonjour à toutes et à tous,

suite aux conseils de Gaël, que je salue au passage, je me suis rendue compte que mon appli avait besoin de macros.

En effet, jusqu'à présent je copie (à la mimine) les valeurs à partir d'un classeur données_dossiers dans lequel j'ai des colonnes calculées (rajoutées en vert) vers un classeur tableau de bord qui exploite ces données.

le nombre très important de lignes complique la chose, je dois empêcher le recalcul automatique sinon c'est la galère, quand je rajoute des lignes je dois recopier les formules vers le bas etc...

Gaël m'a indiqé qu'il serait plus rapide (en termes de temps d'exécution) que mes tableaux de bord soient faits par macro.

Je vous livre un extrait de mon tableau de bord pour voir si cela vous semble possible.
Cet extrait a été réalisé en fonction d'une période déterminée (j'ai fait un filtre).
Voici le bébé.

Merci de me dire ce que vous en pensez, et si on peut l'aider à grandir (en sagesse!!!).

Bisous et bonne journée

C@thy
 

Pièces jointes

  • tdb.zip
    131.2 KB · Affichages: 90
  • tdb.zip
    131.2 KB · Affichages: 77
  • tdb.zip
    131.2 KB · Affichages: 73

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Je dois préciser que dans mes données d'origine j'ai été obligée de mettre un tiret à la place de vide car les calculs ne se faisaient pas bien, il me comptait les cellules vides comme remplies, mais c'est peut-être mes formules qui sont à revoir.

Voici le fichier d'origine (une extraction selon la période souhaitée)

Encore merci et mille bisous, je m'occupe de mon classeur TCD.

C@thy
 

Pièces jointes

  • dd.zip
    176.6 KB · Affichages: 101

ChTi160

XLDnaute Barbatruc
Re : Macro VBA pour appli

Salut C@thy

content de te croiser lol
je me permets cette intervention ,car cela n'est pas clair pour moi (qui ne traite pas ce genre de fichier lol)

peux tu ,pour une meilleur compréhension , nous expliques le pourquoi du comment Lol

j'ai cru comprendre que tu importes des données d'un fichier Source ,et que tu les colles dans ton fichier Cible en feuille Interactions (les colonnes en vert) y'a t'il une clé commune aux éléments des deux fichiers pour le report ???

quels sont les critères de report de la source vers la cible lol

Essaies si cela t'es possible , d'expliquer à partir de ce que tu as , ce que tu veux
Merci d'avance
Bonne journée
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Bonjour ChTi160,
actuellement, je ne m'embarasse pas, je copie toutes les colonnes, avec les valeurs, pas les formules, de mes feuilles interactions et incidents (il y en aura 2 autres en + par la suite)
soit il n'y a pas de critères, soit le critère est une période donnée (date de début date de fin col G et H pour interactions et F et G pour incidents.

Bises

P.S. mon coyote et ton train vont dans le même sens, je peux monter dans ton train, ça me reposera un peu les pattes? Lol

Bises

C@thy
 

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Coucou, c'est re-moi,

je reviens vers vous pour plus de précisions.

En amont de données dossiers j'ai 4 classeurs :

interactions incidents demandes articles.

Pour l'instant seuls les 2 1ers sont remplis.

Il faut, dans chacun des 4 classeurs aller chercher les données dans une période donnée
et les copier dans données dossier ensuite les calculs (colonnes vertes doivent être réajustés : ils doivent aller jusqu'à la dernière ligne copiée.
Le nombre de lignes peut varier en + ou en -
donc je pense qu'il faut garser juste les titres et la 1ère ligne de formules,
ensuite on colle les données dans la partie blanche puis on recopie les formules vers le bas.
La période est fournie dans données dossiers feuille Outils en C2 et D2
 

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Bon, j'avance,

voici ce que j'ai écrit :

Code:
Dim Chem$
  Chem = ThisWorkbook.Path & "\"
Const WbkDoDos = "donnees_dossiers BIS.xls"
 
    ThisWorkbook.Sheets("Interactions").Select
    with Selection
        .CurrentRegion.Select
        .ClearContents
        .Interior.ColorIndex = xlNone
    end with
    Windows(WbkDoDos).Open
    Sheets("Interactions").Select
    Selection.CurrentRegion.Select
    Selection.Copy
    Windows("indicateurs-pilotage-ogps BIS.xls").Activate
    Sheets("Interactions").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Selection.PasteSpecial Paste:=xlPasteFormats
End Sub
J'ai fait des classeurs BIS pour ne pas bousiller mes données, on ne sait jamais...
Ce code ne me satisfait qu'à moitié (et encore!)
En fait, ce que j'aurais voulu c'est le faire sans ouvrir le classeur source (données dossiers)
ensuite c'est prévoir une variante au cas où je ne copierais que les lignes dont la date est dans la période, mais ça, on peut faire un filtre si on a tout copié.

Bizzz

C@thy
 

vbacrumble

XLDnaute Accro
Re : Macro VBA pour appli

Bonjour tous

cathy:
Pour éviter le Select, je modifierai ainsi

Code:
With ThisWorkbook.Sheets("Interactions").Range("A1").CurrentRegion
        .ClearContents
        .Interior.ColorIndex = xlNone
End with

PS: tu peux aussi modifier le reste du code pour éviter les autre select
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

merci vbacrumble,
j'ai aussi corrigé ceci :
Workbooks.Open Chem & WbkDoDos

et je me suis aperçue que Thisworkbook n'est pas le classeur dans lequel est la macro, mais le classeur actif grrrr donc je dois redonner son nom, c'est mieux.

Bizzz

C@thy
 

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Code:
Sub Macro2()
'
' Macro enregistrée le 16/04/2009 par [EMAIL="C@thy"]C@thy[/EMAIL]
'
Dim Chem$
  Chem = ThisWorkbook.Path & "\"
Const WbkDoDos = "donnees_dossiers BIS.xls"
   Windows("indicateurs-pilotage-ogps BIS.xls").Activate
   Sheets("Interactions").Range("A1").Select
   With Selection
    .CurrentRegion.ClearContents
    .Interior.ColorIndex = xlNone
   End With
    Workbooks.Open Chem & WbkDoDos
    ActiveWorkbook.Sheets("Interactions").Range("A1").Select
    With Selection
    .CurrentRegion.Select
    .Copy
    End With
    Windows("indicateurs-pilotage-ogps BIS.xls").Activate
    ActiveWorkbook.Sheets("Interactions").Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues
     Selection.PasteSpecial Paste:=xlPasteFormats
        ThisWorkbook.Sheets("Incidents").Range("A1").Select
       With Selection
        .CurrentRegion.Select
        .ClearContents
        .Interior.ColorIndex = xlNone
        End With
    Workbooks.Open Chem & WbkDoDos
    ActiveWorkbook.Sheets("Incidents").Select
    With Selection
    .CurrentRegion.Select
    .Copy
    End With
    Windows("indicateurs-pilotage-ogps BIS.xls").Activate
    ActiveWorkbook.Sheets("Incidents").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Selection.PasteSpecial Paste:=xlPasteFormats
End Sub

C'est pas terrible mais ça marche!


C@thy
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Macro VBA pour appli

Bonjour à tous,
Salut C@thy:p

Tu pourrais également utiliser la méthode ADO
pour importer les données souhaitée sans ouvrir le classeur :p

Ci-joint le code avec des explications
Code:
' Penser à cocher : Microsoft ActiveX Data Object 2.6
' Dans Outils -> Références
Sub RecupDonnees()
  Dim VPath As String, FicBdD As String
  Dim Cn, rs As ADODB.Recordset
  Dim Mabdd As String, Crit As String
  Dim DerLig as Long
  ' En cas d'erreur
  On Error GoTo Err_Proc
  ' Initialisation des variables
  VPath = ActiveWorkbook.Path ' Chemin d'accès de la BdD
  FicBdD = "donnees_dossiers.xls" ' Fichier contenant la BdD
  Mabdd = "[Interactions$A1:AH65536]" ' Feuille et Plage contenant les données
  ' Pour les dates il faut inverser le jour et le mois = format US
  ' Dans l'exemple seulement les dates supérieures au 09/03, sachant que tu as des heures
  Crit = "[Date ouverture]>#03/10/2009#"  ' Critères de sélection des enregistrements
  ' Créer la Connexion ADO
  Set Cn = New ADODB.Connection
  ' Ouvrir la BdD
  Cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & VPath & "\" & FicBdD
  ' Ouvrir les enregistrements selon le criètère
  Set rs = Cn.Execute("SELECT * FROM " & Mabdd & " where " & Crit)
  ' Copier les enregistrements correspondants en A2
  With ThisWorkbook.Sheets("Interactions")
    ' Effacer le contenu des cellules avant l'import
    DerLig = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A2:AH" & DerLig).ClearContents
    ' Importer les enregistrements
    .Range("A2").CopyFromRecordset rs
  End With
 
 
Err_Proc:
  rs.Close
  Set rs = Nothing
  Cn.Close
  Set Cn = Nothing
End Sub

Ca t'oblige à cocher la référence ADO, mais ça fontionne super bien ;)

A toi de voir ...

A+
 
Dernière modification par un modérateur:

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Pfiou!

Ca c'est absolument GÉNIAL , Bruno,
quelle efficacité ce truc!!
Avec ma macro, en général je plante à l'effacement des données sur la feuille réceptrice.
Là, c'est vraiment top!!!

Un grand MERCI et une grosse bise.

Bonne journée

C@thy
 

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Bon, j'ai tout testé, ça marche super bien.

J'ai compris que la 1ère fois la feuille réceptrice ne doit pas être vide mais comporter la 1ère ligne, sinon je n'ai pas le nom des champs.

J'ai rajouté les instructions pour la feuille incidents, tout fonctionne au poil.

Maintenant j'ai voulu mettre la date dans une variable :

Dim Dat As String
Dat = "#03/01/2009#"
et plus loin :
Crit = "[Date ouverture]>&dat"

et là, ça plante sur rs.Close
variable objet ou variable de bloc with non définie.

j'ai essayé aussi
Dim Dat As Date
Dat = 03 /01 / 2009

Crit = "[Date ouverture]>#" & Dat & "#"
et là, pareil.

En fait, l'idéal serait de demander la date de début et la date de fin à l'utilisateur.
C'est possible ça???
(je sais que je t'en demande beaucoup... j'entends déjà certains invoquer ma réputation...
il paraît que j'en veux toujours plus... mais en attendant, c'est bien utile...)

Bisous et mille mercis pour ta macro, elle est SUPER!

C@thy
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Macro VBA pour appli

Ah je sais pourquoi ça bloque sur rs.Close
il ne trouve pas égalité avec le critère
donc il faudrait mettre Err_Proc:
juste avant End Sub
mais il faudrait un message d'erreur pour signaler que la copie n'a pas eu lieu
car on se retrouve avec les anciennes données.
Qu'en penses-tu?

Edit : autant pour moi,
avec
Dim Dat As Date
Dat = 03 /0 1 / 2009
ça fonctionne.

Ce qu'il faudrait maintenant c'est demander la date début ét la date fin à l'utilisateur.
Je creuse dans ce sens.

et si on mettait
Crit = "[Date ouverture]>#03/10/2009#"
Crit2 = "[Date Clôture]>#04/01/2009#"
Set rs = Cn.Execute("SELECT * FROM " & Mabdd & " where " & Crit & " where " & Crit2)???


Ah oui, je pense encore à un truc :
si on demande de saisir les dates elles seront an JJ/MM/AAAA
à moins qu'on fasse une liste déroulante avec les mois et les jours...
hum... ça se complique...

Bisous

C@thy
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal