
|
|
Auteur
|
Message
|
1
|
|
|
|
Bonjour à tous!
Vos aides me seront d'un grand secours, voilà mon souci:
j'ai deux feuilles "formulaire" et "base de données".Dans formulaire on trouve colonne a,b,c,ect..(Nom, prenom adresse, ect..)et un bouton enregister. Dans "base de donnée" la même chose sans le bouton.Mon souci est une fois avoir remplie mon formulaire et valider il s'enregistre dans la base de donnée ok, mais si jamais je remplie dans formulaire seulement le "nom" et "l'adresse" et j'enregistre, la prochaine saisi va combler la cellule vide ce qui fausse tout.Comment faire pour enregistrer et passer a la ligne suivante memesi je n'ai pas tout remplie.
J'espère que vous aviez compris, et merci d'avance pour les réponses.
|
|
[Entraide informatique]
|
|
|
Bonsoir, vous travaillez avec quel programme
-------
![[:fml:8] [:fml:8]](/data/globaldata/usmilies/fml-8.gif) ...Merci d'éditer vos posts pour un rajout d'information quelconque ...
N'achetez plus de pc de marque, montez le ou faites le montez sur http://www.materiel.net/ pour 30 €
|
|
|
|
|
|
Bonsoir, je travaille avec excel 2002.
|
|
|
|
|
Marcusio a écrit :
Bonjour à tous!
Vos aides me seront d'un grand secours, voilà mon souci:
j'ai deux feuilles "formulaire" et "base de données".Dans formulaire on trouve colonne a,b,c,ect..(Nom, prenom adresse, ect..)et un bouton enregister. Dans "base de donnée" la même chose sans le bouton.Mon souci est une fois avoir remplie mon formulaire et valider il s'enregistre dans la base de donnée ok, mais si jamais je remplie dans formulaire seulement le "nom" et "l'adresse" et j'enregistre, la prochaine saisi va combler la cellule vide ce qui fausse tout.Comment faire pour enregistrer et passer a la ligne suivante memesi je n'ai pas tout remplie.
J'espère que vous aviez compris, et merci d'avance pour les réponses. :??: Salut
t'as cas modifier ton code pour qu'il ne le fasse plus
Je crois que tu t'es trompé de site : ici, il n'y a pas de devin ! Quoique ...
Vraisemblablement ta macro utilise une boucle dans le style
for x=1 to (dernier numéro de colonne
Sheets("Données").cells(1,x).end(xldown).offset(1,0)=Sheets("Formulaire").cells(2,x)
next
ou un code similaire
C'est-à-dire que tu recalcules pour chaque colonne, la dernière cellule renseignée. Ores, ce que tu dois faire est de remplir les cellule de chaque colonne dans une ligne unique et pas la dernière ligne de chaque colonne.
Quand on travaille en base de données, il faut raisonner en "mode base de données".
Chaque ligne représente un enregistrement, Chaque colonne un Champ
Le but est que l'enregistrement ne contienne que les champs le concernant, mais tous les champs, qu'ils soient vides ou non.
Pour ça, il faut "identifier" chaque enregistrement de manière unique.
C'est ce qu'on appelle un clé. Celle-ci ne peut contenir de champs vides.
Comme c'est une base simple, ton identifiant sera le nom, ou le nom+prénom)
Donc, ta macro actionnée par ton bouton doit
- Vérifier que la cellule "formulaire" nom, n'est pas vide
- Vérifier que le nom n'existe pas dans la feuille "BdD"
- calculer la dernière première ligne vide dans cette colonne, lui ajouter 1, et la mettre en Variable(type long)
- transférer chacune das colonnes de formulaire de la ligne de saisie vers chacune des colonnes de "BdD" à la ligne calculée précédemment
- supprimer la ligne de saisie de formulaire
Si tu ne sais pas faire, mets ton code actuel dans un poste et avec les données, on pourra t'aider : ce n'est pas parca qu'excel est "magique" que ceux qui travaillent avec sont des magiciens
A+
|
|
|
|
|
Merci à toi pour les conseilles, effectivement, je ne connais pas trop le vba, il sagit de ceci:
Sub transpose_dans_tableau()
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("B6:B15").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurC2 = Range("C2").Value
If valeurC2 = "" Then
Range("C2").Select
Else
Range("C1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("C" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("C" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("B6:B15").Select
Selection.ClearContents
Range("B6").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("C1").Select
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("F6:F10").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurM2 = Range("M2").Value
If valeurM2 = "" Then
Range("M2").Select
Else
Range("M1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("M" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("M" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("F6:F10").Select
Selection.ClearContents
Range("F6").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("M1").Select
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("F14").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurR2 = Range("R2").Value
If valeurR2 = "" Then
Range("R2").Select
Else
Range("R1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("R" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("R" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("F14").Select
Selection.ClearContents
Range("F14").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("R1").Select
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("H7").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurB2 = Range("B2").Value
If valeurB2 = "" Then
Range("B2").Select
Else
Range("B1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("B" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("B" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("H7").Select
Selection.ClearContents
Range("H7").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("B2").Select
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("H10").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurA2 = Range("A2").Value
If valeurA2 = "" Then
Range("A2").Select
Else
Range("A1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("A" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("A" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("H10").Select
Selection.ClearContents
Range("H10").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("A1").Select
'Atteindre le formulaire et memoriser les données
Sheets("formulaire").Select
Range("F12").Select
Selection.Copy
' Test pour déterminer la ligne où coller les infos dans le tableau
Sheets("Base de données").Select
valeurS2 = Range("S3").Value
If valeurS3 = "" Then
Range("S3").Select
Else
Range("S1").Select
Selection.End(xlDown).Select
ligne_active_base = ActiveCell.Row
Range("S" & ligne_active_base + 1).Select
End If
'Memorise le n° de la ligne où coller les données
ligne_active_base = ActiveCell.Row
'Collage avec transition
Range("S" & ligne_active_base).Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
'Rendre vierge le formulaire
Sheets("Formulaire").Select
Range("F12").Select
Selection.ClearContents
Range("F12").Select
'Retourner dans le tableau
Sheets("Base de données").Select
Range("S1").Select
End Sub
|
|
|
|
|
Salut Marcusio et le forum
une macro de ce style devrait faire l'affaire :
Sub transpose_dans_tableau()
'Déclarations ===========================
Dim Lig_D As Long
Dim F_O As Worksheet
Dim F_D As Worksheet
'MEI ====================================
Set F_O = ActiveSheet 'Sheets("formulaire")
Set F_D = ActiveSheet 'Sheets("Base de données")
'Traitement =============================
Lig_D = F_D.[C65536].End(xlUp).Row + 1
'Détermination de la ligne destination
'Copie des plages -----------------------
F_O.Range("B6:B15").Copy
'copie
F_D.Range("C" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders, Transpose:=True
'collage avec tranposition sur ligne Lig_D à partir de C
'F_O.Range("B6:B15").ClearContents
'Effacement
F_O.Range("F6:F10").Copy
F_D.Range("M" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders, Transpose:=True
'Copie des cellules ---------------------
'Lig_D = F_D.[R65536].End(xlUp).Row + 1
'uniquement si ça ne concerne pas le même enregistrement que
'celui concernant le début de la macro
F_O.Range("F14").Copy
F_D.Range("R" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders
F_O.Range("H7").Copy
F_D.Range("B" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders
F_O.Range("H10").Copy
F_D.Range("A" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders
F_O.Range("F12").Copy
F_D.Range("S" & Lig_D).PasteSpecial Paste:=xlPasteAllExceptBorders
F_O.Range("B6:B15,F6:F10,F12,F14,H7,H10").ClearContents
'Effacement
End Sub
Pas de grande différences avec la tienne
- on ne calcule qu'une seule fois la ligne de destination à partir de la colonne C, et cette ligne sert à toutes les copies. Mais si ce n'est pas celà, on la détermine à chaque colonne de copie en rajoutant les lignes adéquates.
- La principale différence est l'absence de SELECT : dans la plupart des cas, quand tu as une instruction SELECT, suivie de Selection.xxx tu peux supprimer les 2 et mettre directement l'action, ou la méthode au Range concerné.
- effacer à chaque instruction est lours, autant le faire en une fois
A+
|
|
|
|
|
bonsoir,
c bizare, le résultat apres validation s'affiche dans le formulaire même (au lieu de la base de donnée)à la ligne 16
|
|
|
|
|
bonsoir,
c bizare, le résultat apres validation s'affiche dans le formulaire même (au lieu de la base de donnée)à la ligne 16
|
|
|
|
|
Marcusio a écrit :
bonsoir,
c bizare, le résultat apres validation s'affiche dans le formulaire même (au lieu de la base de donnée)à la ligne 16
Salut
Oups méga-désolé
Pour faire les essais, j'ai remplacé la définition des feuille :
Il faut remplacer
'MEI ====================================
Set F_O = ActiveSheet 'Sheets("formulaire")
Set F_D = ActiveSheet 'Sheets("Base de données")
pa
'MEI ====================================
Set F_O = Sheets("formulaire")
Set F_D = Sheets("Base de données") ça devrait avoir un meilleur résultat
Quand je fais une macro, je la teste toujours, mais comme je n'ai pas les vraies données, je me les crée. Et normalement, quand je donne mon code, c'est après un nettoyage des variables de test. Mais comme je me suis occupé d'autres choses entre temps, j'ai oublié que j'utilisais la feuille sélectionnée pour les tests.
A+
|
|
|
|
|
bonsoir à tous!
Avec un peu de retard je tenais a te remercier Gorfael
|
|
1
|
|

|

|