Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Problème formule matricielle

  • Initiateur de la discussion Cédric
  • Date de début
C

Cédric

Guest
Bonjour à tous ! Il s'agit de mon tout premier message sur ce forum, j'espère ne pas dire trop de bêtises.

Je suis en train de confectionner un petit outil de gestion et j'ai un problème avec une formule matricielle. Tout se passe sur la feuille de saisie dans le tableau du milieu. J'ai fait une formule matricielle pour la ligne Tefal qui marche parfaitement, cependant en voulant refaire la même chose pour la ligne Montant, cela me met l'erreur #Valeur.

La formule matricielle repose sur des colonnes présentes dans la deuxième feuille "Fichier SAP". J'ai examiné les deux colonnes et je me suis aperçu que la colonne montant comporte des chiffres dont le séparateur des milliers a été fait manuellement, ainsi ce n'est plus considéré comme un chiffre et je pense que l'erreur vient de là.

Le problème ç'est que j'extraie ce fichier SAP et qu'il est beaucoup plus long que celui que je vous ai fourni, je ne peux pas me permettre de toutes les retoucher à la main. Y a t il une solution pour convertir ces chiffres "hybrides" ? Ou alors au moins les afficher dans la case Montant.

Merci d'avance, j'espère avoir été clair.
 
C

Cédric

Guest
Merci beaucoup de ta réponse Monique !

Plus j'avance et plus je rencontre des problèmes... Je vous renvoie mon fichier pour voir si vous pouvez jeter un coup d'oeil; j'ai mis un bouton "Solde" dans la "Feuille de saisi". J'aimerais lui affecter une macro qui effacerait dans le "fichier SAP" toutes les lignes concernant le matricule renseigné au début. Ce que je veux faire à la fin est plus compliqué mais j'aimerais m'aider de votre macro pour progresser.

Enespérant avoir été clair amicalement, Cédric.
 

Pièces jointes

  • Mail2.xls
    40 KB · Affichages: 65
  • Mail2.xls
    40 KB · Affichages: 79
  • Mail2.xls
    40 KB · Affichages: 85
Z

Zon

Guest
Bonsoir à tous,


Voici un code que je te propose, par contre comme tu as des formules assez longues dans ta feuille de saisie, le temps d'éxécution est assez long, même en désactivant le calcul automatique dans mon code puis je le réactive à la fin....



A+++




PS ZIPPONS les fichiers...
 

Pièces jointes

  • Mail2.zip
    17.5 KB · Affichages: 18
  • Mail2.zip
    17.5 KB · Affichages: 20
  • Mail2.zip
    17.5 KB · Affichages: 19
C

Cédric

Guest
Merci beaucoup pour cette formule ç'est vriament génial ! Mis à ton avis, comment est ce que je pourrais améliorer la vitesse de l'outil ?

Désolé pour les Zip, je le ferais la prochaine fois
 
Z

Zon

Guest
Bonjour à tous,


Peut-être qu'en supprimant la cellule qui contient le matricule dans la feuille de saisie, on gagnera quelque seconde.

Dim cell As Range
Dim L As Byte, I As Byte
Dim Ws1 As Worksheet, Ws2 As Worksheet
Sub Effaceligne()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set Ws1 = Sheets("Feuille de saisie")
Set Ws2 = Sheets("Fichier SAP")
Set cell = Ws1.Range("C4")
L = Ws2.Range("N256").End(xlUp).Row
If IsEmpty(cell) Then
MsgBox "La cellule contenant le N° de matricule est vide", vbOKOnly, "ERREUR"
GoTo Fin
Else: For I = 1 To L
If cell = Ws2.Range("N" & I) Then
Ws2.Rows(I).Delete
I = I - 1
End If
Next I
End If
Ws1.Range("C4").ClearContents''''''''''Cette ligne est à rajoutée
Fin:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True '''Ligne à supprimer si on veut pas remettre le calcul auto
End Sub




En ne réactivant pas le calcul automatique, la procédure sera trés courte....



A te de voir Cédric..

A+++
 
C

Cédric

Guest
Merci d'avoir pris le temps de m'expliquer, j'ai essayé de supprimer les lignes que tu m'as indiqué mais cela n'a pas amélioré la vitesse, ç'est pas grave je laisserais comme ça.

