VBA pour exel

  • Auteur de la discussion coucoune
  • Date de début

coucoune

Nouveau membre
Bonjour!

je suis débutant en vba pour excel.
J'ai créé un userform comprenant 2 text box qui permettent de remplir une feuille à partir d’information stockeés dans une autre feuille(base de données), le tout faisant partie d’un même classeur, cela fonctionne bien, lorsque je veux réaliser la même chose mais à partir d’une feuille(base de données) d’un autre classeur, le message « l’indice n’appartient pas à la sélection » apparaît, avez vous une idée pour m’aider ?

Merci d’avance.
 

zeb

Modérateur
Oui, bien sûr que nous avons tous une idée, puisque nous somme tous devins et que ton code nous apparaît miraculeusement devant les yeux pour voir où tu fais une erreur ....
 

coucoune

Nouveau membre
Voici le code que j'utilise, le message d'erreur apparait lors de l'ouverture
du classeur "copie Base Bouteilles .xls"
et le débogeur reste bloqué sur la ligne "Sheets("BaseBlles").Select"

Private Sub Workbook_Open()
ChDir "O:\production\secteur_froid"
Workbooks.Open Filename:= _
"O:\production\secteur_froid\copie Base Bouteilles .xls"
ActiveWindow.DisplayWorkbookTabs = True
Sheets("BaseBlles").Select
Cells.Select
Selection.Copy
Windows("Projet.xls").Activate
Sheets("Dual").Select
Sheets.Add
Cells.Select
ActiveSheet.Paste
End Sub
 

coucoune

Nouveau membre
Merci pour la réponse, mais je rapelle que je suis débutant et le balise
Code:
 connait pas.
 

zeb

Modérateur
Pour ça, il aurait fallut lire les règles de la cat'.......
 

coucoune

Nouveau membre
Bonjour,

Après avoir pris le temps de lire les régles générales et effectué des recherches sur balise
Code:
, je pense que cela sert à afficher des extraits de programmes mais je ne trouve pas la mise en application. Est il possible d'avoir un exemple afin que je comprenne bien le principe ?

Merci d'avance
 

zeb

Modérateur
KangOl> Laisse-moi faire, je les ai retrouvé mes ptits smileys ;) En plus tu as vu, j'ai fait changer le bouton C/C++ en Code. Comme ça, plus d'excuses bidon !

coucoune>
Vous devez être connecté pour voir les images.



Code:
Workbooks("copie Base Bouteilles .xls").Sheets("BaseBlles").Cells.Copy Workbooks("Projet.xls").Sheets.Add(Workbooks("Projet.xls").Sheets("Dual")).Cells
 

Freeman23

Expert
Ton erreur est tout à fait normal puisque que tu as 2 classeurs ouvert en simultané et donc quand tu appelles l'onglet Excel ne sais pas qu'elle est le classeur concerné. Donc après avoir lu les règles moi aussi...

Code:
Private Sub Workbook_Open()
    Dim wbdb   as Workbook ' classeur origine

    ChDir "O:\production\secteur_froid" 
    Set wbdb = Workbooks.Open (Filename:= _ 
        "O:\production\secteur_froid\copie Base Bouteilles .xls")
    wbdb.DisplayWorkbookTabs = True 
    wbdb.Sheets("BaseBlles" ).activate 
    Activesheet.Cells.Select
    Selection.Copy 
    Windows("Projet.xls" ).Activate 
    Activeworkbook.Sheets("Dual" ).Select 
    Sheets.Add 
    Cells.Select 
    ActiveSheet.Paste 
End Sub
 

zeb

Modérateur
Pas mal. Voilà le code de coucoune corrigé. Merci pour lui.

Mais qu'est-ce que vous avez tous avec Copy/Paste ? (*)
Copy <destination>, c'est quand même mieux !!! (Voir le Spoiler de mon msg précédent)


(*) J'ai une petite idée : L'enregistreur de macro. N'est-ce pas ? Il est utile au début, mais il ne faut pas hésiter à le/se remettre en cause ;)
 

Freeman23

Expert
J'ai simplement corrigé ce qui était faux et provoqué l'erreur...

Certe dans ce cas la fonction Copy de l'objet worksheet serait plus adaptée :merci:
 

zeb

Modérateur
Et oui, mais non.... :) Regarde bien le code proposé. Il s'agit bien de la fonction Copy de Range qui n'a pas du tout le même prototype que la fonction Copy de WorkSheet :

Dixit l'aide de VBA/Excel :

Copy, méthode

