Construire une base de donnees a partir d'un sous-tableau [Résolu/Fermé]

Signaler
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013
-
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
-
Bonjour,

j'ai un tableau avec bien une 50aine de colonnes, et j'ai besoin de creer une base de donnees avec les colonne 2, 3 et 5.
Pour ca, je voulais extraire ces colonnes dans un nouveau tableau qui serait dans une nouvelle feuille dans un premier temps, puis, avec un macro, transformer le nouveau tableau en base de donnees.

C'est possible?

Merci de toute aide,
cordialement


P.S.: Desole, pas d'accents sur mon clavier.




18 réponses

Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Bonjour,
Pour "extraire" tes 3 colonnes, tu n'a que de les copier sur une autre feuille ! quel est la difficulté ?
A+
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

La difficulte c'est que je voulais que ca soit dynamique: toute modif sur la colonne feuille1 affectera la colonne feuille2 :D J'aurais du mieux preciser

Mais j'ai avance de mon cote:
-J'ai 3 feuilles: Data, DatabaseCreator et Database
-Data: C'est le gros tableau
-DatabaseCreator: c'est le sous-tableau cree grace a la fonction =Data!B1 (etc...)
-Database: La ou il y aura ma BDD une fois le macro execute + un super bouton qui permet de la generer (macro assigne au bouton, donc).

Enfin, en theorie le bouton doit generer la BDD mais a l'execution de celui-ci, le programme me renvoie une erreur: 400 (et je ne comprends absolument pas la signification).

Le truc c'est que je commence le VBA aujourd'hui, donc je suis un peu paume encore. totu ce que j'ai fait c'est pomper du code. Le voici:

Sub to_table()
'Go to report and save data
    Sheets("Database").Select
    Range("B1:B3").Select
    Selection.Copy
'Test: where to paste previous copied data
    Sheets("DatabaseCreator").Select
    valueA2 = Range("A2").Value
    If valueA2 = "" Then
        Range("A2").Select
    Else
        Range("A1").Select
        Selection.End(x1Down).Select
        active_row = ActiveCell.Row
        Range("A" & active_row + 1).Select
    End If
'Saving the row where to insert data
    active_row = ActiveCell.Row
'Transpose paste
    Range("A" & active_row).Select
    Selection.PasteSpecial Pase:=x1PasteAllExceptBorders, Operation:=x1None, SkipBlanks:=False, Transpose:=True
'Delete report information
    Sheets("Database").Select
    Range("B1:B3").Select
    Selection.ClearContents
    Range("B1").Select
'Go back to report
    Sheets("DatabaseCreator").Select
    Range("A1").Select
End Sub
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Le plus simple...
Crée un classeur avec une 10aine de lignes sur chaque feuille (sans donnée confidentielle) et met le à disposition, sur www.Cjoint.com par exemple en donnant le lien dans un poste suivant.
A+
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

De toute facon je suis en train d'avancer sur un classeur exemple histoire de pas bousiller l'original en cas de fausse manip' :)

https://www.cjoint.com/?CDmcQveRLcZ
Pour rappel, mon but est de faire une BDD avec, ici, Nombre, Couleur et Pays.

Je mettrai le doc a jour si j'avance.
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Ok, oubliez le fichier joint ci-dessus.

J'ai 2 fichiers, un avec le tableau (https://www.cjoint.com/?CDmjyukk4Bi et un qui a le macro (https://www.cjoint.com/?CDmjDkmR3Kh
Le but est qu'en tapant le nom de n'importe quel fichier excel, en tapant le nom d'une page puis en donnant les colonnes desirees ainsi que leur taille et l'endroit ou elles commencent, je genere un nouveau tableau (option bonus: garder la meme mise en forme).
Le probleme c'est que j'arrive plus a copier les valeurs de mon fichier source alors qu'avant j'y arrivais et je ne vois pas l'erreur.

