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 23/01/2012, 10h29   #1
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Par défaut Récupérer le numéro d'une ligne

Chers tous,

Je cherche à récupérer le numéro de la ligne qui est le plus proche de ma valeur (ici la valeur est fixée à 3000).

Voic le code que j'ai écris et qui ne fonctionne pas, pourquoi, quelle(s) solution(s) ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
Sub valeur ()
    Dim ws1 As Worksheet
    Dim Count As Long
    Dim Lig1 As Long
    Dim PremL As Long
    Dim A As Long, B As Long, C As Long
    Set ws1 = ThisWorkbook.Worksheets("Feuille de données du graphique")
 
    PremL = ws1.[A1]
    Lig1 = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row 'Recherche la dernière ligne contenant une donnée
 
    For Count = PremL To Lig1
        A = 3000 - ws1.Cells(Count, 1)
        B = 3000 - ws1.Cells(Count + 1, 1)
        If Abs(A) < Abs(B) Then
        C = A.Row
        End If
    Next
        MsgBox C
 
end sub
Merci pour votre aide
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 12h08   #2
Membre chevronné
 
Inscription : octobre 2006
Messages : 541
Détails du profil
Informations personnelles :
Localisation : France, Ardèche (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 541
Points : 760
Points : 760
Bonjour

sans t'occuper de la dernière ligne (puisque tu cherche la dernière dans la colonne A, il n'y a rien en dessous et donc, on peut prendre un nombre de ligne supérieur)
en utilisant une formule matricielle dans VBA
essaies
Code :
1
2
3
Sub valeur_proche()
MsgBox [Match(MIN(ABS(3000-(A1:A1000))),ABS(3000-A1:A1000),0)]
End Sub
Si ta valeur est dans une cellule B1 par exemple remplace 3000 par B1
Code :
1
2
3
Sub valeur_proche()
MsgBox [Match(MIN(ABS(B1-(A1:A1000))),ABS(B1-A1:A1000),0)]
End Sub
__________________
Michel_M
Michel_M est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 13h07   #3
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Bonjour,

La solution proposée ne fonctionne pas.

Pour info la valeur retournée doit correspondre au numéro de la ligne où est situé la valeur la plus proches de celle désirée (les 3000 dans mon cas).

La msgBox n'est là qu'à titre indicatif. La valeur retournée dans C doit me permettre de réaliser d'autres calculs.
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h47   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
Bonjour,

En passant par une formule intermédiaire calculée dans une cellule que l'on pourra masquer ou vider après son utilisation

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Dim dblResultat As Double
Dim Rg As Range
 
'On stock en D1 la valeur la valeur max mais inférieur à 3000
Range("D1").FormulaLocal = "=SI(NB.SI(A1:A1000;""<=3000"")>0;PETITE.VALEUR(A1:A1000;NB.SI(A1:A1000;""<=3000""));0)"
 
Set Rg = Range("A:A").Find(what:=Range("D1").Value, lookat:=xlWhole)
If Not Rg Is Nothing Then
    MsgBox Rg.Row
End If
 
Range("D1").Value =""
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h00   #5
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Je vais être pénible mais je souhaiterais ne pas à avoir à stocker la valeur dans une cellule intermédiaire, si c'est possible.

¨Pourquoi le code suivant ne fonctionne pas ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub valeur ()
    Dim ws1 As Worksheet
    Dim Count As Long
    Dim Lig1 As Long
    Dim PremL As Long
    Dim A As Long, B As Long, C As Long
    Set ws1 = ThisWorkbook.Worksheets("Feuille de données du graphique")
 
    PremL = ws1.[A1]
    Lig1 = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row 'Recherche la dernière ligne contenant une donnée
 
    For Count = PremL To Lig1
        A = 3000 - ws1.Cells(Count, 1)
        B = 3000 - ws1.Cells(Count + 1, 1)
        If Abs(A) < Abs(B) Then
        C = ws1.Cells(Count,1).Row
        End If
    Next
        MsgBox C
 
