Créer un base de données par macro Excel

berlan

XLDnaute Nouveau
Bonjour,

J'ai un fichier Excel qui me permet de suivre différents centres (1 par onglet), je souhaite faire une base de donnée me permettant de faire tourner des états de synthèse (résultats cumulé des centres, ...). Pour cela j'ai renseigné sur la première colonne de chaque onglets la lettre D en face des lignes devant faire parties de la base de données.

Mon problème : J'ai d'abord commencé ma BDD par un système de sommeprod, mais vu la taille du fichier, les calculs deviennent beaucoup trop long (30s à chaque changement / 1000 lignes de BDD)

Voici la formule utilisée :

=SOMMEPROD(SOMME.SI(INDIRECT($A$1:$A$15&"!A:A");A17;INDIRECT($A$1:$A$15&"!M:M")))

*J'ai utilisé une formule indirect pour reprendre les noms des onglets


Il me semble qu'il devient nécessaire de passer par une macro excel du genre : Si A1=D alors A1 sinon regarder si A2=D alors A2 puis passer à la ligne suivante.... et ce pour tous mes onglets et pour un certains nombres de colonnes...

Je suis un peu perdu :confused:... merci de votre aide.

Berlan:)
 

Excel-lent

XLDnaute Barbatruc
Re : Créer un base de données par macro Excel

Bonjour et bienvenu sur le forum en tant que membre actif,

Bref, tu veux une macro qui se lance suite à un clic sur un bouton, et que cette dernière créé et/ou compléte ta BD déjà existante?

Tu es ici depuis le mois de Mars, tu as donc du remarquer que pour une question de ce genre, sans exemple concret, difficile de t'aider.

De plus, peux-tu nous préciser ton niveau en VBA (macro)?

A te lire

Cordialement
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : Créer un base de données par macro Excel

Salut,

Inconvénient de ta méthode, comme tu l'as remarqué, la BD est mise à jours à chaque modification. Donc forcément ton fichier rame.

La macro te permettra de réduire légèrement le temps d'exécution, mais surtout se lancera que lorsque tu le demanderas.

Bref, en effet pour ton cas, passer au VBA me semble une bonne idée

A+
 

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

Bonjour à vous,

Pour commencé, mon niveau est débutant en VBA (je sais créer un bouton et lui rattaché une macro... mais j'ai beaucoup plus de mal a créer la macro proprement dite), ensuite je vous joint un exemple "simplifié" d'onglets à partir desquels je souhaiterais extraire dans un onglet BDD les lignes commençants par la lettre "D"...

Merci de votre aide :)

Berlan
 

Pièces jointes

  • Exemple base de travail.xls
    17.5 KB · Affichages: 250

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

Je vous joint ici une version plus détaillée de mon fichier avec 2 onglets une première forme de BDD...

Merci d'avance.

Berlan
 

Pièces jointes

  • Exemple base de travail v2.xls
    17 KB · Affichages: 230

ROGER2327

XLDnaute Barbatruc
Re : Créer un base de données par macro Excel

Bonsoir berlan
Essayez cette procédure :
Code:
[COLOR="DarkSlateGray"][B]Sub toto()
Dim feColl, sDat(), f%, oDat, i&, j&, n&
   feColl = Array("Cout1", "Cout2")
   ReDim sDat(1 To 15, 1 To 1)
   For f = 0 To UBound(feColl)
      With Sheets(feColl(f))
         oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 15)).Value
      End With
      For i = 1 To UBound(oDat, 1)
         If Left$(oDat(i, 1), 1) = "D" Then
            n = n + 1
            ReDim Preserve sDat(1 To 15, 1 To n)
            For j = 1 To 15
               sDat(j, n) = oDat(i, j)
            Next j
         End If
      Next i
   Next f
   sDat = WorksheetFunction.Transpose(sDat)
   With Sheets("BDD")
      i = WorksheetFunction.Max(4, .Cells(.Rows.Count, 1).End(xlUp).Row)
      .Cells(i, 1).Resize(UBound(sDat, 1), 15) = sDat
   End With
End Sub[/B][/COLOR]
ROGER2327
#3727


