Prend nombre ENTIER et non la DÉCIMALE

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

MisterT

XLDnaute Occasionnel
Bonjour à chacun !

Ici j'ai une Sub ingénieuse qui m'a été fournie par Hub et qui fonctionne à merveille pour les nombres entiers comme 2,0 pour J7 et J8, par contre lorsque J7 et/ou J8 est une valeure décimale comme 2,5, il y a l'erreur "Incompatibilité de type" sur la ligne en Rouge Bold lorsque c'est la valeur de J7 qui a un 0,5 et sur la ligne indiquée en Bleu Bold lorsque c'est la valeur de J8 qui a un 0,5.

Est-ce que quelqu'un aurait la solution ?

Sub cherche()
Dim Prem As String, Deuz As String, Troiz As String
Dim Sh As String
Dim Lig1 As Long, Lig2 As Long, Lig3 As Long, Lig4 As Long
Dim Plg1 As Range, Plg2 As Range, Plg3 As Range
'calcul du nom de la feuille
Prem = [J5] & "x"
Deuz = [K5] & "_"
Troiz = IIf([J7] = [J8], "SAME", IIf([J7] < [J8], "HYBRIDE", "INV HYBRIDE"))
Sh = Prem & Deuz & Troiz
With Sheets(Sh)
Lig1 = Application.Match([G5], .Columns(1), 1)
Set Plg1 = .Cells(Lig1, 3).Resize(.Cells(Lig1, 1).MergeArea.Rows.Count, 1)
Lig2 = Application.Match([J7], Plg1, 1) - 1
Lig2 = Lig1 + Lig2
Set Plg2 = .Cells(Lig2, 5).Resize(.Cells(Lig2, 3).MergeArea.Rows.Count, 1)
Lig3 = Application.Match([J8], Plg2, 1) - 1
Lig3 = Lig2 + Lig3
Set Plg3 = .Cells(Lig3, 7).Resize(.Cells(Lig3, 5).MergeArea.Rows.Count, 1)
Lig4 = Application.Match([N4], Plg3, 1) - 1
Lig4 = Lig3 + Lig4
Range("B14:S14").Value = .Range(.Cells(Lig4, 10), .Cells(Lig4, 27)).Value
Range("B23:U23").Value = .Range(.Cells(Lig4 + 1, 10), .Cells(Lig4 + 1, 29)).Value
Range("R4").Value = .Range(.Cells(Lig4, 30), .Cells(Lig4, 30)).Value
End With
End Sub

Merci beaucoup,
MisterT
 
Re : Prend nombre ENTIER et non la DÉCIMALE

Bonjour Jean-Marcel !

J'ai fait le changement comme suggéré et le problème demeure en indiquant "Incompatibilité de type".

Sub cherche()
Dim Prem As String, Deuz As String, Troiz As String
Dim Sh As String
Dim Lig1 As Long, Lig4 As Long
Dim Lig2 As Double, Lig3 As Double
Dim Plg1 As Range, Plg2 As Range, Plg3 As Range
'calcul du nom de la feuille
Prem = [J5] & "x"
Deuz = [K5] & "_"
Troiz = IIf([J7] = [J8], "SAME", IIf([J7] < [J8], "HYBRIDE", "INV HYBRIDE"))
Sh = Prem & Deuz & Troiz
With Sheets(Sh)
Lig1 = Application.Match([G5], .Columns(1), 1)
Set Plg1 = .Cells(Lig1, 3).Resize(.Cells(Lig1, 1).MergeArea.Rows.Count, 1)
Lig2 = Application.Match([J7], Plg1, 1) - 1
Lig2 = Lig1 + Lig2
Set Plg2 = .Cells(Lig2, 5).Resize(.Cells(Lig2, 3).MergeArea.Rows.Count, 1)
Lig3 = Application.Match([J8], Plg2, 1) - 1
Lig3 = Lig2 + Lig3
Set Plg3 = .Cells(Lig3, 7).Resize(.Cells(Lig3, 5).MergeArea.Rows.Count, 1)
Lig4 = Application.Match([N4], Plg3, 1) - 1
Lig4 = Lig3 + Lig4
Range("B14:S14").Value = .Range(.Cells(Lig4, 10), .Cells(Lig4, 27)).Value
Range("B23:U23").Value = .Range(.Cells(Lig4 + 1, 10), .Cells(Lig4 + 1, 29)).Value
Range("R4").Value = .Range(.Cells(Lig4, 30), .Cells(Lig4, 30)).Value
End With
End Sub

Quoi faire quoi faire ???

Merci,
MisterT
 
