Copie de cellules plutot que d'une ligne entière sous Excel

Ptitnabab Messages postés 1 Date d'inscription samedi 9 août 2008 Statut Membre Dernière intervention 9 août 2008 - 9 août 2008 à 10:12
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 - 18 août 2008 à 00:02
Bonjour et merci par avance de l'aide que vous pourrez m'apporter.
Je commence tout juste à explorer le code VB par l'intermédiaire d'Excel et je m'excuse par avance si ma questions est très basique et sa solution surement très simple.

J'utilise un classeur Excel2003 composé de deux feuilles.
La première est un listing d'articles avec en colonnes (A, H) différentes caractéristiques dont un prix unitaire. La colonne I est destinée à une quantité à remplir manuellement.
La seconde feuille est destinée à l'impression avec une mise en page qui serait automatique.

Quand une quantité est entrée dans la colonne I de la feuille 1, la ligne est copiée vers la feuille 2 grâce au code suivant :

Sub copiedeligne()

  Dim Lig     As Long
  Dim Col     As String
  Dim NbrLig  As Long
  Dim NumLig  As Long
 
  Sheets("Feuil2").Activate ' feuille de destination
 
  Col = "I"                 ' colonne de la donnée non vide à tester
  NumLig = 0
  With Sheets("Feuil1")     ' feuille source
  NbrLig = .Cells(65536, Col).End(xlUp).Row
  For Lig = 1 To NbrLig
    If .Cells(Lig, Col).Value <> "" Then
      .Cells(Lig, Col).EntireRow.Copy
      NumLig = NumLig + 1
      Cells(NumLig, 1).Select
      ActiveSheet.Paste
    End If
  Next
  End With
   
End Sub

Jusque là tout fonctionne mais j'aimerais sur ma feuille 2 en colonne J, et pour chaque ligne, insérer une fonction Produit (Prix unitaire X Quantité).
Seulement cette fonction disparait de ma colonne vu que la ligne entière est copiée. J'ai fait plusieurs essais avec  Range sans résultats pour l'instant, n'étant pas encore très familier du langage et de sa syntaxe.

Si quelqu'un pouvait m'aider a comprendre si il s'agit juste de mieux définir les cellules à copier ou bien de revoir ma méthode de copie.

Merci.

Thomas

 

2 réponses

virgil_68 Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 12 août 2008
12 août 2008 à 10:35
Bonjour, voici ce que je te propose :

Sub copiedeligne()

  Dim Lig     As Long
  Dim Col     As Long
  Dim NbrLig  As Long
  Dim NumLig  As Long
 
  Sheets("Feuil2").Activate                       ' feuille de destination
 
  Col = 9                                         ' colonne de la donnée non vide à tester
  NumLig = 0
  With Worksheets("Feuil1")                       ' feuille source
  NbrLig = .Cells(65536, Col).End(xlUp).Row
  For Lig = 1 To NbrLig
    If .Cells(Lig, Col).Value <> "" Then
      .Select                                                         'Il faut selectionner la feuille
      .Range(Cells(Lig, 1), Cells(Lig, 9)).Select         'Puis selectionner le pavé
                                                                          ' 1 et 9 : debut et fin du pavé a copier
      Selection.Copy                                              'Copier la selection
      NumLig = NumLig + 1
      Sheets("Feuil2").Select                       'Puis selectionner la feuille de destination
      Cells(NumLig, 1).Select                     'Se positionner sur la cellule de reception
      ActiveSheet.Paste                              'Coller
    End If
  Next
  End With
   
  Sheets("Feuil2").Select

End Sub
   
Dans l'etat, une fois la macro lancée, ca va flasher, car tu vas voir les feuilles passer de l'une a lautre sans arret. Ca ne sera pas très propre, et un peu stomboscopique.
Pour éviter cela, tu peux rajouter ceci :
  Au début du code, juste après les déclarations de variables
  Application.ScreenUpdating = False
    
  A la fin, juste avant le End Sub
  Application.ScreenUpdating = True
 
Il est conseillé de rajouter une gestion d'erreur, en cas de sortie de route intempestive. La raison est simple :
avec Application.ScreenUpdating = False, tu desactives le raffraichissement, donc la macro s'execute, mais aucun affichage est fait.
A la fin, avec Application.ScreenUpdating = True , tu rends la main a l'affichage qui, du coup se raffraichit et donc affiche ton travail.
Si pour une raison ou une autre, l'exécution se plante en cours de route, la commande Application.ScreenUpdating = True ne sera pas exécutée et donc le raffraichissement sera en stand by , ce qui peut s'averer génant.(isn't it ?)
 
Pour gérer cela, voici un bout de code simplifié
 
Sub MaProcédure()
'Déclaration de variables .....
 
Application.ScreenUpdating = False
 
On Error GoTo Etiquette     ' Si quelque chose se passe mal, je me rends vers Etiquette
 
 
'Code
 
Application.ScreenUpdating = True
 
Exit Sub  'Fin normale
 
Etiquette:        'le mot etiquette n'est pas un mot reservé, tu peux mettre ce que tu veux à                       part, bien sur, un mot reservé
 
Application.ScreenUpdating = True
 
End Sub

<hr size="2" width="100%" />J'espère avoir répondu à ton problème.
0
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
18 août 2008 à 00:02
Bonsoir à vous,
On peut aussi programmer d'une autre facon de telle sorte de ne plus utiliser
les codes comme "Select ,activate , copy ou paste".Ce qui provoque comme
précise virgil_68 des effets spéciaux !
Au lieu de faire copy et paste , on peut utiliser les tableaux bidirectionnels
pour la mise en memoire des cellules pour ensuite les mettres au bon endroit.

PtitNabab , as tu résolus ton problème ?
A++
0
Rejoignez-nous