Cependant j'ai essayé de modifier le code pour qu'au lieu d'effacer les lignes concernées, ils les copient dans une autre feuille.

Merci d'avance.

Quelqu'un pourrait il me donner des indications pour trouver un bon tutorial VBA ? Thanks !
 
Z

Zon

Guest
Re,


Désolé je ne t'ai pas indiqué la bonne ligne à supprimer, su tu débutes en VBA, voilà je vais essayer de t'expliquer mon code pour que tu comprennes ce que j'ai fait:

Option Explicit
Dim cell As Range
Dim L As Byte, I As Byte
Dim Ws1 As Worksheet, Ws2 As Worksheet
Sub Effaceligne()
Application.ScreenUpdating = False 'Désactive les défilements d'écran
Application.Calculation = xlCalculationManual 'On met le classeur en mode calcul manuel
Set Ws1 = Sheets("Feuille de saisie") 'Affectation de la feuille Feuille de saisie à la variable Ws1
Set Ws2 = Sheets("Fichier SAP")'id pour fichier SAP
Set cell = Ws1.Range("C4")
L = Ws2.Range("N256").End(xlUp).Row'Je récupère la dernière ligne vide de la colonne N dans Fichier SAP
If IsEmpty(cell) Then 'Je teste si cell(C4) est vide
MsgBox "La cellule contenant le N° de matricule est vide", vbOKOnly, "ERREUR"
GoTo Fin
Else: For I = 1 To L
If cell = Ws2.Range("N" & I) Then ' Si C4 est égal à NI alors
Ws2.Rows(I).Delete ' effacement de la ligne I
I = I - 1 'On ôte 1 à I puisqu'on vient d'effacer une ligne
End If
Next I 'on passe à la cellule suivante
End If
Ws1.Range("C4").ClearContents 'Ici on efface la cellule C4
Fin:
Application.Calculation = xlCalculationAutomatic'C'est ici qu'il faut effacer la ligne
Application.ScreenUpdating = True


End Sub

Pour les sites en voilà 2 parmi tant d'autres que je trouve pédagogique, commence par celui dele site pour débuter
puis par Ce site n'existe plus.


PS: Jon, ton site est une mine d'infos importantes et moi le violet ne me dérange pas....Par contre tes interventions sur XLD ne sont pas toujours explicite pour des néophites contrairement à ton site...


A+++
 
C

Cédric

Guest
Merci de prendre autant le temps de m'aider. Je me rends compte que je n'aurais pas le temps d'apprendre le VBA car ç'est bien plus compliqué que je ne le pensais. pourrais-tu me donner quelques précisions ?

L = Ws2.Range("N256").End(xlUp).Row'Je récupère la dernière ligne vide de la colonne N dans Fichier SAP --> Pourquoi 256 ?

Je veux créer un autre bouton avec une macro qui au lieu d'effacer copierait avant les lignes dans une autre feuille. Est-ce je peux garder le même code et travailler ici :
If cell = Ws2.Range("N" & I) Then ' Si C4 est égal à NI alors
Ws2.Rows(I).Delete ' effacement de la ligne I

Entre les deux, est-ce que je peux rajouter une fonction copy ? Merci de m'éclairer ...

Je vous souhaite une agréable journée.
 
Z

Zon

Guest
Re,


Le 256 car je déclare L en variable Byte qui ne peut pas dépasser la valeur 255

Si tu auras plus de lignes (>255)tu peus mettre L en integer et remplacer le 256 par 32768

ou encore L en long le 256 deviendra 65536....
Je pense qu'en Integer dans ton cas devrait suffir
Pour la copie:

tu rajoutes une variable Ws3 et L2 pourrécupérer la dernière ligne remplie de WS3 (idem que Ws1 et Ws2), L2 déclarée en Integer et la syntaxe pour la copie de la ligne entière sera la suivante:
...
L2=Ws3.Range("A32768").end(xlup).row 'Le A est à adapter si ta colonne A ne contient pas toujours des valeurs d'aprés ce que j'ai pu voir dans tes données.
Ws2.Rows(4).Copy Destination:=Ws3.Range("A" & L + 1) 'Je mets L+1 car c'est la première cellule vide.

....

A+++
 
C

Cédric

Guest
j'ai essayé un peu de bidouiller le code :