end sub
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h07   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
Citation:
¨Pourquoi le code suivant ne fonctionne pas ?
Pour te répondre il faudrait savoir ce qui va pas. Message d'erreur, résultat erroné ...
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h14   #7
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Désolé,

Tout d'abord il me dit incompatibilité de type pour PremL=ws1.[A1]

Ensuite, Erreur définie par l'application ou l'objet => A = 3000 - ws1.Cells(Count, 1)
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h19   #8
Membre chevronné
 
Inscription : octobre 2006
Messages : 541
Détails du profil
Informations personnelles :
Localisation : France, Ardèche (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 541
Points : 760
Points : 760
A tout hasard, ma proposition avait été testée et fonctionnait
pour le msg, je me suis basé sur ce que tu exprimais dans ta demande
Désolé de t'avoir dérangé.
Fichiers attachés
Type de fichier : xls valeurproche.xls (67,5 Ko, 6 affichages)
__________________
Michel_M
Michel_M est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 17h04   #9
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Bonjour Michel,

Je suppose que mes propos ont été mal interprétés et je m'en excuse.

Citation:
Désolé de t'avoir dérangé.


J'apprécie énormément l'aide que tu m'apportes

Cependant la ligne de code suivante :

Code :
MsgBox [Match(MIN(ABS(B1-(A1:A1000))),ABS(B1-A1:A1000),0)]
(qui fonctionne parfaitement bien dans ton classeur) ne fonctionne pas dans le mien !

L'erreur renvoyée est la suivante : "Incompatibilité de type" avec ta formule surlignée en jaune !

Je ne comprends pas pourquoi.

Par ailleurs est ce que plutot que MsgBox je peux faire :

Code :
Valeur = Match(MIN(ABS(B1-(A1:A1000))),ABS(B1-A1:A1000),0)
Et ensuite utiliser Valeur pour différents calculs !

Encore une fois désolé si mes propos ont été mal perçus.

Merci beaucoup pour l'aide apporté !

Un grand merci à toi Michel. Ta fiormule fonctionne parfaitement bien

En fait il fallait que je commence à A2 et non A1 car A1 est composé d'un titre et non d'une valeur. Quel étourdis suis-je !!!!

Encore merci pour toute l'aide apportée

Il m'est impossible d'utiliser la valeur retournée par la formule, Pourquoi, comment faire ?

Code :
1
2
3
4
5
6
7
8
9
10
11
'soustraire la ligne 1090 de la feuille 2 à toutes les autres lignes pour renseigner la feuille 3
        ws1.Range("A:A").Copy ws3.Range("A:A") 'Recopie de la colonne A de la feuille ws1 dans la feuille ws3
 
        With ws2
            Val1 = [Match(MIN(ABS(1900-(A2:A65536))),ABS(1900-(A2:A65536)),0)] 'Trouve la ligne la plus proche de 1900
        End With
        For Col = PremC1 To DerC1 - 2 'boucle sur les colonnes
            For Lig = PremL1 To DerL1 'boucle sur les lignes
                ws3.Cells(Lig, Col + 1) = ws2.Cells(Lig, Col + 1) - ws2.Cells(Val1, Col + 1) 'formule soustraction de la ligne la plus proche de 1900 à toutes les autres
            Next Lig      
        Next Col
Erreur : Incompatibilité de type pour la ligne :

Code :
ws3.Cells(Lig, Col + 1) = ws2.Cells(Lig, Col + 1) - ws2.Cells(Val1, Col + 1)
Val1 est déclaré en Long
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h19   #10
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
dans un premier, pour éviter les erreurs d’interprétation par VBA

Correspond à l'objet Range
Code :
ws3.Cells(Lig, Col + 1)
Correspond à la valeur de l'objet Range
Code :
ws3.Cells(Lig, Col + 1).Value
Donc
Code :
ws3.Cells(Lig, Col + 1).Value = ws2.Cells(Lig, Col + 1).Value - ws2.Cells(Val1, Col + 1).Value
Quand tu as ce genre d'erreur, mets un point d'arret sur cette ligne et regarde la valeur des variables a ce moment
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 17h25   #11
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
La solution que tu me proposes ne fonctionne pas.J'ai essayé de mettre un point d'arrêt mais je n'arrive pas à cerner ce que ça m'apporte (je ne sais pas m'en servir !)

Merci pour ton aide en tout cas
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h35   #12
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
As tu la valeur de Val1 quand ca plante ?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h39   #13
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
non, je vais rajouter un msgBox et je te dis ça

En fait ça donne 1 !!! (ce n'est pas la valeur attendue !)
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h50   #14
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Dans ta formule
Code :
Val1 = [Match(MIN(ABS(1900-(A2:A65536))),ABS(1900-(A2:A65536)),0)]
Val1 correspond à la position dans la plage A2:A65536.
Pour définir la ligne correspondante, tu dois appliquer un décalage de +1 puisque tu commences en A2.
Ligne = Val1 + 1

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 08h43   #15
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
Bonjour la solution apportée me permet d'éradiquer le message d'erreur. Cependant :

Code :
Val1 = [Match(MIN(ABS(1900-(A2:A65536))),ABS(1900-(A2:A65536)),0)] 'Trouve la ligne la plus proche de 1900
ne me renvoie pas la bonne ligne : il me renvoie la valeur 1 (ligne 1) alors que la ligne la plus proche de 1900 est la ligne : 1089.

Je suis perdu : tantôt la formule cité précédemment fonctionne (voir le fichier Joint par Michel), Tantôt elle renvoie une valeur "bidon" (dans mon cas !) J'ai esssayé sur un fichier test et le code fonctionne mais là sur ma macro définitive (ça bug)

J'ai beau essayé cette formule, dans un classeur elle me renvoie la bonne valeur, dans l'autre ça me renvoie 1 je n'arrive pas cerner pourquoi !

Je joins mes deux fichiers ainsi que le répertoire nécessaire au chargement des données pour la macro "qui foire"

Merci pour votre aide
Fichiers attachés
Type de fichier : zip Macros.zip (1,26 Mo, 4 affichages)
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h54   #16
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Code :
ws3.Cells(Lig, Col + 1).Value = ws2.Cells(Lig, Col + 1).Value - ws2.Cells(ValA + 1, Col + 1).Value
c'est quoi ws2 ?

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h00   #17
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
oui, effectivement dans le code que j'ai fourni je n'ai mi qu'un extrait. En fait ws2 est une worksheet définie dans mon vrai code.

Code :
1
2
3
Dim ws2 as Worksheet
 
set ws2=Sheet("Soustraction")
__________________
Bonne journée,

Cordialement,

Vincent
Vincent32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h22   #18
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Citation:
J'ai beau essayé cette formule, dans un classeur elle me renvoie la bonne valeur, dans l'autre ça me renvoie 1 je n'arrive pas cerner pourquoi !
A priori, tu n’es pas positionné sur la bonne feuille.
Fait un essai avec
Code :
1
2
ws1.Select
Val1 = [Match(MIN(ABS(3000-(A2:A65536))),ABS(3000-(A2:A65536)),0)] 'Trouve la ligne la plus proche de 1900
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 11h34   #19
Membre régulier
 
Homme Vincent Vincent
Inscription : octobre 2010
Messages : 246
Détails du profil
Informations personnelles :
Nom : Homme Vincent Vincent
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2010
Messages : 246
Points : 83
Points : 83
ça fonctionne ! Houra !!!


jfontaine
Michel_M
gFZT82


Merci énormément à vous 3
__________________
Bonne journée,

Cordialement,

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 16h45.


 
 
 
 
Partenaires

Hébergement Web