Re : Prend nombre ENTIER et non la DÉCIMALE

Bonsoir,

Tes variables Lig1 à Lig3 sont alimentée pas l'équivalent VBA de la fonction de feuille de calcul EQUIV, pouvant retourner une valeur d'erreur elle doivent donc être du type VARIANT.
Dim Lig1 as Variant
Dim Lig2 as Variant
Dim Lig3 as Variant

Dans Lig1 = Application.Match([G5], .Columns(1), 1)
si [G5] est vide ou contient une valeur d'erreur Lig1 contiendra une valeur d'erreur.

Code:
If not Iserror(Lig1) then
Set Plg1 = .Cells(Lig1, 3).Resize(.Cells(Lig1, 1).MergeArea.Rows.Count, 1)
End if
Etc.



A+
 
Dernière modification par un modérateur:
Re : Prend nombre ENTIER et non la DÉCIMALE

Bonsoir Hasco !

Merci pour la réponse, ça fonctionne en mettant le type VARIANT à Lig1, Lig2 et Lig3. Cela a fonctionné aussi pour As Double pour Lig2 et 3.
---------------
Pour l'autre partie avec le code je ne comprends pas ce que je dois faire avec, où le placer car il est vrai qu'il peut arriver que la valeur de G5 soit hors norme car les valeurs acceptées sont de 85 à 120, alors comment et ou insérer un MessageBox disant que "la valeur est hors normes et doit être comprise entre 85 et 100" ?

La même chose peut se produire pour les valeurs de J7 et J8 qui vont de pair, par exemple si J7 est 1,5 et J8 est 5,0 ce n'est pas un matching possible et sera hors normes, par contre si J8 était à 8,0 ce serait OK. Alors là aussi comment et ou insérer un MessageBox disant que "les valeurs sont hors normes ne formant pas une union compatible" ?

J'espère que c'est compréhensible ce que j'ai écrit...

Je fourni le code de nouveau...
Code:
Sub cherche()
Dim Prem As String, Deuz As String, Troiz As String
Dim Sh As String
Dim Lig4 As Long
Dim Lig1 As Variant, Lig2 As Variant, Lig3 As Variant
Dim Plg1 As Range, Plg2 As Range, Plg3 As Range
'calcul du nom de la feuille
Prem = [J5] & "x"
Deuz = [K5] & "_"
Troiz = IIf([J7] = [J8], "SAME", IIf([J7] < [J8], "HYBRIDE", "INV HYBRIDE"))
Sh = Prem & Deuz & Troiz
With Sheets(Sh)
    Lig1 = Application.Match([G5], .Columns(1), 1)
    Set Plg1 = .Cells(Lig1, 3).Resize(.Cells(Lig1, 1).MergeArea.Rows.Count, 1)
    Lig2 = Application.Match([J7], Plg1, 1) - 1
    Lig2 = Lig1 + Lig2
    Set Plg2 = .Cells(Lig2, 5).Resize(.Cells(Lig2, 3).MergeArea.Rows.Count, 1)
    Lig3 = Application.Match([J8], Plg2, 1) - 1
    Lig3 = Lig2 + Lig3
    Set Plg3 = .Cells(Lig3, 7).Resize(.Cells(Lig3, 5).MergeArea.Rows.Count, 1)
    Lig4 = Application.Match([N4], Plg3, 1) - 1
    Lig4 = Lig3 + Lig4
    Range("B14:S14").Value = .Range(.Cells(Lig4, 10), .Cells(Lig4, 27)).Value
    Range("B23:U23").Value = .Range(.Cells(Lig4 + 1, 10), .Cells(Lig4 + 1, 29)).Value
    Range("R4").Value = .Range(.Cells(Lig4, 30), .Cells(Lig4, 30)).Value
End With
End Sub

Merci beaucoup encore Hasco,
MisterT
 
Re : Prend nombre ENTIER et non la DÉCIMALE

Re,

Cela a fonctionné aussi pour As Double pour Lig2 et 3.

Parce que tu as eu de la chance et que Application.Match a retourné autre chose qu'une valeur d'erreur. Aussi, garde les en Variant.

Pour le reste, il faut faire tes tests à l'entrée de la macro(après les déclaration de variables par exemple).

Exemple pour G5

Code:
If [G5]< 85 or [G5] > 120 then
Msgbox "la valeur est hors normes et doit être comprise entre 85 et 100",vbExclamation+vbOkOnly,"Erreur de valeur"
Exit sub
End if

J'ai tapé ce code sans vérification, alors à toi de jouer.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
612
Retour