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
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

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
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.

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

0
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
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) ?
0
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
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 :

Range(Range("C3").Value).Copy Range("D3")

0
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
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
0
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
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)...
0
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
Bonjour,
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.
0

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
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??
0
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
Bonsoir,
Oui, tu vas dans VBE, clic droit sur ton projet puis propriété du projet. Du verrouille dans l'obglet protection
0
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
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!!
0
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
En fait le message d erreur est : 91 - Variable Objet ou variable de bloc With non definie. Ca t aidera peut etre ...
0
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
Bonjour,
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
0
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
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
0
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
Bonsoir,
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 :-)
@+
0
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
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??
0
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
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??
0
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
Bonjour,
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+
0
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
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.
0
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
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 ?

@+
0