VBA-Enregistrer des données d'un formulaire vers un ensemble d'autres classeurs
chanelausie
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J’ai créé un classeur excel"macst.xlsm" avec un onglet "source" qui ne sert qu'à contenir un formulaire pour saisir des données affectées à 10 variables.
Je souhaite enregistrer directement ces données dans des classeurs autres que celui qui contient mon userform (autre que ce qui est actif?).
Mes fichiers de destination sont une cinquantaine de classeurs Excel différents situés dans un même répertoire (dossier de fichiers .xlsx) avec un grand nombre de worksheet mais tous conçus exactement de la même manière.
Pour désigner un classeur de destination spécifique, dans mon classeur "macst" sur mon onglet "source" j'ai inscrit en B4 le nom du classeur destination et en B5 le nom de l'onglet/worksheet de destination. Dans ma macro mon code est :
Dim monclasseur As Workbook
contenuB4 = Range("B4").Value
Set monclasseur = Workbooks.Open(Filename:="\\C:\Users\Channel\Documents\06. PRODUCTION & OPTIMISATION\06. VBA test\" & contenuB4 & ".xlsx")
Ce qui fonctionne et m'ouvre le classeur de destination choisi
Dim mafeuille As Worksheet
contenuB5 = Range("B5").Value 'this workbook
mafeuille = monclasseur.Worksheets("contenuB5")
mafeuille.Activate
Ce qui ne fonctionne pas et ne m'ouvre pas l'onglet correspondant ... sachant que mes onglets ont des noms numériques
Quelqu'un pourrait il m'aider à trouver l'erreur dans mon code svp ? Merci !
J’ai créé un classeur excel"macst.xlsm" avec un onglet "source" qui ne sert qu'à contenir un formulaire pour saisir des données affectées à 10 variables.
Je souhaite enregistrer directement ces données dans des classeurs autres que celui qui contient mon userform (autre que ce qui est actif?).
Mes fichiers de destination sont une cinquantaine de classeurs Excel différents situés dans un même répertoire (dossier de fichiers .xlsx) avec un grand nombre de worksheet mais tous conçus exactement de la même manière.
Pour désigner un classeur de destination spécifique, dans mon classeur "macst" sur mon onglet "source" j'ai inscrit en B4 le nom du classeur destination et en B5 le nom de l'onglet/worksheet de destination. Dans ma macro mon code est :
Dim monclasseur As Workbook
contenuB4 = Range("B4").Value
Set monclasseur = Workbooks.Open(Filename:="\\C:\Users\Channel\Documents\06. PRODUCTION & OPTIMISATION\06. VBA test\" & contenuB4 & ".xlsx")
Ce qui fonctionne et m'ouvre le classeur de destination choisi
Dim mafeuille As Worksheet
contenuB5 = Range("B5").Value 'this workbook
mafeuille = monclasseur.Worksheets("contenuB5")
mafeuille.Activate
Ce qui ne fonctionne pas et ne m'ouvre pas l'onglet correspondant ... sachant que mes onglets ont des noms numériques
Quelqu'un pourrait il m'aider à trouver l'erreur dans mon code svp ? Merci !
A voir également:
- VBA-Enregistrer des données d'un formulaire vers un ensemble d'autres classeurs
- Whatsapp formulaire opposition - Guide
- Fuite données maif - Guide
- Audacity enregistrer son pc - Guide
- Formulaire de réclamation facebook - Guide
- Comment enregistrer un mail - Guide
5 réponses
Bonjour,
Essaie comme ceci (attention pas de quote autour de contenuB5)
contenuB5 = Range("B5").Value 'this workbook
set mafeuille = monclasseur.Worksheets(contenuB5)
monclasseur.Worksheets(contenuB5).Activate
Cordialement
Essaie comme ceci (attention pas de quote autour de contenuB5)
contenuB5 = Range("B5").Value 'this workbook
set mafeuille = monclasseur.Worksheets(contenuB5)
monclasseur.Worksheets(contenuB5).Activate
Cordialement
Bonjour,
J'ai essayé votre code et ça se bloque sur la phrase :
message : L'indice n'appartient pas à la sélection erreur d'exécution 9
Je me suis aperçue que dans mon "espion de variables" la variable contenuB5 n'était pas déclarée donc je l'ai déclarée comme String et maintenant elle affiche une valeur nulle c'est à dire qui s'affiche avec deux apostrophes""
Mon premier problème est que ma variable contenuB5 ne prend pas la valeur que je lui attribue avec le texte inscrit dans ma cellule B5. Pourtant la phrase
Mon deuxième problème : la variable mafeuille a comme valeur "nothing" et ne s'active pas (à mon avis cela découle de mon problème ci dessus avec "contenuB5")
J'ai essayé votre code et ça se bloque sur la phrase :
Set mafeuille = monclasseur.Worksheets(contenuB5)
message : L'indice n'appartient pas à la sélection erreur d'exécution 9
Je me suis aperçue que dans mon "espion de variables" la variable contenuB5 n'était pas déclarée donc je l'ai déclarée comme String et maintenant elle affiche une valeur nulle c'est à dire qui s'affiche avec deux apostrophes""
Mon premier problème est que ma variable contenuB5 ne prend pas la valeur que je lui attribue avec le texte inscrit dans ma cellule B5. Pourtant la phrase
contenuB5 = Range("B5").Valueest exactement la même qu'avec contenuB4
contenuB4 = Range("B4").Valuequi est aussi un String. Cela m'ouvre le bon classeur lorsque je modifie le texte inscrit en B4 par contre cela n'active en aucun cas une feuille de calcul spécifique.
Mon deuxième problème : la variable mafeuille a comme valeur "nothing" et ne s'active pas (à mon avis cela découle de mon problème ci dessus avec "contenuB5")
Public Sub bvalid_Click() 'lors d'un clic sur le bouton ajouter dans base
'0)déclaration variables
Dim dhab As Date 'date
Dim refpo As Integer 'référence
Dim cx As String ' C ou EX
Dim qbt As Integer 'quantité b
Dim qdm As Integer 'quantité d
Dim qmg As Integer 'quantité m
Dim dget As String 'degré %
Dim sbx As Integer 'solde
Dim info As String 'informations
'1)on définit les variables à partir du contenu renseigné sur le Userform
dhab = ufdedhab.tbdhab.Value
refpo = ufdedhab.tbrefpo.Value
cx = ufdedhab.tbcx.Value
qbt = ufdedhab.tbqbt.Value
qdm = ufdedhab.tbqdm.Value
qmg = ufdedhab.tbqmg.Value
dget = ufdedhab.tbdget.Value
sbx = ufdedhab.tbsbx.Value
info = ufdedhab.tbinfo.Value
'2)on ouvre le classeur de destination et la feuille de destination
Dim monclasseur As Workbook
Dim contenuB4 As String
contenuB4 = Range("B4").Value
Set monclasseur = Workbooks.Open(Filename:="\\C:\Users\Channel\Documents\06. PRODUCTION & OPTIMISATION\06. VBA test\" & contenuB4 & ".xlsx")
Application.ScreenUpdating = False
Dim mafeuille As Worksheet
Dim contenuB5 As String
contenuB5 = Range("B5").Value 'ne marche pas car la variable ne se déclare pas
Set mafeuille = monclasseur.Worksheets(contenuB5).Value 'ne marche pas
monclasseur.Worksheets(contenuB5).Activate 'ne marche pas
'mafeuille.Name = monclasseur.Worksheets(contenuB5).Value 'ne marche pas
'mafeuille.Activate 'ne marche pas
'Worksheets("9900").Activate marche mais ne permet pas de changer le nom de l'onglet sans coder
' Worksheets("ongletactif").Activatemarche mais note les infos dans le classeur contenant la macro
'3)on inscrit les données dans les cellules correspondantes
Range("A8").Value = dhab
Range("B8").Value = refpo
Range("C8").Value = cx
Range("D8").Value = qbt
Range("F8").Value = qdm
Range("H8").Value = qmg
Range("J8").Value = dget
Range("K8").Value = sbx
Range("L8").Value = info
End Sub
'0)déclaration variables
Dim dhab As Date 'date
Dim refpo As Integer 'référence
Dim cx As String ' C ou EX
Dim qbt As Integer 'quantité b
Dim qdm As Integer 'quantité d
Dim qmg As Integer 'quantité m
Dim dget As String 'degré %
Dim sbx As Integer 'solde
Dim info As String 'informations
'1)on définit les variables à partir du contenu renseigné sur le Userform
dhab = ufdedhab.tbdhab.Value
refpo = ufdedhab.tbrefpo.Value
cx = ufdedhab.tbcx.Value
qbt = ufdedhab.tbqbt.Value
qdm = ufdedhab.tbqdm.Value
qmg = ufdedhab.tbqmg.Value
dget = ufdedhab.tbdget.Value
sbx = ufdedhab.tbsbx.Value
info = ufdedhab.tbinfo.Value
'2)on ouvre le classeur de destination et la feuille de destination
Dim monclasseur As Workbook
Dim contenuB4 As String
contenuB4 = Range("B4").Value
Set monclasseur = Workbooks.Open(Filename:="\\C:\Users\Channel\Documents\06. PRODUCTION & OPTIMISATION\06. VBA test\" & contenuB4 & ".xlsx")
Application.ScreenUpdating = False
Dim mafeuille As Worksheet
Dim contenuB5 As String
contenuB5 = Range("B5").Value 'ne marche pas car la variable ne se déclare pas
Set mafeuille = monclasseur.Worksheets(contenuB5).Value 'ne marche pas
monclasseur.Worksheets(contenuB5).Activate 'ne marche pas
'mafeuille.Name = monclasseur.Worksheets(contenuB5).Value 'ne marche pas
'mafeuille.Activate 'ne marche pas
'Worksheets("9900").Activate marche mais ne permet pas de changer le nom de l'onglet sans coder
' Worksheets("ongletactif").Activatemarche mais note les infos dans le classeur contenant la macro
'3)on inscrit les données dans les cellules correspondantes
Range("A8").Value = dhab
Range("B8").Value = refpo
Range("C8").Value = cx
Range("D8").Value = qbt
Range("F8").Value = qdm
Range("H8").Value = qmg
Range("J8").Value = dget
Range("K8").Value = sbx
Range("L8").Value = info
End Sub
Bonjour,
Le problème vient du fait que quand tu fait Set monclasseur = Workbooks.Open ..., tu changes de classeur actif et de feuille active, donc l'instruction contenuB5 = Range("B5").Value ne porte pas sur ta feuille initiale.
Déplace cette instruction et les déclarations associées avant Set monclasseur = Workbooks.Open et cela devrait aller mieux
Cordialement
Le problème vient du fait que quand tu fait Set monclasseur = Workbooks.Open ..., tu changes de classeur actif et de feuille active, donc l'instruction contenuB5 = Range("B5").Value ne porte pas sur ta feuille initiale.
Déplace cette instruction et les déclarations associées avant Set monclasseur = Workbooks.Open et cela devrait aller mieux
Cordialement
Merci beaucoup ça marche ! Désolé je n'y avais pas du tout pensé ...
J'ai une autre question : je ne souhaite pas entrer les données sur la ligne 8 comme ci-dessus dans mon étape numéro 3, mais je souhaite saisir mes données dans la dernière ligne libre de ma feuille active.
</gras>
Je dois utiliser la fonction offset :
Soit, je commence par sélectionner la dernière ligne vide en colonne A.
Pour rappel la première partie de mon code mis à jour :
Voici la suite de mon idée de code, qui ne fonctionne évidemment pas :
merci ...
J'ai une autre question : je ne souhaite pas entrer les données sur la ligne 8 comme ci-dessus dans mon étape numéro 3, mais je souhaite saisir mes données dans la dernière ligne libre de ma feuille active.
</gras>
Je dois utiliser la fonction offset :
Range("A1").End(xlDown).Offset(1,0)
Soit, je commence par sélectionner la dernière ligne vide en colonne A.
Pour rappel la première partie de mon code mis à jour :
Public Sub bvalid
0)déclaration variables
Dim dhab As Date 'date habillage
Dim refpo As Integer 'référence PO
Dim cx As String ' CRD ou EXPORT
Dim qbt As Integer 'quantité bouteilles habillées
Dim qdm As Integer 'quantité demis habillées
Dim qmg As Integer 'quantité magnums habillés
Dim dget As String 'degré étiquette %
Dim sbx As Integer 'solde box
Dim info As String 'informations
'1) On définit les variables à partir du contenu renseigné sur le Userform
dhab = ufdedhab.tbdhab.Value
refpo = ufdedhab.tbrefpo.Value
cx = ufdedhab.tbcx.Value
qbt = ufdedhab.tbqbt.Value
qdm = ufdedhab.tbqdm.Value
qmg = ufdedhab.tbqmg.Value
dget = ufdedhab.tbdget.Value
sbx = ufdedhab.tbsbx.Value
info = ufdedhab.tbinfo.Value
'2) On ouvre le classeur de destination et la feuille de destination
Dim monclasseur As Workbook 'de destination
Dim mafeuille As Worksheet 'de destination
Dim contenuB4 As String
contenuB4 = Range("B4").Value
Dim contenuB5 As String
contenuB5 = Range("B5").Value
Set monclasseur = Workbooks.Open(Filename:="\\C:\Users\Channel\Documents\06. PRODUCTION & OPTIMISATION\06. VBA test\" & contenuB4 & ".xlsx")
'Application.ScreenUpdating = False
Set mafeuille = monclasseur.Worksheets(contenuB5)
monclasseur.Worksheets(contenuB5).Activate
'3)Démarche pour inscrire les données lignes après lignes dans le classeur de destination
Voici la suite de mon idée de code, qui ne fonctionne évidemment pas :
Dim lastline As Long
lastline = Range("A1").End(xlDown).Offset(1, 0).Select
Range("A1" & lastline).Value = dhab
merci ...
Bonsoir,
Essaie plutôt comme ceci :
Dim lastline As Long
lastline = Range("A1").End(xlDown).Row +1
Range("A" & lastline).Value = dhab
Range("B"& lastline)).Value = refpo
etc ...
Mais si tes colonnes n'ont pas toutes la même hauteur, cela va poser problème, à toi de dire ce que tu veux dans ce cas.
Cordialement
Essaie plutôt comme ceci :
Dim lastline As Long
lastline = Range("A1").End(xlDown).Row +1
Range("A" & lastline).Value = dhab
Range("B"& lastline)).Value = refpo
etc ...
Mais si tes colonnes n'ont pas toutes la même hauteur, cela va poser problème, à toi de dire ce que tu veux dans ce cas.
Cordialement
Ok cela marche, ça c’est top en revanche cela ne mets à jour que la ligne 4 ...
Lorsque je veux faire une nouvelle entrée cela met à jour la ligne 4 et ne descend pas à la ligne 5 par exemple
Ma feuille est peut être mal construite mais il semblerait que quelque soit la mise en forme cela ne modifie que la ligne 4.
Peut être je peux résoudre ce problème en ne commençant qu’à inscrire les données à partir de la ligne 8 et ainsi de suite mais je ne sais pas comment faire.
Lorsque je veux faire une nouvelle entrée cela met à jour la ligne 4 et ne descend pas à la ligne 5 par exemple
Ma feuille est peut être mal construite mais il semblerait que quelque soit la mise en forme cela ne modifie que la ligne 4.
Peut être je peux résoudre ce problème en ne commençant qu’à inscrire les données à partir de la ligne 8 et ainsi de suite mais je ne sais pas comment faire.
J'ai testé une sorte de boucle d'après des essais sur d'autres forum mais cela ne marche pas. Et je ne comprends pas ce qui est écrit donc ne peux l'adapter à mon code. Cela me semble aussi assez restrictif ...
Je suis un peu confuse, je ne comprends pas le raisonnement du offset et des boucles utilisées.
Doit-on nécessairement utiliser un
Le soucis est donc également mes autres variables que je pensais mettre dans une variable
Je ne peux pas car si ça se trouve la dernière ligne vide de la colonne B n'est pas la même que celle de la colonne A. Or toutes mes données de formulaire doivent figurer sur la même ligne puisqu'elle sont corrélées.
Je souhaite donc en somme :
'Puis sauvegarder mafeuille.monclasseur et le fermer
Merci
Dim lastline As Long, count_entries As Integer
Dim TxtRng As String
TxtRng = “A8:A40”
count_entries = Application.WorksheetFunction.CountIf(range(TxtRng), "<>")
If count_entries = 1 Then
lastline = Sheets("mafeuille").range("A8").Row
Else
lastline = Sheets("mafeuille").range(TxtRng).End(xlDown).Offset(1, 0).Row
End If
Sheets("mafeuille").range("A" & lastline).Value = "dhab"
Je suis un peu confuse, je ne comprends pas le raisonnement du offset et des boucles utilisées.
Doit-on nécessairement utiliser un
count rowavant le
xlDown?
Le soucis est donc également mes autres variables que je pensais mettre dans une variable
lastlinedifférente pour chaque colonne :
Range("A" & lastlineA).Value = dhab
Range("B" & lastlineB).Value = refpo
Range("C" & lastlineC).Value = cx
Range("D" & lastlineD).Value = qbt
Range("E" & lastlineE).Value = qdm
Range("F" & lastlineF).Value = qmg
Range("G" & lastlineG).Value = dget
Range("H" & lastlineH).Value = sbx
Range("I" & lastlineI).Value = info
Je ne peux pas car si ça se trouve la dernière ligne vide de la colonne B n'est pas la même que celle de la colonne A. Or toutes mes données de formulaire doivent figurer sur la même ligne puisqu'elle sont corrélées.
Je souhaite donc en somme :
'Sélectionner la dernière cellule de texte +1 (donc 1ère cellule vide) de ma colonne A
'Affecter à cette ligne une variable appelée "lastline" = "dernière ligne"
'Entrer dans ma cellule (A & dernière ligne) ma donnée de variable "dhab" (qui est une date)
'Décaler à droite en B & lastline pour y inscrire refpo
'Décaler encore à droite en C & lastline pour y inscrire ma donnée "cx"
'et ainsi de suite... jusqu'en I avec la donnée info
'Puis sauvegarder mafeuille.monclasseur et le fermer
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
de passage...
Principe de base pour restituer des valeurs sur une ligne déterminée:
de passage...
Principe de base pour restituer des valeurs sur une ligne déterminée:
Option Explicit
'--------------
Sub demo()
Dim Liste
Liste = Array(12, 14, "aaa", 10)
Range("A1").Resize(1, 4) = Liste
End Sub
MERCI d'avoir essayé de t'aider!!!!
lire d'urgence
https://www.commentcamarche.net/infos/25855-charte-d-utilisation-de-commentcamarche-net-respect-d-autrui/#politesse
Revoir aussi un topo sur les Arrays...
lire d'urgence
https://www.commentcamarche.net/infos/25855-charte-d-utilisation-de-commentcamarche-net-respect-d-autrui/#politesse
Revoir aussi un topo sur les Arrays...