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. :)
 
Z

zon

Guest
Bonsoir Cedric et tout le forum,




Si je comprends bien au lieu d'effacer tous les données concernés sur un matricule, tu veux le faire par condition OK.

Je l'ai fait pour les 2 années, il faut juste mettre OK pour les mois à supprimer, laisser vide pour les autres....et de cliquer sur le bouton solde.



En fait je passe par 2 variables tableaux que je rempli si la cellule mois est ="OK"...



A+++
 

Pièces jointes

  • Projetbeta1.zip
    22.7 KB · Affichages: 17
C

Cédric

Guest
Bonjour à tous et merci beaucoup Zon de m'avoir aidé.

J'ai regardé un peu le code et je me pose quelques questions.

P = Range("B26", "M26").SpecialCells(xlCellTypeBlanks).Count 'Récupération du nombre de OK
Q = Range("B18", "M18").SpecialCells(xlCellTypeBlanks).Count

En fait ici, on cherche le nombre de cellules qui vides ?

If P = 12 Or Q = 12 Then Exit Sub --> Kézako ?

ReDim Tab1(11 - P)
ReDim Tab2(11 - Q)

Là on regarde qu'elles sont les cellules non vides ?

K = 0
T = 0
For I = 2 To 13
If Ws1.Cells(26, I) = "OK" Then 'on remplit le tableau 2002
Tab1(K) = Ws1.Cells(22, I)
K = K + 1
End If
If Ws1.Cells(18, I) = "OK" Then 'on remplit le tableau 2003
Tab2(T) = Ws1.Cells(14, I)
T = T + 1
End If

Ici il teste toutes les cellules où il y a "OK" si je comprends bien.

Next I
For I = 1 To L
If cell = Ws2.Range("N" & I) Then
For J = 0 To 11 - P
If Tab1(J) = Ws2.Range("S" & I) Then
Ws2.Rows(I).Delete
Exit For
I = I - 1
End If
Next J
For J = 0 To 11 - Q
If Tab2(J) = Ws2.Range("S" & I) Then
Ws2.Rows(I).Delete
Exit For
I = I - 1
End If
Next J
End If
Next I
Fin:
End Sub

Donc si je comprends bien tout cette fonction, si je veux quand la case est "Pas OK" réalisée une autre opération comme copier les lignes vers une autre feuille, je dois rajouter des variables tableaux ?

Merci ! Bonne journée à tous !

P.S : Désolé pour le mail Zon mais le message ne s'uppe pas en haut du forum donc difficile à voir.
 
Z

zon

Guest
Bonsoir à tous,


SpecialCells(xlCellTypeBlanks) permet effectivement de récupérer le Nb de cellules vides dans une plage que j'ai mis dans les variables P et Q,


si P=12=>il n'y aucune cellule avec la cellule OK, donc on peut arrêter la procédure, cela veut dire qu'il y a aucune lignes à supprimer dans le fichier SAP..


Après, tu as bien compris ce que je faisais...


Pour ta dernière question c'est une façon de faire, tu es sur la voie....


A+++
 
C

Cédric

Guest
Bonjour à tous, j'ai réussi à terminer mon outil, cependant un rpoblème assez inattendu c'est posé au niveau de mes deux boutons de macros "Soldes" et "Ecarts". Ceux ci permettent de déplacer ou supprimer des lignes du fichier SAP. Il efface selon la ligne validité qui dispose de trois possibilités "OK"; "Pas Ok" ; "". A la base cela marchait mais j'ai effectué plusieurs modifications et je ne vois pas laquelle entraîne ces erreurs.
- J'ai automatisé la ligne "Validité" alors qu'avant OK et Pas OK se mettait manuellement.
- J'ai crée deux fichiers de saisies qui utilisent presque les mêmes macros mais sous un nom différent.
- J'ai changé la mise en page mais j'ai bien fait attention à remettre les bonnes cellules.

Je vous mets le fichier 1.397 qui représente la dernière version défectueuse et la 1.197 qui fonctionnait dans le principe, si vous pouviez trouver l'erreur cela serait génial.

Sinon j'avais une fonction au niveau d'une amélioration que j'aimerais apporter toujours au niveau de cette ligne "Validité". Tout est automatique mais parfois l'utilisateur sera amené à remplir manuellement. Est-il possible de créer un bouton qui permette après l'opération de remettre les formules ?


Au fait j'utilise le fichier sous un format Excel 95 pour permettre sa compatibilité avec Ecel 97.

Voilà merci beaucoup et bonne journée.
 

Pièces jointes

  • Prob.zip
    30.5 KB · Affichages: 21
  • Prob.zip
    30.5 KB · Affichages: 19
  • Prob.zip
    30.5 KB · Affichages: 26
Z

zon

Guest
Bonjour à tous,




Cédric, .SpecialCells(xlCellTypeBlanks) récupère le Nb de cellules vides, étant donné que tes cellules contiennent toutes des formules, c'est normal au niveau du bug, donc plus besoin de cela:

Le code suivant fonctionne chez moi, j'ai rajouté Ucase pour pouvoir comparer en majuscules et donc ne pas oublier d'éventuelles saisies mal faites....



Sub Soldes()
Dim Tab1(0 To 11) As String, Tab2(0 To 11) As String
Dim K As Byte, L As Integer, I As Byte, T As Byte
Dim Ws1 As Worksheet, Ws2 As Worksheet

Set Ws1 = Sheets("Saisie 0203") 'Affectation de la feuille Feuille de saisie à la variable Ws1
Set Ws2 = Sheets("Fichier SAP") 'id pour fichier SAP
Set cell = Ws1.Range("C6")
L = Ws2.Range("N32768").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
End If
K = 0
T = 0
For I = 2 To 13
If UCase(Ws1.Cells(28, I)) = "OK" Then 'on remplit le tableau 2002
Tab1(K) = Ws1.Cells(24, I)
K = K + 1
End If
If UCase(Ws1.Cells(20, I)) = "OK" Then 'on remplit le tableau 2003
Tab2(T) = Ws1.Cells(16, I)
T = T + 1
End If

Next I
For I = 1 To L
If cell = Ws2.Range("N" & I) Then
For J = 0 To UBound(Tab1)
If Tab1(J) = Ws2.Range("S" & I) Then
Ws2.Rows(I).Delete
Exit For
I = I - 1
End If
Next J
For J = 0 To UBound(Tab2)
If Tab2(J) = Ws2.Range("S" & I) Then
Ws2.Rows(I).Delete
Exit For
I = I - 1
End If
Next J
End If
Next I
Fin:
End Sub


A+++
 
C

Cédric

Guest
Bonjour à tous,

Merci beaucoup pour ta réponse, j'avais pourtant essayé d'enlever cette ligne mais cela ne fonctionnait pas, je sais pas si ca vient d'Excel 97. Je vais ressayé proprement.

Sinon aurais-tu une idée pour remettre des fonctions en place après les avoir changer manuellement ?

Je te tiens au courant de l'évolution et souhaite une agréable journée à l'ensemble du forum !
 
C

Cédric

Guest
Salut à tous !

Désolé de ne pas avoir répondu plus tôt au message, mais je n'ai pas eu accès au Web ce week-end.

Quand je parle de remettre les fonctions, je parle de la ligne validité. Ce que je suohaiterais, ç'est de pouvoir parfois inscrire Ok ou Pas OK de manière manuelle histoire de forcer le solde et à la suite, j'aimerais un bouton qui remette les fonctions en place pour de nouvelles saisies, j'ai regardé un peu mais j'ai pas trouvé gd chose.

Sinon j'ai changé les macros "Solde" qui fonctionnent j'ai juste du changer la variable I en integer car plus de 255 données. J'ai fait les changements pour la macro régularisation des écarts mais ça ne fonctionne pas. Peux tu jeter un coup d'oeil à mes modifs ?

Pour rappel, le bouton "Régularisation des écarts" doit déplacer les lignes du fichier SAP qui sont "Pas OK" dans la saisie pour les déplacer vers le fichier écarts.

Sinon j'avance pas trop mal, je sens que je me rapproche du but et Zon je te dois une fière chandelle.

Bonne soirée à tous !
 

Pièces jointes

  • Projet0297.zip
    28.8 KB · Affichages: 20
Z

zon

Guest
Re,



Cédric, Voici les modif que j'ai faites à ton fichier:


1. la macro Ecarts: Si j'ai bien compris, c'est les" pas Ok" qui doivent être déplacés dans la feuille Ecart, donc je remplis les 2 tableaux correpondant à ce critère et non pas Ok comme tu le faisais.

2. Pour les formules, j'ai rajouté le code, c'est pas trop compliqué: il suffit de traduire en anglais les le SI et le ET et de rajouter des guillemets:
ex:=SI(ET(B17=B18;B19<>0);"Ok";SI(B17=0;"";"Pas OK"))
à remplacer par
[B20].Formula = "=IF(AND(B17=B18,B19<>0),""Ok"",IF(B17=0,"""",""Pas OK""))"
puis avec la méthode autofill (équivalent de la poignée de recopie) on étend les formules jusqu'à B28.

3. Etant donné que que tes feuilles "Saisie 0203" et "Saisie 0304" sont identiques: Tu as besoin que d'une seule macro Ecart et Solde où je passe en paramètre le nom de feuille: cela permet de supprimer 2 modules...

Sub Ecarts(Ws1 As Worksheet)=> que je lance Call Ecarts(Sheets("Saisie 0203")).

4. Enfin le boutons que j'utilise, tu les as via Affichage/Barres d'outils/Boites à outils Contrôles, avec le bouton gauche tu cliques sur visualiser le code pour associer une macro, si tu veux modifier leurs propriétés tu cliques sur propriétés. (Ne pas oublier de cliquer sur le triangle ).

A+++
 

Pièces jointes

  • Projet0297beta1.zip
    38.8 KB · Affichages: 19

Statistiques des forums

Discussions
314 654
Messages
2 111 598
Membres
111 215
dernier inscrit
fateh