Si besoin d'infos pour les variables, n'hesitez pas.

P.S.: je sais qu' il y a une fonction pour savoir la fin d'un tableau (plutot que de la demander comme je le fais), mais je ne la connais pas et je ne sais pas m'en servir. Des infos?
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Tes deux liens sont "indisponibles" ?
Pour la colonne A...
    DerLig = Cells(Rows.Count, "A").End(xlUp).Row


Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Ah, bizarre.

Je refais:
source: https://www.cjoint.com/c/CDmksa88hOq
macro: http://cjoint.com/13av/CDmksyoNbcZ.htm

J'ai reussi a corriger l'erreur (par contre je sais pas comment), je peux maintenant copier les donnees de source au classeur du macro. Sauf que la je copie betement A1 et faudrait copier le tableau entier... On peut faire un Range("" & Range("L3")) ?

Je vais tester d'incrementer ton code, merci.

(les codes sous le bouton c'est du brouillon)
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

ca y est, a priori ca a marche. Un moyen de garder la mise en forme? (et non pas seulement le texte)

source (la meme): https://www.cjoint.com/c/CDmksa88hOq
macro: http://cjoint.com/13av/CDmlnAkWMEP.htm
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Tu a beaucoup de classeur susceptibles d'être ouvert ?
Tu a une façon bien compliquée d'entrer les coordonnées de ce que tu veux voir, connaître le Chemin et nom des classeurs, le nom des feuilles, les plages à importer...
Ceux qui vont se servir de ton appli devrons avoir une mémoire équivalente à deux éléphants... :-)
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Le truc c'est que ca doit marcher pour n'importe quel classeur donne. J'essaye de faire au plus simple possible mais j'ai appris le VBA hier, donc c'est pas encore top ^^

Si tu as des propositions, n'hesite pas.
Mais je n'ai pas encore fini, il manque quelques trucs et aussi le fait de pouvoir trier les donnees avec un menu deroulant, par exemple je clic sur lettre et ca m'affiche toutes les lettres disponibles puis si je selectionne "A", ca ne m'affichera que les lignes avec des lettres A. Et ca j'ai pour l'instant aucune idee de comment je vais faire (bien que j'aie google pour m'aider !)

Enfin, je donne plus d'infos plus tard, la j'ai pas trop le temps...
Mais toujours ouvert aux propositions !
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Je verrais plutôt...
Sélectionner et ouvrir un classeur à partir de l'explorateur de fichier (par VBA).
Sélectionner la plage à traiter avec un inputBox pour un Range (par VBA).
pour la suite faudrait voir exactement ce que tu veux

EDIT : pour la sélection des lettres ça peu aussi se faire facilement avec un filtre automatique, que l'ont peu aussi créer par VBA.

Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Un exemple de ce que je veux dire dans mon poste précédant.
Classeur exemple
A+
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Tu peux me le linker par cjoint plutot? Il semblerait que ce soit un des rares sites de partage qui marche la ou je me situe ^^
Le but ultime est de faire un tableau croise dynamique avec des donnes recoltees sur plusieurs fichiers excels et qui peuvent etre mises a jours. Par exemple si j'ai une colonne qui s'appelle 'Lettres' et que j'en ai une nouvelle, je les fusionne. Mais bon, ca a pas l'air tres dur a faire, ce qui m'embete c'est de rendre l'appli facilement utilisable ^^
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

En suivant tes conseils, j'avance peu a peu sur l'harmonisation pour l'utilisateur.
Il y a moyen de selectionner une feuille avec un inputbox?

Set ws = Application.InputBox("Please select your Sheet with your mouse", "SPECIFY SHEET", Type:=8)  
On Error GoTo 0  
    If ws Is Nothing Then  
        Exit Sub  
    End If


