Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

splitter une BDD

7 réponses
Avatar
max-75
Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de donn=E9es dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je cr=E9e un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=3Dnom du champs =E0 considerer
La macro cr=E9e autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est cr=E9=E9 pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copi=E9es/
coll=E9es et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim

7 réponses

Avatar
JB
Bonjour,

Crée un onglet par zone:

Sub ExtraitOnglets()
Application.DisplayAlerts = False
For i = 1 To Sheets.Count - 2
Sheets(3).Delete
Next i
Set mondico = CreateObject("Scripting.Dictionary")
For Each c In [zone]
If Not mondico.exists(c.Value) And c.Value <> "" Then
mondico.Add c.Value, c.Value
End If
Next
For Each c In mondico.items
Sheets("BD").[G1] = c
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = c
Sheets("BD").Range("A1:C10000").AdvancedFilter
Action:=xlFilterCopy, _
CriteriaRange:=Sheets("BD").Range("E1:E5"), CopyToRange:=[A1]
Next c
End Sub

http://cjoint.com/?lvjfylLB6a

JB
http://boisgontierjacques.free.fr


On 21 nov, 00:15, max-75 wrote:
Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim


Avatar
LSteph
Bonjour,

... je considère le cas d'école proposé comme pouvant s'assortir en
réalité d'autres sortes d'informations.

AMHA oui! c'est par là qu'il faut commencer:
créer la table Pays-Continents !

Solution simple (en deux temps):

1-ajout à ta base d'un champ continent dont le contenu est obtenu par
formule style: =index(continents;equiv(pays;payscontinents;0))

2-Tableau croisé dynamique, dispositions champ de page Continent
champ de ligne Nom(Sous-total NB),Pays Véhicule
barre d'outil ou menu TCD (selon cas, version):
Afficher les pages.
par... Continent

Solution selon ce que tu demandes(plus compliquée):

La création d(ajout suppression modification)d'onglet ne sera plus
qu'une disposition qu'il conviendra d'accorder in fine avec le reste,
si l'on a traité d'abord
le procédé à savoir dans quel ordre arrivent les éléments:
AMHA c'est encore par là qu'il faut commencer:
créer la table Pays-Continents et aussi une avec les véhicules censés
exister.

(Si c'est un tableau qui arrive tout fait avec ses entrées dedans,
l'intégrité est déjà rompue, sauf si de ton poste tu peux récupèrer in
temporis, exactement la table qui a servi...
donc ce qu'il faut faire dans ce cas c'est la reproduire)
........

Donc..
La saisie ou entrée des données se fait bien dans ta base..§?!
...ou via un formulaire qui alimente ta base.

Tu entres un nom, ensuite un Pays...Ah!..
si on veut le respect d'une intégrité
à ce stade il faut une liste déjà établie donc référence à une table qui
gère Pays ,...Une table qui gère les véhicules.

Le pb reste de savoir exactement A quel moment? tu fais quoi ou tu veux
que ceci cela déclenche
Ceci est trop confus:
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'intégrité est
maintenue.
si tu veux préciser.. on doit pouvoir te faire qqchose de bien


(je dois quitter mais pourrais reprendre plus tard ce fil)

@+

lSteph



Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim


Avatar
max-75
On 21 nov, 09:05, JB wrote:
Bonjour,

Crée un onglet par zone:

Sub ExtraitOnglets()
Application.DisplayAlerts = False
For i = 1 To Sheets.Count - 2
Sheets(3).Delete
Next i
Set mondico = CreateObject("Scripting.Dictionary")
For Each c In [zone]
If Not mondico.exists(c.Value) And c.Value <> "" Then
mondico.Add c.Value, c.Value
End If
Next
For Each c In mondico.items
Sheets("BD").[G1] = c
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = c
Sheets("BD").Range("A1:C10000").AdvancedFilter
Action:=xlFilterCopy, _
CriteriaRange:=Sheets("BD").Range("E1:E5"), CopyToRange:=[A1]
Next c
End Sub

http://cjoint.com/?lvjfylLB6a

JBhttp://boisgontierjacques.free.fr

On 21 nov, 00:15, max-75 wrote:



Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim- Masquer le texte des messages précédents -


- Afficher le texte des messages précédents -


Bonjour JB,

c'est fondamentalement ce que je recherche.
l'idee est de mettre cette macro dans ma 'boite à outils' car je
travaille avec des extractions de base de donnee et il se peut que
demain, on me demande 1 onglet par type de vehicule (à moteur,
traction animale....)
J'en demande peut etre beaucoup mais l'idee serait de "customiser'
cette macro.
Sur l'onglet table que j'ajoute à mon extraction, je place en A1
l'entete champs à prendre en compte et je cree moi-meme la
correspondance en A et B. Ainsi je ne touche pas à l'onglet qui
contient l'extraction.
il faudrait prevoir le cas d'un onglet 'autre' au cas ou un
enregistrement ne serait pas ds la table de correspondance
il serait bien d'avoir un pop up qui determine le nombre de champs
copier pour verifier visuellement qu'il n'en manque pas.
A la fin, je supprime mon onglet table et me trouve avec un classeur
propre.

c'est peut etre abuser mais en tt cas, le classeur fournit est dejà
tres bien

Merci beaucoup


Avatar
lSteph
Re,

donc voilà l'idée par macro:
http://cjoint.com/?lvp2AAeKb8

et voici le code

Option Explicit