Vendredi 6 Gidouille 137 (Saint Dieu, retraité, SQ)
2 Messidor An CCXVIII
2010-W24-7T20:13:20Z
 

ROGER2327

XLDnaute Barbatruc
Re : Créer un base de données par macro Excel

Re...
Voici le code paramétré :
Code:
[COLOR="DarkSlateGray"][B]Sub toto()
Dim feColl, sDat(), f%, oDat, i&, j&, n&
Dim pCol%, pLig$
[COLOR="Sienna"]'=================================================================
'PARAMETRES :[/COLOR]
   pCol = 15 [COLOR="Sienna"]'Nombre de colonnes à traiter[/COLOR]
   pLig = 4 [COLOR="Sienna"]'Première ligne utilisable dans la feuille "BDD"[/COLOR]
   feColl = Array("Cout1", "Cout2") [COLOR="Sienna"]'Liste des feuilles de données
'=================================================================[/COLOR]
   ReDim sDat(1 To pCol, 1 To 1)
   For f = 0 To UBound(feColl)
      With Sheets(feColl(f))
         oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, pCol)).Value
      End With
      For i = 1 To UBound(oDat, 1)
         If Left$(oDat(i, 1), 1) = "D" Then
            n = n + 1
            ReDim Preserve sDat(1 To pCol, 1 To n)
            For j = 1 To pCol
               sDat(j, n) = oDat(i, j)
            Next j
         End If
      Next i
   Next f
   sDat = WorksheetFunction.Transpose(sDat)
   With Sheets("BDD")
      i = WorksheetFunction.Max(pLig, .Cells(.Rows.Count, 1).End(xlUp).Row)
      .Cells(i, 1).Resize(UBound(sDat, 1), pCol) = sDat
   End With
End Sub[/B][/COLOR]
ROGER2327
#3728


Vendredi 6 Gidouille 137 (Saint Dieu, retraité, SQ)
2 Messidor An CCXVIII
2010-W24-7T20:44:01Z
 

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

Merci beaucoup, c'est super ça marche !!!

Voila ce que ca donne :

Sub BDD()
Dim feColl, sDat(), f%, oDat, i&, j&, n&
feColl = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n")
ReDim sDat(1 To 57, 1 To 1)
For f = 0 To UBound(feColl)
With Sheets(feColl(f))
oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 57)).Value
End With
For i = 1 To UBound(oDat, 1)
If Left$(oDat(i, 1), 1) = "D" Then
n = n + 1
ReDim Preserve sDat(1 To 57, 1 To n)
For j = 1 To 57
sDat(j, n) = oDat(i, j)
Next j
End If
Next i
Next f
sDat = WorksheetFunction.Transpose(sDat)
With Sheets("BDD")
i = WorksheetFunction.Max(6, .Cells(.Rows.Count, 1).End(xlUp).Row)
.Cells(i, 1).Resize(UBound(sDat, 1), 57) = sDat
End With
End Sub

Une dernière question : si je fais plusieurs fois la macro les lignes se cumulent les unes en dessous des autres... comment faire pour qu'il s'agisse toujours d'une MAJ de la BDD avec 6 en 1ère ligne ?

Merci
 

ROGER2327

XLDnaute Barbatruc
Re : Créer un base de données par macro Excel

Re...
Essayez ce code :
Code:
[COLOR="DarkSlateGray"][B]Sub BDD()
Dim feColl, sDat(), f%, oDat, i&, j&, n&
Dim pCol%, pLig$
[COLOR="Sienna"]'=================================================================
'PARAMETRES :[/COLOR]
   pCol = 57 [COLOR="Sienna"]'Nombre de colonnes à traiter[/COLOR]
   pLig = 6 [COLOR="Sienna"]'Première ligne utilisable dans la feuille "BDD"[/COLOR]
   feColl = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n") [COLOR="Sienna"]'Liste des feuilles de données
