RechercheV / Virgule / Point / Dimensions
Bonjour chers membres du forum,
Je cherche à récupérer et transférer des données d'une plage avec lacune à une autre sans lacune (et donc plus grande). J'utilise donc la fonction recherchev (vlookup, au niveau de la troisième boucle dans le code ci-dessous), mais celle ci retourne, 9 fois sur 10, une valeur sans la virgule (passant par exemple de 2,55 à 255). En déclarant la variable qui lui est rattaché (débit) comme Double, le problème ne se pose plus mais la fonction plante dès qu'elle rencontre une NA. C'est pourquoi la dimension est Variant.
Savez vous comment je peux modifier mon code pour contourner ce problème ?
'test de la fonction recherchev dans un meme classeur
Sub Transfo_PR_2()
Range("A:C").ClearContents
Dim ligne As Long
Dim datedebut As Date, datefin As Date, newdate As Date
Dim debit As Variant
Dim wsdata As Worksheet, result As Worksheet
'Neutraliser le rafraîchissement de l'écran et les messages d'erreur
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set result = Sheets("result")
Set wsdata = Sheets("Vol pompé 01h")
'INSTRUCTIONS
'Enregistre la première et dernière date pour associer les valeurs de débits
datedebut = wsdata.Cells(1, 1).Value
datefin = wsdata.Cells(Rows.Count, 1).End(xlUp).Value
newdate = datedebut
ligne = 1
'boucle qui recréé le pas de temps horraire sans les lacunes
While newdate <= datefin
ligne = ligne + 1
result.Cells(ligne, 1) = newdate
newdate = newdate + 1 / 24 'pas de temps horraire
Wend
'boucle qui corrige l'incrémentation du jour à minuit
newdate = datedebut
ligne = 1
While newdate <= datefin
ligne = ligne + 1
If TimeValue(newdate) = "00:00:00" Then
result.Cells(ligne, 1) = DateAdd("d", 1, newdate)
End If
newdate = newdate + 1 / 24
Wend
'boucle qui associe les débits aux dates
newdate = datedebut
ligne = 1
While newdate <= datefin
ligne = ligne + 1
debit = Application.VLookup(result.Cells(ligne, 1), wsdata.Range("A:F"), 6, False)
result.Cells(ligne, 2) = IIf(IsError(debit), 0, debit)
newdate = newdate + 1 / 24 'pas de temps horraire
Wend
'Remplace les virgule par des points
result.Range("B:C").Replace What:=",", Replacement:="."
'Glisse les entêtes
result.Range("A1") = "Date et Heure"
result.Range("B1") = "Débit [m3/h]"
result.Range("C1") = "Pluie [mm]"
' Réactiver le rafraîchissement de l'écran
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Bonjour,
Il est possible de contourner le problème de différentes façons:
- tester si vlookup renvoie une erreur avec isError et un If avant de l'affecter à la variable, on doit aussi pouvoir utiliser isNumeric mais ça rentrerait en conflit avec le souci du séparateur décimal
- utiliser on error pour gérer l'erreur, soit en allant à un endroit précis, soit en passant à la ligne suivante (goto ou resume next)
je préconise la première solution avec isError car elle est la plus adaptée ici.
Bonjour Ausecour,
Merci pour l'idée, j'ai codé ça et ça a fonctionné !
Bonne journée
Dim debitd as Double
While newdate <= datefin
ligne = ligne + 1
If IsError(Application.VLookup(result.Cells(ligne, 1), wsdata.Range("A:F"), 6, False)) Then
result.Cells(ligne, 2) = 0
Else
debitd = Application.VLookup(result.Cells(ligne, 1), wsdata.Range("A:F"), 6, False)
result.Cells(ligne, 2) = debitd
End If
newdate = newdate + 1 / 24 'pas de temps horraire
Wend