Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    juin 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 38
    Points : 10
    Points
    10

    Par défaut [VSTO][C#/Excel] Comment Copier/Coller des cellules ?

    Bonjour,

    J'ai des fichiers xls qui sont mis en prodction a un endroit donné. Ces fichiers, quand on les ouvre, demandent si il faut effectuer la mise a jour étant donné qu'ils utilisent des liens vers d'autres fichiers xls.
    J'aimerai que l'on me demande plus de faire cette mise a jour car les données de ces fichiers sont fixés une fois pour toute quand ils arrivent dans ce répertoire de production.

    ...donc la solution (qui marche bien manuellement ) est de tout selectionner, de faire un "copy" (copier) puis un "paste special" (coller special) ...et de dire qu'on ne colle que les valeurs... ainsi on se retrouve avec juste les valeurs et plus de liens.

    J'essai d'automatiser cela en Excel mais je m'en sors pas. Pas de probleme pour parcourir les repertoires, ouvrir les fichiers excel, parcourir les feuilles de ces fichiers, ... par contre je n'arrive pas a copier une feuille entiere pour pouvoir faire mon PasteSpecial par la suite.

    VOila ou j'en suis :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    foreach (Excel.Worksheet sh in ThisWorkbook.Sheets)
    {
        // je selectionne tout : ?
         sh.Cells.Select();
     
        // je recupere ma selection dans un object Range : ?
        Excel.Range selectedRange = (Excel.Range)ThisApplication.Selection;
     
       // j'effectue ma copie:
      // ????
     
       // je fais mon paste special:	
      selectedRange.PasteSpecial(Excel.XlPasteType.xlPasteValues,Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
     
        // je sauve :			
       ThisWorkbook.Save();

    Si vous avez une idee de comment effectuer un copier coller en C# ca m'interesse car je m'en sors pas.

    Merci d'avance

    Gael

  2. #2
    Nouveau Membre du Club Avatar de yoyann
    Inscrit en
    juillet 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 37
    Points : 31
    Points
    31

    Par défaut

    Salut,

    Pour ce problème tu as essayé de faire une nouvelle macro Excel ?

    - Tu lances une nouvelle macro
    - tu fais la manip (le copier coller)
    -tu arretes l'enregistrement de la macro
    -tu regarde la code que Excel a généré puis tu l'adaptes pour qu'il soit à la syntaxe C#.
    Un optimiste est un pessimiste mal informé… être paranoïaque c'est la moindre des choses, c'est être lucide, au courant des dangers… La vie est un jeu de massacre

    Association informatique
    http://www.munci.org/

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    juin 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 38
    Points : 10
    Points
    10

    Par défaut

    Citation Envoyé par yoyann
    Salut,

    Pour ce problème tu as essayé de faire une nouvelle macro Excel ?

    - Tu lances une nouvelle macro
    - tu fais la manip (le copier coller)
    -tu arretes l'enregistrement de la macro
    -tu regarde la code que Excel a généré puis tu l'adaptes pour qu'il soit à la syntaxe C#.
    ouais c'est exactement ce que j'ai fait mais j'arrive pas a adapter.
    Par ex la macro Excel je fais un truc du genre :
    maSelection.Copy
    PasteSpecial(....)

    ...et en C# deja je ne trouve pas de fonction Copy sans parametre je dois utiliser un truc du genre Copy(string destination)


    Dans le pire des cas je peux toujours mettre ma macro dans tous mes fichiers excel et appeler cette macro a partir de mon prog en C# ...mais bon c'est beaucoup moins bien j'aurai pas mal de maintenance

    En tout cas merci pour tes conseils

  4. #4
    Candidat au titre de Membre du Club
    Inscrit en
    juin 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 38
    Points : 10
    Points
    10

    Par défaut

    Voila le code que la macro me genere pour faire un copier coller de toute ma feuille pour ne garder que les valeurs et plus les formules :

    Code :
    1
    2
    3
    4
    5
    6
     
    Sub Macro1()
        Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= False, Transpose:=False
    End Sub
    Je pensais pouvoir transcrire ca en C# assez facilement mais c'est pas le cas

  5. #5
    Nouveau Membre du Club Avatar de yoyann
    Inscrit en
    juillet 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 37
    Points : 31
    Points
    31

    Par défaut

    Au lieu de faire une selection tu affectes à une variable range la plage de cellule à copier.
    Puis tu fais un copy, nomVariableRange.copy();
    et après tu peut faire un paste special sur la cellule en destination.

    En fait pour être plus clair , au lieu de faire les selections comme sur l'enregistrement de la macro, tu donnes explicitement les plages de cellules.
    Un optimiste est un pessimiste mal informé… être paranoïaque c'est la moindre des choses, c'est être lucide, au courant des dangers… La vie est un jeu de massacre

    Association informatique
    http://www.munci.org/

  6. #6
    Candidat au titre de Membre du Club
    Inscrit en
    juin 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2004
    Messages : 38
    Points : 10
    Points
    10

    Par défaut

    Citation Envoyé par yoyann
    Au lieu de faire une selection tu affectes à une variable range la plage de cellule à copier.
    Puis tu fais un copy, nomVariableRange.copy();
    et après tu peut faire un paste special sur la cellule en destination.

    En fait pour être plus clair , au lieu de faire les selections comme sur l'enregistrement de la macro, tu donnes explicitement les plages de cellules.
    Le probleme est que je ne sais pas a l'avance dans le fichier quelles plages de données sont utilisées donc je dois faire un copy paste sur l'ensemble des plages de données.

    ...mais c'est pas grave je m'en suis sorti autrement :
    _ j'ouvre le fichier excel
    _ j'insere une macro excel dans mon fichier excel dans un nouveau module
    (
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    VBIDE.VBComponent oModule;
    String sCode;
     
    oModule = ThisWorkbook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
    oModule.Name = "copyPasteModule";
     
    sCode = 
    "Sub MacroCopyPasteSpecial()\r\n" +
    "   nbSheets = Sheets.Count\r\n" +
    "	For i = 1 To nbSheets\r\n" +
    "		Sheets(i).Visible = True\r\n" +
    "		Sheets(i).Select\r\n" +
    "		Cells.Select\r\n" +
    "		Application.CutCopyMode = False\r\n" +
    "		Selection.Copy\r\n" +
    "		Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False\r\n" +
    "	Next i\r\n" +
    "	If (nbSheets > 1) Then\r\n" +
    "		For j = 2 To nbSheets\r\n" +
    "			Sheets(j).Visible = False\r\n" +
    "		Next j\r\n" +
    "	End If\r\n" + 
    "	Sheets(1).Select\r\n" +
    "	Range(\"A1\").Select\r\n" +
    "End Sub\r\n" +
    "Sub Auto_Open()\r\n" +
    "	Call MacroCopyPasteSpecial\r\n" +
    "End Sub\r\n";
     
    oModule.CodeModule.AddFromString(sCode);
    )
    _ j'execute cette macro
    _ je supprime le module donc la macro
    _ je sauve

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •