COPIER COLLER

cs_dior2009 Messages postés 14 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 2 janvier 2015 - Modifié par jordane45 le 31/05/2014 à 23:24
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 1 juin 2014 à 04:22
Bonjour,

merci de votre aide. voici mon problème, j'ai deux fichiers TRANSACTIONS_CREDIT.xlsx, TRANSACTIONS_DEBIT.xlsx contenant chacun plusieurs lignes et colonnes
je souhaiterai créer un autre classeur qui calcule le solde des deux fichiers
voici un début de code mais il met trop de temps et il ne s'arrete pas

Option Explicit
Sub remplir()
Dim NumLigne As String
Dim i As Integer
Dim j As Integer
Dim NumColonne As String
Application.ScreenUpdating = False

Workbooks.Open("C:\Desktop \TRANSACTIONS_CREDIT.xlsx")
Workbooks.Open ("C:\Desktop\TRANSACTIONS_DEBIT.xlsx")

NumColonne = nombre de colonnes
NumLigne = nombre maximal de lignes de TRANSACTIONS_CREDIT.xlsx
   For j = 2 To NumColonne Step 3
      For i = 2 To NumLigne
         Cells(i, j - 1).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j - 1).Value
         Cells(i, j).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j).Value - Workbooks("TRANSACTIONS_DEBIT.xlsx").Sheets(1).Cells(i, j).Value
         Cells(i, j + 1).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j + 1).Value
      Next
   Next
  Workbooks.Open("TRANSACTIONS_CREDIT.xlsx").close
Workbooks.Open ("TRANSACTIONS_DEBIT.xlsx").Close
Application.ScreenUpdating = False

End Sub



Edit : Ajout des balises de code.
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code


--

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 mai 2014 à 16:58
Salut

Déjà, en premier, voilà ton code lisible grace aux balises du forum:
Option Explicit 
Sub remplir() 
    Dim NumLigne As String 
    Dim i As Integer 
    Dim j As Integer 
    Dim NumColonne As String 
    Application.ScreenUpdating = False 

    Workbooks.Open("C:\Desktop \TRANSACTIONS_CREDIT.xlsx") 
    Workbooks.Open ("C:\Desktop\TRANSACTIONS_DEBIT.xlsx") 

    NumColonne = nombre de colonnes 
    NumLigne = nombre maximal de lignes de TRANSACTIONS_CREDIT.xlsx 
    For j = 2 To NumColonne Step 3 
        For i = 2 To NumLigne 
            Cells(i, j - 1).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j - 1).Value
            Cells(i, j).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j).Value - Workbooks("TRANSACTIONS_DEBIT.xlsx").Sheets(1).Cells(i, j).Value
            Cells(i, j + 1).Value = Workbooks("TRANSACTIONS_CREDIT.xlsx").Sheets(1).Cells(i, j + 1).Value
        Next 
    Next 
    Workbooks.Open("TRANSACTIONS_CREDIT.xlsx").close 
    Workbooks.Open ("TRANSACTIONS_DEBIT.xlsx").Close 
    Application.ScreenUpdating = False 
End Sub 

On y voit un peu plus clair. C'est une meilleure chance d'avoir une réponse, non ?

Pour le code :
D'abord, il faut utiliser les objets :
Dim oWbCredit As Workbook    ' wb comme WorkBook
Dim oWbDebit  As Workbook
Dim oShCredit  As WorkSheet  ' Sh comme Sheet
Dim oShDebit   As WorkSheet

puis les affecter à tes fichiers :
Set oWbCredit = Workbooks.Open("C:\Desktop \TRANSACTIONS_CREDIT.xlsx")
Set oWbDebit = Workbooks.Open("C:\Desktop \TRANSACTIONS_DEDIT.xlsx")
Set oShCredit = oWbCredit.Sheet(1)
Set oShDebit = oWbDebit.Sheet(1)

"Cells" appartient à la feuille en cours : On suppose donc qu'il s'agit d'une autre feuille que celles ouvertes.
Les boucles, telles que tu les as conçues deviennent :
Cells(i, j - 1).Value = oShCredit.Cells(i, j - 1).Value
Cells(i, j).Value = oShCredit.Cells(i, j).Value _
                  - oShDebit.Cells(i, j).Value
