Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2011, 11h49   #1
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 242
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 242
Points : 80
Points : 80
Par défaut Soustractions de données

Bonjour à tous,

J'ai un fichier excel qui contient une foultitude de données dans une première feuille.


J'ai besoin dans une seconde feuille de :

-recopier la première colonne (la A) telle quelle
-soustraire la colonne B à toutes les autres colonnes (ainsi dans la deuxième feuille je veux avoir colonne B=colonne C première feuille - colonne B première feuille ; colonne C=colonne D première feuille - colonne B première feuille; et ainsi de suite jusqu'à la première colonne vide de la première feuille)


Enfin dans une troisième feuille je souhaiterais que :

-recopier la première colonne (la A) telle quelle
-soustraire la valeur de la colonne B ligne x de la deuxième feuille à toutes les lignes de la colonne B et renvoyer la valeur dans la feuille 3 colonne B
-soustraire la valeur de la colonne C ligne x de la deuxième feuille à toutes les lignes de la colonne C et renvoyer la valeur dans la feuille 3 colonne C
et ainsi de suite pour toutes les colonnes non vide

Je vous remercie de votre aide par avance

Cordialement

Vincent
PS je n'ai pas la moindre idée de la manière de m'y prendre pour réaliser une telle macro
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 12h16   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
A mon avis, pas besoin de VBA pour faire tout cela. Les formules Excel sont largement suffisantes.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 13h22   #3
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 242
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 242
Points : 80
Points : 80
effectivement celà peut être fait manuellement cependant traiter des dizaines (pour ne pas dire des centaines) de fichier contenant chacun plus de 1700 lignes et 30 colonnes est assez redondant pour nécessiter une macro

C'est pourquoi je sollicite votre aide

Cordialement

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 13h53   #4
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

Voici un bout de code pour te permettre de commencer

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
33
34
35
Option Explicit
Sub Copie()
 
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Const PremL1 = 1 'Première ligne de données dans la feuille 1
Const PremC1 = 1 'Première colonne de données dans la feuille 1
Dim DerL1 As Long 'Dernière ligne de données dans la feuille 1
Dim DerC1 As Long 'Dernière colonne de données dans la feuille 1
 
Set ws1 = Worksheets("Feuil1") 'L'objet Feuille 1 est attribué à la variable ws1
Set ws2 = Worksheets("Feuil2") 'L'objet Feuille 2 est attribué à la variable ws2
Set ws3 = Worksheets("Feuil3") 'L'objet Feuille 3 est attribué à la variable ws3
 
'Recherche de la dernière ligne renseignée dans la colonne A de la feuille 1
DerL1 = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row
'Recherche de la dernière colonne renseignée dans la ligne 1 de la feuille 1
DerC1 = ws1.Cells(1, ws1.Columns.Count).End(xlToLeft).Column
 
'Recopie de la colonne A de la feuille 1 dans les feuilles 2 et 3
ws1.Range("A:A").Copy ws2.Range("A:A")
ws1.Range("A:A").Copy ws3.Range("A:A")
 
'soustraire la colonne B de la feuille 1 à toutes les autres colonnes pour renseigner la feuille 2
For Col = PremC1 To DerC1 - 2
    For Lig = PremL1 To DerL1
        ws2.Cells(Lig, Col).Offset(0, 1) = ws1.Cells(Lig, Col).Offset(0, 2) - ws1.Cells(Lig, PremC1 + 1)
    Next Lig
Next Col
 
'Libère les ressources
Set ws1 = Nothing
Set ws2 = Nothing
Set ws3 = Nothing
 
End Sub
Je n'ai pas traité la deuxième partie car je n'ai pas compris l'opération que tu souhaites réaliser (ligne x ?).
Citation:
-soustraire la valeur de la colonne B ligne x de la deuxième feuille à toutes les lignes de la colonne B et renvoyer la valeur dans la feuille 3 colonne B
-soustraire la valeur de la colonne C ligne x de la deuxième feuille à toutes les lignes de la colonne C et renvoyer la valeur dans la feuille 3 colonne C
et ainsi de suite pour toutes les colonnes non vide
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h04   #5
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 242
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 242
Points : 80
Points : 80
Tout d'abord merci beaucoup pour la première partie de ma question, la solution proposée fonctionne correctement.

Concernant la deuxième partie :

Soit une ligne x (par exemple la ligne 345) je souhaite réaliser la soustraction suivante pour toutes les colonnes SAUF la A :

=ligne 1 - ligne 345
=ligne 2- ligne 345
...
=ligne (vide-1) -ligne 345
=ligne vide ===> END

Les valeurs obtenues seront renvoyées dans une troisième feuille (par exemple [feuille 3 colonne B ligne 4] = [feuille 2 colonne B ligne 4] - [feuille 2 colonne B ligne 345]

Est ce plus clair ?
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 15h37   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Mouais ! c’est limpide … ou pas !

Si j’ai bien suivi ton raisonnement, tu vas balayer toutes les lignes(x) de la colonne B et effectuer le calcul : B(x)(feuil3) = B(x)(feuil2) - B345(feuil2) ( idem pour les autres colonnes).
Exemple : quand tu vas atteindre la cellule B345, tu vas effectuer le calcul suivant : B345(feuil3) = B345(feuil2) - B345(feuil2) = 0.
C’est bien ça ?

Comment déclares-tu le numéro de ligne correspondant à la valeur à soustraire ?
Est-ce une constante déclarée « en dur » dans la procédure ou une variable ?

Dernier point (primordial) : n’as-tu pas assez d’éléments avec le code mis à ta disposition pour te dépatouiller ? Le forum a pour vocation d’aider les participants à rédiger leurs procédures. Tu ne dois pas demander que le travail soit fait à ta place.

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 15h43   #7
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 242
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 242
Points : 80
Points : 80
Merci gFZT82,

Grâce à ton code j'ai un peu bricolé et ça fonctionne. J'ai rajouté les lignes suivantes juste avant le "'libère les ressources" :

(j'ai défini que la valeur à retrancher était situé sur la ligne 882)

Code :
1
2
3
4
5
For Col = PremC1 To DerC1 - 2
    For Lig = PremL1 To DerL1
        ws3.Cells(Lig, Col + 1) = ws2.Cells(Lig, Col + 1) - ws2.Cells(882, Col + 1)
    Next Lig
Next Col
J'ai viré le Offset (blablabla) c'est important ? à quoi ça correspond ?

En tout cas encore merci pour ton aide

Bonne soirée

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 16h13   #8
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par Vincent32 Voir le message
J'ai viré le Offset (blablabla) c'est important ? à quoi ça correspond ?
Lorsque tu désigne une cellule par:

ou par

Rajouter .Offset(i,j) permet de décaler de i lignes et j colonnes la cellule désignée initialement.

Par exemple:

Code :
Cells(1,1).Offset(2,3) = Cells(3,4)
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 16h13   #9
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bravo à toi !

Le offset (blablabla) permet de se référencer à une plage au moyen d’un décalage.
Range("C1") est équivalent à Range("B1").offset(0,1) … décalage de 0 ligne et 1 colonne.
Range("C2") est équivalent à Range("C1").offset(1,0) … décalage de 1 ligne et 0 colonne.

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 16h21   #10
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 242
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 242
Points : 80
Points : 80
Encore merci pour le code ainsi que les explications très claires

Bonne soirée à vous

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h50.


 
 
 
 
Partenaires

Hébergement Web