Sub Créonglet()
Dim c As Range, i As Long, meszones As New Collection, _
mazone As String, sh As Worksheet
Application.ScreenUpdating = False
With meszones
Do While .Count > 0
.Remove 1
Loop
End With
On Error Resume Next
For Each c In Range("c2", _
[a65536].End(xlUp).Offset(0, 2).Address).Cells
mazone = WorksheetFunction.VLookup(c.Value, _
[PaysZone], 2, 0)
meszones.Add mazone, CStr(mazone)
Next
meszones.Add "autres", "autres"
On Error GoTo 0
For Each sh In ThisWorkbook.Sheets
Application.DisplayAlerts = False
If sh.Index > 2 Then sh.Delete
Application.DisplayAlerts = True
Next
For i = 1 To meszones.Count
Sheets.Add after:=Sheets(Sheets.Count)
If IsEmpty(meszones(i)) Then
ActiveSheet.Name = "Autres"
Else
ActiveSheet.Name = meszones(i)
End If

Feuil1.[a1:d1].Copy _
Destination:=Worksheets(CStr(meszones(i))).[a1]

Next
Call MiseAjour
End Sub

Sub MiseAjour()
Dim c As Range, myF As String
Feuil1.Activate
For Each c In Feuil1.Range("A2", _
[a65536].End(xlUp).Address).Cells
myF = ""
On Error Resume Next
myF = WorksheetFunction.VLookup(c.Offset(, 2), _
[PaysZone], 2, 0)
On Error GoTo 0
If myF = "" Then myF = "autres"
Range(c.Address, c.Offset(, 4)).Copy _
Destination:=Worksheets(myF).[a65536].End(xlUp)(2)
Next

End Sub

'lSteph



On 21 nov, 00:15, max-75 wrote:
Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim


Avatar
JB
http://cjoint.com/?lvrDHLS3HM

JB

On 21 nov, 12:36, max-75 wrote:
On 21 nov, 09:05,JB wrote:





Bonjour,

Crée un onglet par zone:

Sub ExtraitOnglets()
Application.DisplayAlerts = False
For i = 1 To Sheets.Count - 2
Sheets(3).Delete
Next i
Set mondico = CreateObject("Scripting.Dictionary")
For Each c In [zone]
If Not mondico.exists(c.Value) And c.Value <> "" Then
mondico.Add c.Value, c.Value
End If
Next
For Each c In mondico.items
Sheets("BD").[G1] = c
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = c
Sheets("BD").Range("A1:C10000").AdvancedFilter
Action:=xlFilterCopy, _
CriteriaRange:=Sheets("BD").Range("E1:E5"), CopyToRange:=[A1 ]
Next c
End Sub

http://cjoint.com/?lvjfylLB6a

JBhttp://boisgontierjacques.free.fr

On 21 nov, 00:15, max-75 wrote:

Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne c e
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table .
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim- Masquer le texte des messages précédents -


- Afficher le texte des messages précédents -


BonjourJB,

c'est fondamentalement ce que je recherche.
l'idee est de mettre cette macro dans ma 'boite à outils' car je
travaille avec des extractions de base de donnee et il se peut que
demain, on me demande 1 onglet par type de vehicule (à moteur,
traction animale....)
J'en demande peut etre beaucoup mais l'idee serait de "customiser'
cette macro.
Sur l'onglet table que j'ajoute à mon extraction, je place en A1
l'entete champs à prendre en compte et je cree moi-meme la
correspondance en A et B. Ainsi je ne touche pas à l'onglet qui
contient l'extraction.
il faudrait prevoir le cas d'un onglet 'autre' au cas ou un
enregistrement ne serait pas ds la table de correspondance
il serait bien d'avoir un pop up qui determine le nombre de champs
copier pour verifier visuellement qu'il n'en manque pas.
A la fin, je supprime mon onglet table et me trouve avec un classeur
propre.

c'est peut etre abuser mais en tt cas, le classeur fournit est dejà
tres bien

Merci beaucoup- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -




Avatar
lSteph
..
voici avec le petit rapport d'execution

http://cjoint.com/?lvsdRIT4iO

--
lSteph

On 21 nov, 00:15, max-75 wrote:
Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim


Avatar
max-75
On 21 nov, 18:05, lSteph wrote:
..
voici avec le petit rapport d'execution

http://cjoint.com/?lvsdRIT4iO

--
lSteph

On 21 nov, 00:15, max-75 wrote:



Bonjour,

Je me suis apercu qu'il m'arrivait regulierement de splitter le
contenu de bases de données dans des onglets.
Afin de me faciliter le travail, je souhaiterais l'automatiser par une
macro...si vous pouviez m'aider.

Pour pouvoir l'utiliser regulierement, voici comment je vois les
choses:
Soit une bdd:
Nom.............Pays.......Vehicule
Jean.............FR.........Velo
Paul.............US..........Voiture
Jacques........JP..........Pousse-pousse
Patrick..........FR..........trotinette
Hans.............DE..........voiture

Je crée un onglet "table" par ex
A B
Pays........Zone
FR............Europe
US...........Amerique
JP............Asie
DE............Europe

ou A1=nom du champs à considerer
La macro crée autant d'onglet que de valeur unique en B, lui donne ce
nom et copie les lignes en fonction de la table.
Un onglet "autre" est créé pour les valeurs non contenu dans table.
Enfin, un pop up sert de log et indique le nombre de ligne copiées/
collées et un max d'info afin de verifier que l'integrite est
maintenue.

Merci d'avance pour votre aide.

AKim- Masquer le texte des messages précédents -


- Afficher le texte des messages précédents -


nikel
merci bcq