Méthode Copy telle qu'elle s'applique à l'objet Range.
Cette méthode copie la plage vers la plage spécifiée ou dans le Presse-papiers.
[fixed]expression.Copy(Destination)[/fixed]
expression Obligatoire. Expression qui renvoie un objet Range.
Destination Argument de type Variant facultatif. Spécifie la nouvelle plage dans laquelle la plage spécifiée sera copiée. Si vous ne spécifiez pas cet argument, Microsoft Excel copie la plage dans le Presse-papiers.

Méthode Copy telle qu'elle s'applique aux objets Chart, Charts, Sheets, Worksheet et Worksheets.
Cette méthode copie la feuille à un autre emplacement dans le classeur (*).
[fixed]expression.Copy(Before, After)[/fixed]
expression Obligatoire. Expression qui renvoie un des objets ci-dessus.
Before Argument de type Variant facultatif. Feuille avant laquelle la feuille copiée sera placée. Vous ne pouvez spécifier simultanément l'argument Before et l'argument After.
After Argument de type Variant facultatif. Feuille après laquelle la feuille copiée sera placée. Il est impossible d'utiliser simultanément l'argument After et l'argument Before.

Note
Si vous ne spécifiez ni l'argument Before ni l'argument After, Microsoft Excel crée un nouveau classeur contenant la feuille copiée.

Exemples
Méthode Copy telle qu'elle s'applique à l'objet Range.
Cet exemple montre comment copier les formules des cellules A1 à D4 de la feuille Sheet1 dans les cellules E5 à H8 de la feuille Sheet2.
[fixed]Worksheets("Sheet1").Range("A1:D4").Copy _
destination:=Worksheets("Sheet2").Range("E5")[/fixed]

Méthode Copy telle qu'elle s'applique aux objets Chart, Charts, Sheets, Worksheet et Worksheets
Cet exemple montre comment copier Sheet1 et placer la copie après Sheet3.
[fixed]Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")[/fixed]

(*) Je n'aime pas beaucoup cette phrase. Je corrige :
Cette méthode copie la feuille à un autre emplacement dans ce classeur ou un autre.



Donc après avoir relu l'aide, je tiens compte de ta remarque et au lieu de ça :
[fixed]Workbooks("Classeur1").Sheets("Feuil1").Cells.Copy _
Workbooks("Classeur2").Sheets.Add(Workbooks("Classeur2").Sheets("Feuil3")).Cells[/fixed]Je propose au lieu des 15 lignes ci-dessus :
[fixed]Workbooks("Classeur1").Sheets("Feuil1").Copy Before:=Workbooks("Classeur2").Sheets("Feuil3")[/fixed]

Qu'en dis-tu, Freeman ? :sol:
 

Freeman23

Expert
héhé
C'est bien à quoi je pensais désolé mais j'avais pas vu le spoiler enfin pas compris que je devais cliquer pour visualiser le contenu...
Enfin l'utilisation de ce code à une limite, la VA :sarcastic: donc autant que possible éviter les nomages d'onglet en dur. J'utilise ca en général...mais je te taquine :whistle:

Code:
Workbooks("Classeur1" ).Sheets("Feuil1" ).Copy After:=Workbooks("Classeur2" ).Sheets(Workbooks("Classeur2" ).Sheets.count)
 

zeb

Modérateur
Oui, en fait, coucoune s'est rendu coupable d'irrespect envers les règles, aussi le méchant modérateur que je suis, lui a laissé un message bien sarcastique. Mais le Dr Jekill qui se cache ( :sol: ) en moi ne pouvait pas ne pas donner une soluce.

Bien-sûr, le "en-dur" est à proscrire le plus possible.
L'idéal, c'est d'utiliser Set. Comme à la ligne 5 de ton code
 

coucoune

Nouveau membre
Merci à vous deux, il ya beaucoup d'informations dans vos explications, il va me faloir du temps pour comprendre, je vous tiendrais au courant sur l'évolution de mon projet.

Ps : mon irrespect des règles n'est pas volontaire mais les termes techniques pour un novice sont difficiles à assimilés, mais mon but est bien avant tout de chercher et de comprendre .......mais c'est dur!!!!
 

zeb

Modérateur
Freeman s'est fait prendre ailleurs ( ) au même petit jeu. Alors ce message est teinté d'ironie... :D

Demander une soluce, c'est bien, la comprende c'est mieux. Quand en plus plusieurs forumeurs se tirent la bourre pour présenter la soluce la plus élégante, c'est encore mieux. Surtout si tu peux suivre... Cela peut être dur, mais tu as plusieurs alliés : ta jujotte, l'aide en ligne, ... ;)

Courage.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 809
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut