Copie de cellules plutot que d'une ligne entière sous Excel
Ptitnabab
Messages postés1Date d'inscriptionsamedi 9 août 2008StatutMembreDernière intervention 9 août 2008
-
9 août 2008 à 10:12
dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 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
A voir également:
Copie de cellules plutot que d'une ligne entière sous Excel
virgil_68
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention12 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.
dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 juillet 20132 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.