Option Explicit
Dim cell As Range
Dim L As Integer, L2 As Integer, I As Byte
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet
Sub Effaceligne()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set Ws1 = Sheets("Feuille de saisie")
Set Ws2 = Sheets("Fichier SAP")
Set Ws3 = Sheets("Feuille 1")
Set cell = Ws1.Range("C4")
L = Ws2.Range("N32768").End(xlUp).Row
L2 = Ws3.Range("N32768").End(xlUp).Row
If IsEmpty(cell) Then
MsgBox "La cellule contenant le N° de matricule est vide", vbOKOnly, "ERREUR"
GoTo Fin
Else: For I = 1 To L
If cell = Ws2.Range("N" & I) Then
Ws2.Rows(I).Copy Destination:=Ws3.Range("A" & L + 1) 'Je mets L+1 car c'est la première cellule vide.
Ws2.Rows(I).Delete
I = I - 1
End If
Next I
End If
Fin:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Il met une erreur 91 comme quoi la variable objet n'est pas défin, ç'est unerreur avec Ws3 mais laquelle ?

Merci de me consacrer du temps ç'est bien sympa.

Au fait, j'ai désactivé le calcul automatique, plus aucune recherche ne marche (d'où le calcul automatique), c'est pas possbile de relancer les calculs avec un bouton ?
 
C

Cédric

Guest
En fait ça me copie bien les fichiers vers la feuille 1 mais je sens le code plutôt instable

De plus il me met pas toutes les lignes concernant le matricule mais juste une et il les copie sur le fichier mais pas de manière ordonné. Il commence à la ligne 18.
 
Z

Zon

Guest
Re,



A priori tu n'as pas essayé de rectifier (ce n'était pas un piége voulu) cela commence à la ligne 18 car il ne faut pas mettre L+1 mais L2+1....

et l'initialisation de L2 n'était pas à la bonne place( là c'était un piége)

Voici en fichier le bouton que tu demandais pour calcul auto/manuel..

avec les modifs sur Effaceligne effectuées ...




A+++
 

Pièces jointes

  • Mail2.1.zip
    21.8 KB · Affichages: 16
C

Cédric

Guest
Merci beaucoup, ç'est super sympa, j'avoue avoir un peu du mal avec le VBA car j'ai pas la "logique de programmation". C'est dommage que j'ai des délais assez serrés car sinon je me serias bien plongé dedans mais là ç'est un peu juste.

Je te souhaite une excellent journée et encore merci de ton aide précieuse.
 
C

Cédric

Guest
Bonjour à tous,

J'ai galéré toute l'après-midi sur VBA et les délais pour rendre mon projet deviennent serrés.
Si quelqu'un pourrait m'aider je lui serais très reconnaissant.

Je joins le fichier avec la petite explication. Je mets l'explication également ici :
Voilà j'aimerais assigné une macro au bouton "Solde".

Je vous explique concrètement ce que je souhaiterais réaliser.
--> Il faut tout d'abord regarder dans les deux lignes de validité (B18:M18) et (B26:M26).
3 possibilités dans ces cases : "OK"; "Pas OK"; "".
J'aimerais que quand il est inscrit "OK", il recherche la correspondance au niveau du mois. On a donc le mois.

--> A partir de là, il faut aller dans la feuille "Fichier SAP", rechercher les lignes correspondantes au matricule (C4 dans la feuille "Saisie20022003)
Le matricule dans le "Fichier SAP" est inscrit dans la colonne N. Là il faudrait effacer la celluledont le mois était Ok.

Je sais que j'en demande beaucoup mais je suis au pied du mur, j'ai beau avoir essayer quelques trucs je suis tombé sur des erreurs d'incompatibilité. Sans commencer par les bases de VBA et en apprenant petit à petit, je ne peux pas faire grande chose. Qu'est-ce qui m'a pris moi pauvre petit étudiant en gestion de prendre un projet informatique ?

Bonne soirée à tous et merci d'avance.

P.S : j'ai assigné une des macros que m'a gracieusement réalisé Zon peut-être que ça vous aidera.
 

Pièces jointes

  • Projet.zip
    23.7 KB · Affichages: 19
  • Projet.zip
    23.7 KB · Affichages: 18
  • Projet.zip
    23.7 KB · Affichages: 18
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…