Cells(i, j + 1).Value = oShCredit.Cells(i, j + 1).Value

Suivi de la fermeture des classeurs :
oWbCredit.Close
oWbDebit.Close

C'est quand même beaucoup plus digeste, non ?
A toi de voir maintenant si les calculs sont corrects.
Pour ce qui est de la lenteur, tout dépend du nombre de lignes et de colonnes que tu scannes.

Il ne s'arrête pas : là aussi, tout dépend de ce que tu mets dans tes varaibles NumColonne et Numligne, mais à priori, aucune raison que le programme ne s'arrête pas.

Rappel de la méthode de débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage.
Lors de l'arrêt, survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6/VBA) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
Modifié par cs_Jack le 30/05/2014 à 17:10
Voir aussi l'utilisation de Range et de "For Each", exemple :
Dim oRangeTemp  As Range
Dim oRangeCredit As Range
Set oRangeCredit = oShCredit.Range("A2:A4012")
For Each oRangeTemp In oRangeCredit
    ' Enumère chaque cellule contenue dans oRangeCredit
    ' et recopie la valeur X 2 dans la colonne d'à côté, sur la même ligne
    oRangeTemp.Offset(0, 1).Value = oRangeTemp.Value * 2
Next

Le mot "Set" en tête d'instruction doit être utiliser lorsqu'on affecte un contenu à un objet. (objet, pas varaible)

Dans ton cas, où tu dois scruter les mêmes numéros de lignes dans deux feuilles différentes, cette dernière méthode ne t'apporte rien; l'utilisation des index avec Cells est plus pratique. C'était juste pour te donner des idées.
0
cs_dior2009 Messages postés 14 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 2 janvier 2015
30 mai 2014 à 18:23
MERCI CS_JACK DE LA CORRECTION ET DE L'AIDE JE LE TESTE PUIS JE REVIENDRAI VERS VOUS.

--
0
cs_dior2009 Messages postés 14 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 2 janvier 2015
30 mai 2014 à 21:20
CS jack j'ai testé le code mais le temps d'exécution est long auriez-vous une méthode pour accélérer l'exécution.
merci
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 mai 2014 à 23:42
Je ne t'ai proposé qu'une mise en forme de ton code = sans changement.
Pour commencer, tu pourrais répondre à mes interrogations :
Qu'as-tu mis dans NumColonne et NumLigne ?
Ensuite, il faudrait savoir ce que tu veux faire avec tes cellules : Crédit/Débit : c'est vaste. Les formules que tu as écrites sont sencées faire quoi ?
Est-ce de l'aide sur le code ou sur la méthode ?
Donne des explications sur le problème que tu suppose. Nous, on n'en sait rien. C'est à toi de t'expliquer.
Est-ce que le résultat, même long, te satisfait ?
Si oui : il faut penser à affiner la programmation
Si non : il faut savoir ce que tu veux faire.
0
jordane45 Messages postés 38135 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 13 avril 2024 344
31 mai 2014 à 23:37
Bonjour,

1 - Il semble que tu programmes en VBA .. hors tu as posté dans la rubrique "générique" du forum : visual Basic.
Si c'est bien le cas... dis le moi que je déplace ton sujet dans la bonne section du forum.

2 - comme te l'as demande Jack... qu'as tu mis dans tes variables
NumColonne et NumLigne ( quelle est leur valeur au moment de l'exécution du code ? )

3 - Pour fermer des classeurs, la commande c'est :
Workbooks("TRANSACTIONS_CREDIT.xlsx").Close SaveChanges:=False

http://msdn.microsoft.com/fr-fr/library/office/ff838613%28v=office.15%29.aspx

4 - Pour ouvrir puis manipuler des classeurs (via OPEN) tu peux faire comme ceci :

 Dim wkbkCredits     As Workbook
 '...
 Set wkbkCredits= Workbooks.Open("TRANSACTIONS_CREDIT.xlsx") 

' utilisation du classeur ouvert...par exemple
cells(1,2).value = wkbkCredits.sheets(1).cells(1,2).value

'fermeture du classeur:
wkbkCredits.close



Commence déjà par corriger ces quelques points on verra ensuite pour le reste.

0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 juin 2014 à 04:22
lol, oui, j'ai écrit de mémoire, sans vérifier.
0
Rejoignez-nous