VBA: copier une plage a partir d une referenc
Résolu/Fermé
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
-
12 févr. 2010 à 20:32
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 - 25 févr. 2010 à 22:57
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 - 25 févr. 2010 à 22:57
A voir également:
- VBA: copier une plage a partir d une referenc
- Excel compter cellule couleur sans vba - Guide
- Mkdir vba ✓ - Forum VB / VBA
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
- Vba range avec variable ✓ - Forum VB / VBA
- Vba autofill ✓ - Forum Excel
14 réponses
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
12 févr. 2010 à 21:11
12 févr. 2010 à 21:11
Bonjour
J'ai supposé que tu copiais les cellules en colonne (D3, D4, D5, ...) et en continu.
Si tu as besoin que j'adapte, n'hésite pas.
J'ai supposé que tu copiais les cellules en colonne (D3, D4, D5, ...) et en continu.
Si tu as besoin que j'adapte, n'hésite pas.
Sub copier() Dim i As Long For i = 1 To Range(Range("C3").Value).Cells.Count Range("D3").Offset(i - 1, 0).Value = Range(Range("C3").Value).Cells(i).Value Next i End Sub
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
12 févr. 2010 à 21:35
12 févr. 2010 à 21:35
pourquoi as tu mis un compteur? pour referencer les cellules dans ma plages? c est pas possible de direct copier la plage (tableau de valeur) ?
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
12 févr. 2010 à 22:01
12 févr. 2010 à 22:01
J'ai mis un compteur pour faire une copie verticale quelle que soit la plage d'entrée. Si ton nom désigne une plage rectangulaire, 3 lignes par 2 colonnes par exemple, la copie sera faite sur une colonne de 6 cellules.
Sinon, oui il est possible de copier directement :
Sinon, oui il est possible de copier directement :
Range(Range("C3").Value).Copy Range("D3")
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
12 févr. 2010 à 22:51
12 févr. 2010 à 22:51
Merci beacoup c est tout a fait ce que je veux. J avasi penser a toutes les combinaison sauf Range(range().value). JE vais pouvoir continuer mon programme. Je risque d avoir d autre question dans les prochains jour..... part pas en vacances!!! ;)
Encore merci
Encore merci
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
12 févr. 2010 à 22:58
12 févr. 2010 à 22:58
En fait j ai deja une nouvelle question. Je voudrais proteger mes feuilles completement pour eviter que les utilisateurs ne modifier les cellules sans pour autant empecher mes macros de fonctionner (comme par exemple ajouter des lignes par une macro)...
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
13 févr. 2010 à 14:18
13 févr. 2010 à 14:18
Bonjour,
C'est bon, j'ai changer mes dates de vacances :-)
Tu peux protéger et ôter la protection par macro, par exemple :
Pour plus d'infos, tu peux regarder dans l'aide VBA sous Protect et Unprotect en fonction de la protection que tu veux.
C'est bon, j'ai changer mes dates de vacances :-)
Tu peux protéger et ôter la protection par macro, par exemple :
' Protection ActiveWorkbook.Protect Password:="mot_de_passe", Structure:=True, Windows:=False ' Ôter la protection ActiveWorkbook.Unprotect Password:="mot_de_passe"
Pour plus d'infos, tu peux regarder dans l'aide VBA sous Protect et Unprotect en fonction de la protection que tu veux.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
18 févr. 2010 à 21:52
18 févr. 2010 à 21:52
MErci pour la fonction protect. Par contre j ai beau proteger le classeur et les feuilles de calculs, on a tjrs la possibilité d accéder au code en faisant un clique droit sur l onglet de la feuille de calcul. tu sais comment on peut proteger le code??
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
18 févr. 2010 à 22:33
18 févr. 2010 à 22:33
Bonsoir,
Oui, tu vas dans VBE, clic droit sur ton projet puis propriété du projet. Du verrouille dans l'obglet protection
Oui, tu vas dans VBE, clic droit sur ton projet puis propriété du projet. Du verrouille dans l'obglet protection
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
18 févr. 2010 à 22:43
18 févr. 2010 à 22:43
merci bien. je voie que tu as reponse a tout!
Une autre petite colle, si je peux me permettre:
quand je selectionne un composant dans ma combobox, je voudrais verifier s il n a pas deja été ajouter. Pour cela je voulais verifier les doublons en cherchant la presence du num de ref (qui s affiche dans un label a coté dans la combobox) dans la premiere colone de ma feuille de calcul. Ce que j ai ecris fonction en cas de doublons, mais quand je selectionne un autre composant (pas encore ajouter) ca bug...! voici mes lignes de codes :
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
If Doublon = RM_Num Then
MsgBox "Doublons present"
End If
End Sub
MErci pour toutes tes repoonses!!
Une autre petite colle, si je peux me permettre:
quand je selectionne un composant dans ma combobox, je voudrais verifier s il n a pas deja été ajouter. Pour cela je voulais verifier les doublons en cherchant la presence du num de ref (qui s affiche dans un label a coté dans la combobox) dans la premiere colone de ma feuille de calcul. Ce que j ai ecris fonction en cas de doublons, mais quand je selectionne un autre composant (pas encore ajouter) ca bug...! voici mes lignes de codes :
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
If Doublon = RM_Num Then
MsgBox "Doublons present"
End If
End Sub
MErci pour toutes tes repoonses!!
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
18 févr. 2010 à 23:09
18 févr. 2010 à 23:09
En fait le message d erreur est : 91 - Variable Objet ou variable de bloc With non definie. Ca t aidera peut etre ...
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
19 févr. 2010 à 12:55
19 févr. 2010 à 12:55
Bonjour,
Il faut que tu ajoutes un test avant ta boucle If. Find renvoie Nothing s'il ne trouve rien d'où :
Sinon, je n'ai pas réponse à tout, j'ai accumulé de l'expérience (et je continue..)
N'hésite pas
Il faut que tu ajoutes un test avant ta boucle If. Find renvoie Nothing s'il ne trouve rien d'où :
If Not(Doublon Is Nothing) Then If Doublon = RM_Num Then MsgBox "Doublons present" End If End If
Sinon, je n'ai pas réponse à tout, j'ai accumulé de l'expérience (et je continue..)
N'hésite pas
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
20 févr. 2010 à 18:59
20 févr. 2010 à 18:59
OK je prend note des propriétés de find.
j ai copié ta boucle dans ma procedure. Mais ca bug tjrs.
QUand je selectionne un composant deja present cela bug sur la premiere ligne : If Not(Doublon Is Nothing) Then .... ==> erreur 424 objet requis je comprend le message mais je vois pas ou il faut que je declare un objet.
Quand je selectionne un composant pas encore inserer, cela me remet la meme erreur qu avant soit 91 - Variable Objet ou variable de bloc With non definie et le bug se trouve sur la ligne Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
Je te remet toute ma procédure en dessus.
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
If Not (Doublon Is Nothing) Then
If Doublon = RM_Num Then
MsgBox "Doublons presents"
End If
End If
End Sub
encore merci pour tes lumière
j ai copié ta boucle dans ma procedure. Mais ca bug tjrs.
QUand je selectionne un composant deja present cela bug sur la premiere ligne : If Not(Doublon Is Nothing) Then .... ==> erreur 424 objet requis je comprend le message mais je vois pas ou il faut que je declare un objet.
Quand je selectionne un composant pas encore inserer, cela me remet la meme erreur qu avant soit 91 - Variable Objet ou variable de bloc With non definie et le bug se trouve sur la ligne Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
Je te remet toute ma procédure en dessus.
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
Doublon = Columns(1).Find(What:=Label1, LookAt:=xlWhole, SearchDirection:=xlNext).Value
If Not (Doublon Is Nothing) Then
If Doublon = RM_Num Then
MsgBox "Doublons presents"
End If
End If
End Sub
encore merci pour tes lumière
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
20 févr. 2010 à 23:38
20 févr. 2010 à 23:38
Bonsoir,
Je m'étais focalisé sur le Nothing. Dans ton cas, je pense qu'en remplaçant le test par IsObject, ça devrait fonctionner :
Ca devrait te rassurer, je n'ai pas réponse à tout :-)
@+
Je m'étais focalisé sur le Nothing. Dans ton cas, je pense qu'en remplaçant le test par IsObject, ça devrait fonctionner :
If Not (IsObject(Doublon)) Then If Doublon = RM_Num Then MsgBox "Doublons presents" End If End If
Ca devrait te rassurer, je n'ai pas réponse à tout :-)
@+
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
21 févr. 2010 à 00:13
21 févr. 2010 à 00:13
Décidement je suis maudit! j ai tjrs un bug (91 - Variable Objet ou variable de bloc With non definie) que se signale a la ligne de declaration de doublon . Est ce que le probleme viendait pas de la? plutot que de la boucle qui me semble correct?
comment tu t y prendrait toi pour trouver des doublons dans un tableau, si tu devait le faire pour un simple tableau. t utiliserais quoi comme procedure??
comment tu t y prendrait toi pour trouver des doublons dans un tableau, si tu devait le faire pour un simple tableau. t utiliserais quoi comme procedure??
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
22 févr. 2010 à 00:33
22 févr. 2010 à 00:33
J ai essayer autre chose, en me basant sur l'exemple de la fonction Find dans l aide. voici ce que ca donne. ca fonctionne sauf que la boucle est infini : des que je clique sur ok de la msgbox ""doublons" et se reouvre, et ainsi de maniere infinie.
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
With Worksheets("Arbre Produit").Range("A2:A500")
Set Doublon = .Find(RM_Num, LookIn:=xlValues)
If Not Doublon Is Nothing Then
Do
MsgBox "Ce composant fait deja partie de votre liste"
Loop While Not Doublon Is Nothing
End If
End With
End Sub
est ce que tu sais par hasard comment clore la boucle une fois qu on clique sur ok. IL faudra que la boucle s arete tant qu on selectionne pas un nouveau composant??
Private Sub ComboBox1_Change()
Dim NomComposant As String
Dim RM_Num As Variant
Dim Doublon As Variant
NomComposant = ComboBox1.Value
' Affichage du #RM
RM_Num = WorksheetFunction.VLookup(NomComposant, Sheets("Divers").Range("ListeComposant"), 2, False)
Label1.Caption = RM_Num
' rechercher les doublons
With Worksheets("Arbre Produit").Range("A2:A500")
Set Doublon = .Find(RM_Num, LookIn:=xlValues)
If Not Doublon Is Nothing Then
Do
MsgBox "Ce composant fait deja partie de votre liste"
Loop While Not Doublon Is Nothing
End If
End With
End Sub
est ce que tu sais par hasard comment clore la boucle une fois qu on clique sur ok. IL faudra que la boucle s arete tant qu on selectionne pas un nouveau composant??
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
22 févr. 2010 à 12:30
22 févr. 2010 à 12:30
Bonjour,
Réponse au post 14 :
Pour rechercher l'existence d'un doublons, je ferais quelque chose du type:
où Range(...) désigne la plage dans laquelle tu recherches le doublon
Réponse au post 15 :
Ta boucle est infinie, car tu ne modifies jamais la valeur de Doublon une fois que tu es rentré dedans. Il faudrait par exemple que tu réaffectes à chaque boucle une valeur à Doublon :
Sinon, je ne sais pas si l'utilisation de l'évènement Change est la bonne solution, ça dépend de ce que tu veux faire. Dans ton cas, à chaque fois que tu tapes un caractère dans ComboBox1, tu lances ta procédure. il vaudrait peut-être mieux utiliser Exit ou lancer ta procédure de test lorsque tu appuies sur un bouton.
A+
Réponse au post 14 :
Pour rechercher l'existence d'un doublons, je ferais quelque chose du type:
Dim cellule as Range Dim Doublon as Boolean Doublon = False For Each cellule In Range(...) If cellule.Value = NomComposant Then Doublon=True Next cellule
où Range(...) désigne la plage dans laquelle tu recherches le doublon
Réponse au post 15 :
Ta boucle est infinie, car tu ne modifies jamais la valeur de Doublon une fois que tu es rentré dedans. Il faudrait par exemple que tu réaffectes à chaque boucle une valeur à Doublon :
Do Set Doublon = .Find(RM_Num, LookIn:=xlValues) ... Loop ...
Sinon, je ne sais pas si l'utilisation de l'évènement Change est la bonne solution, ça dépend de ce que tu veux faire. Dans ton cas, à chaque fois que tu tapes un caractère dans ComboBox1, tu lances ta procédure. il vaudrait peut-être mieux utiliser Exit ou lancer ta procédure de test lorsque tu appuies sur un bouton.
A+
Pyvoudelet
Messages postés
167
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
22 novembre 2024
12
23 févr. 2010 à 08:03
23 févr. 2010 à 08:03
J'ai suivi tes conseils, et j'ai inséré la boucle "for each" pour vérifier les doublons dans la commande du bouton ajouter. DOnc je n'ai plus de probleme de boucle infini.
CEla m'a permis de fini la première étape de mon projet.
A l ouverture du fichier, j ai mis des commande pour mettre en plein ecran, proteger les feuilles, proteger le classeur et enlever la mise a jour automatique(pour accélérer).
Private Sub Workbook_Open()
Application.DisplayFullScreen = True
Application.ScreenUpdating = False
ActiveWorkbook.Protect
Sheets("Arbre Produit").Protect
End Sub
y a t il une commande pour empecher de sortir du mode plein ecran?
Mon fichier tourne bien une fois ouvert, mais il est assez long a ouvrir, surement a cause des commande à l ouverture. Mais y a t il un moyen pour l'aleger a l ouverture sans enlever les commandes mentionnée ci dessus ?
Pour la prochaine étape je voulais savoir si tu savais s'il y avait moyen d'importer une base de données autre que provenant d'Acces. EN fait je voudrais importer les donné sur les composants depuis la base de donnes de SAP R/3 (systeme ERP de l entreprise). Sais tu si c est possible?? je m'y attèlerais des la semaine prochaine.
Encore mErci pour tous tes conseils.
CEla m'a permis de fini la première étape de mon projet.
A l ouverture du fichier, j ai mis des commande pour mettre en plein ecran, proteger les feuilles, proteger le classeur et enlever la mise a jour automatique(pour accélérer).
Private Sub Workbook_Open()
Application.DisplayFullScreen = True
Application.ScreenUpdating = False
ActiveWorkbook.Protect
Sheets("Arbre Produit").Protect
End Sub
y a t il une commande pour empecher de sortir du mode plein ecran?
Mon fichier tourne bien une fois ouvert, mais il est assez long a ouvrir, surement a cause des commande à l ouverture. Mais y a t il un moyen pour l'aleger a l ouverture sans enlever les commandes mentionnée ci dessus ?
Pour la prochaine étape je voulais savoir si tu savais s'il y avait moyen d'importer une base de données autre que provenant d'Acces. EN fait je voudrais importer les donné sur les composants depuis la base de donnes de SAP R/3 (systeme ERP de l entreprise). Sais tu si c est possible?? je m'y attèlerais des la semaine prochaine.
Encore mErci pour tous tes conseils.
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
25 févr. 2010 à 22:57
25 févr. 2010 à 22:57
Bonsoir,
Je ne connais pas d'astuce pour verrouiller l'affichage en plein écran. La seule chose que je vois, c'est de modifier les menus pour supprimer la commande 'Fermer le mode plein écran" et verrouiller la personnalisation des menus (je n'ai jamais fait mais je pense que c'est faisable).
Sinon, pour ta seconde question, je ne connais pas SAP R/3, mais ce que tu peux faire, c'est importer des données par lecture de fichier ascii. Par exemple, un fichier texte, un fichier csv, ... Tu peux aussi ouvrir des application, envoyer des combinaisons de touches (Alt+F pour ouvrir le menu Fichier ...) mais je ne sais pas exactement ce que tu souhaites faire.
Pour ce qui est de la lenteur d'ouverture, je ne pense pas que tes 4 instructions raleentissent vraiment. As-tu d'autres macros qui se lancent au démarrage ?
@+
Je ne connais pas d'astuce pour verrouiller l'affichage en plein écran. La seule chose que je vois, c'est de modifier les menus pour supprimer la commande 'Fermer le mode plein écran" et verrouiller la personnalisation des menus (je n'ai jamais fait mais je pense que c'est faisable).
Sinon, pour ta seconde question, je ne connais pas SAP R/3, mais ce que tu peux faire, c'est importer des données par lecture de fichier ascii. Par exemple, un fichier texte, un fichier csv, ... Tu peux aussi ouvrir des application, envoyer des combinaisons de touches (Alt+F pour ouvrir le menu Fichier ...) mais je ne sais pas exactement ce que tu souhaites faire.
Pour ce qui est de la lenteur d'ouverture, je ne pense pas que tes 4 instructions raleentissent vraiment. As-tu d'autres macros qui se lancent au démarrage ?
@+