J'ai essaye ca mais ca marche pas... voici le nouveau doc au passage: https://www.cjoint.com/?CDpe5DKMcVX
J'avance peu a peu, je vais essayer d'enlever tous les champs a remplir.
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Voila, j'ai suivi tes conseils et ca rends mieux :D
J'arrive juste pas a selectionner les feuilles avec la souris...
Pour rajouter un filtre auto;atique, c'est comment?
Nouvelle version plus clean: https://www.cjoint.com/?CDpiSumAh5I

(j'espere que je flood pas trop ^^)
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Voila, j'ai suivi tes conseils et ca rends mieux :D
ça rends mieux ? ça ressemble plus à rien oui....

Quand tu sélectionne une plage y à pas besoin de connaître le nom de la feuille
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Hey, comment ca ca ressemble plus a rien? xD

J'ai enleve cette histoire de feuille, mais dans ce cas si j'ai envie de prendre une colonne feuill2 ca ne marche plus. Je dois m'etre plante quelque part ou oublie un truc. Une solution? https://www.cjoint.com/?CDpjY45VygO

Mais pourquoi ca ressemble a rien? Il y a 3 boutons, la premiere feuille est faite pour etre temporaire, la deuxieme va enregistrer les tableaux extraits pour toujours (en mettant a la suite des colonnes qui auraient le meme nom).
"Select Data" prends les colonnes des autres docs
"Import Data" va mettre definitivement les colonnes sur l'autre feuille en respectant mes contraintes dites ci-dessus (en construction)
"Clear" pour effacer feuill1
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
reprend mon exemple et suis le code, ça ira mieux.
Laisse les fonctions séparées, c'est plus clair
Pour effacer la feuille c'est sheets("Feuil1").Cells.ClearContents, mais si tu examinais mon code tu l'aurais déjà vu.

Mon code détecte automatiquement si c'est une sélection par colonne ou par plage
Tu posais aussi la question sur autofilter !! Egalement dans mon code.

Bref, examine déjà tout ça et quand tu aura compris reviens avec quelque chose de net et concret.
A+
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Je ne peux pas lire ton code, cf la premiere ligne du premier commentaire de ton post: Tu peux me le linker par cjoint plutot? Il semblerait que ce soit un des rares sites de partage qui marche la ou je me situe ^^

Je n'ai pas acces au site par lequel tu es passe.
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Me semblais bien que tu n'avais pas regardé mon exemple, car la réponse à tes questions y est proposée.

https://www.cjoint.com/?CDqlMMrhk2t
A+
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Hmm, merci, mais je ne comprends pas l'utilite de ce bloc:

    'Copie la plage sélectionnée  
    S = Plage.Address  
    S = Replace(S, "$", "")  
    'Voir si plage en colonne(s) ou en cellule(s)  
    TB = Split(S, ":")  
    If Len(TB(0)) = 1 Then 'par colonne  
        Plage.Copy Wks.Columns(1)  
    Else 'Par cellules  
        Plage.Copy Wks.Range("A1")  
    End If


J'ai l'impression qu'un simple
Plage.Copy Wks.Range("A1")  
suffit.

Bon, tu vas me taper (mais vraiment) mais voila ce que j'ai. Les 3 premiers boutons sont importants, le reste c'est du brouillon. J'avais cree le deuxieme bouton avant de voir ton code, donc le code est horriblement degueulasse (mais il marche :p). Et j'ai pas encore separe les fonctions.
https://www.cjoint.com/?CDseJln3B67
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
je voulais extraire ces colonnes dans un nouveau tableau qui serait dans une nouvelle feuille
Essaie un peu d'extraire ces colonnes avec ton code !! (Sélectionner les colonnes)
Messages postés
40
Date d'inscription
mercredi 2 mai 2012
Statut
Membre
Dernière intervention
3 mai 2013

Et il y a moyen de faire un transfert des donnees excel a SQL Server?
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Je ne connais pas SQL Server, crée une nouvelle question et si celle-ci est résolue clic sur le lien "résolu" en haut à gauche de ta 1ère question.
A+