VBA: copier une plage a partir d une referenc
Résolu
Pyvoudelet
Messages postés
169
Date d'inscription
Statut
Membre
Dernière intervention
-
Gord21 Messages postés 918 Date d'inscription Statut Membre Dernière intervention -
Gord21 Messages postés 918 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je débute avec les macros en VBA sous Excel 2007 et je rencontre quelques difficultés. Voici mon problème :
A la suite d'une commande quelconque, une cellule (disons "C3" pour l exemple) se rempli avec une valeur qui peut varier(disons "scenario1").
Ce que je voudrais c'est copier en D3 la plage de cellule qui a pour nom scenario1 (a chaque valeur possible de C3 est associé une plage de valeur)
J'ai bien fait attention à bien mettre les meme nom). Cette plage est une serie de cellule sur une autre feuille.
je pensais enregistrer la valeur de la cellule C3 dans un nom de variable, pour m en servir apres comme nom de plage dans Range( ) mais ca ne marche pas. Il faut directement mettre le nom de plage comme argument a Range. Or se nom peut varier:
Dim ght As Variant
ght = Range("C3").Value
Range(ght).Copy Range("D3")
J espere que qqn aura une solution.
merci
Je débute avec les macros en VBA sous Excel 2007 et je rencontre quelques difficultés. Voici mon problème :
A la suite d'une commande quelconque, une cellule (disons "C3" pour l exemple) se rempli avec une valeur qui peut varier(disons "scenario1").
Ce que je voudrais c'est copier en D3 la plage de cellule qui a pour nom scenario1 (a chaque valeur possible de C3 est associé une plage de valeur)
J'ai bien fait attention à bien mettre les meme nom). Cette plage est une serie de cellule sur une autre feuille.
je pensais enregistrer la valeur de la cellule C3 dans un nom de variable, pour m en servir apres comme nom de plage dans Range( ) mais ca ne marche pas. Il faut directement mettre le nom de plage comme argument a Range. Or se nom peut varier:
Dim ght As Variant
ght = Range("C3").Value
Range(ght).Copy Range("D3")
J espere que qqn aura une solution.
merci
A voir également:
- VBA: copier une plage a partir d une referenc
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
14 réponses
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
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) ?
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")
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
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)...
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
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??
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!!
En fait le message d erreur est : 91 - Variable Objet ou variable de bloc With non definie. Ca t aidera peut etre ...
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
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
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??
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??
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+
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.
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 ?
@+