'=================================================================[/COLOR]
   ReDim sDat(1 To pCol, 1 To 1)
   For f = 0 To UBound(feColl)
      With Sheets(feColl(f))
         oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, pCol)).Value
      End With
      For i = 1 To UBound(oDat, 1)
         If Left$(oDat(i, 1), 1) = "D" Then
            n = n + 1
            ReDim Preserve sDat(1 To pCol, 1 To n)
            For j = 1 To pCol
               sDat(j, n) = oDat(i, j)
            Next j
         End If
      Next i
   Next f
   sDat = WorksheetFunction.Transpose(sDat)
   With Sheets("BDD")
      .Cells(pLig, 1) = " "
      .Range(.Cells(pLig, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, pCol)).ClearContents
      .Cells(pLig, 1).Resize(UBound(sDat, 1), pCol) = sDat
   End With
End Sub[/B][/COLOR]
(Il est inutile de reporter les valeurs des paramètres partout dans la procédure : les variables pCol et pLig sont là pour ça...)​
ROGER2327
#3729


Vendredi 6 Gidouille 137 (Saint Dieu, retraité, SQ)
2 Messidor An CCXVIII
2010-W24-7T21:32:21Z
 

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

Bonjour,

Suite à l'utilisation de cette macro dans un autre suivi, je rencontre à nouveau un problème... En effet, la création de la BDD de déroule très très bien mais dans une série de colonne concernant des dates (jj/mm/aaaa), la dernière colonne de date apparait comme suit : mm/jj/aaaa !! alors que les autres dates fonctionnent correctement :confused:.

J'ai vérifié les format de date dans les onglets d'origine mais rien de particulier.

Ce que je ne comprend pas c'est pourquoi 2 formats de date différents se cotoient ?

Merci d'avance.

Berlan

Ci-dessous, pour rappel , le code :

Sub MAJ_RAO()
Dim feColl, sDat(), f%, oDat, i&, j&, n&
Dim pCol%, pLig$
'=================================================================
'PARAMETRES :
pCol = 44 'Nombre de colonnes à traiter
pLig = 367 'Première ligne utilisable dans la feuille "Synthese"
feColl = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k") 'Liste des feuilles de données
'=================================================================
ReDim sDat(1 To pCol, 1 To 1)
For f = 0 To UBound(feColl)
With Sheets(feColl(f))
oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, pCol)).Value
End With
For i = 1 To UBound(oDat, 1)
If Left$(oDat(i, 1), 1) = "D" Then
n = n + 1
ReDim Preserve sDat(1 To pCol, 1 To n)
For j = 1 To pCol
sDat(j, n) = oDat(i, j)
Next j
End If
Next i
Next f
sDat = WorksheetFunction.Transpose(sDat)
With Sheets("Synthese")
.Cells(pLig, 1) = " "
.Range(.Cells(pLig, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, pCol)).ClearContents
.Cells(pLig, 1).Resize(UBound(sDat, 1), pCol) = sDat
End With
End Sub
 

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

En fait toutes les dates sont fausses, cela ne m'avai pas sauté aux yeux car les jours était > à 12 donc > au nombre de mois.

En synthèse :

Quand la date est du type jj/mm/aaaa avec jj>12 -> Ca marche !
Quand la date est du type jj/mm/aaaa avec jj<12 -> Ca ne marche pas (mm/jj/aaaa) !

Merci de votre aide.

Berlan
 

berlan

XLDnaute Nouveau
Re : Créer un base de données par macro Excel

Re-bonjour,

Je me permet de compléter une nouvelle fois ma requête, car après quelques recherches, mon problème vient donc de l'interprétation de VBA :

"La meilleure méthode l'utilisation de la fonction DateValue() qui fait fi du format date du panneau de configuration. Comme chaque composante (année, mois, jour) de la fonction est spécifiée dans les paramètres de la fonction, cela ne laisse aucune place à Excel (vba) à l'interprétation."

Mais comment intégrer ce paramètre dans ma macro sachant que j'appelle des lignes composées de "montants", "Textes", ... et de "DATES" !!

Merci de votre aide car là je suis perdu...

Berlan
 

Discussions similaires

Statistiques des forums

Discussions
312 504
Messages
2 089 076
Membres
104 021
dernier inscrit
abdesslem