15. marts 2009 - 10:55Der er
6 kommentarer og 1 løsning
Excel VBA - Fintuning af UDF
Jeg vil gerne fintune min UDF så den opfører sig som en original Excel-funktion i forhold til tool-tips og fejlhåndtering. Når jeg fx taster '=MOD(' i en celle kommer der automatisk et tool-tip med 'MOD(number;divisor)' altså info om hvilke parametre funktionen tager - hvordan laver jeg det samme på min egen funktion? Ligeledes hvis funktionen indsættes med funktionsguiden, er der udover en beskrivelse af hele funktionen (som jeg godt ved hvordan jeg tilføjer min UDF) også en beskrivelse til hver parameter i funktionen - hvordan gøres det? Sluttelig; hvis jeg indtaster et ugyldigt parameter i MOD-funktionen fremkommer der en fejlmeddelelse og fokus bliver sendt tilbage til den fejlagtige indtastning - hvordan? Som i kan se har jeg implementeret en delvis fejlhåndtering, nemlig en meddelelse om at indtastningen er forkert, men det hindrer ikke at funktionen pt. returnerer '0' uanset at parameteren er forkert eller uden for det tilladte område, i stedet for fx 'N/A' eller 'Error' i den celle funktionen er indtastet i.
Her er min UDF (som bare er konstrueret for eksemplets skyld):
Public Function LD(Temp As Double, D As Double) As Double Dim Dk As Integer Dim Tfejl As String
Tfejl = "Kun temperaturer i intervallet 10 - 600 gr. C er gyldige. Indtast igen." Dk = 0
Select Case Temp Case Is < 10 MsgBox Tfejl Case 10 To 170 If Temp >= 10 And Temp <= 50 Then Dk = -1 End If LD = (Temp * D) + Dk Case 170 To 600 LD = (Temp * D * 1.1) + Dk Case Is > 600 MsgBox Tfejl End Select
Jeg mener ikke at vi almindelige dødelige kan lave en beskrivelse af funktionen, som de indbyggede gør, og heller ikke hjælp dertil. Der kræves vist nok speciel software for at lave hjælpfiler.
Jeg bruger normalt det at give,parametrene sigende navne, se eksemplet her, men der er også en begrænsning, på hvor meget man kan se.
Public Function LD(Temp_10°_til_600° As Double, D As Double) As Double Dim Dk As Integer, Temp As Double Dim Tfejl As String
Tfejl = "Kun temperaturer i intervallet 10 - 600°. C er gyldige. Indtast igen." 'gradtegnet fås ved at holde ALT nede mens du taster 248 på det nummeriske tastatur og så slipper ALT tasten igen Dk = 0 Temp = Temp_10°_til_600° Select Case Temp Case 10 To 170 If Temp >= 10 And Temp <= 50 Then Dk = -1 End If LD = (Temp * D) + Dk Case 170 To 600 LD = (Temp * D * 1.1) + Dk Case Else ' brug denne til at fange værdier, uden for kriterierne MsgBox Tfejl End Select
Hej Kabbak Tak for din kommentar. Det at give parametrene sigende navne hjælper ikke rigtigt hvis brugeren taster funktionen ind direkte i cellen, fx '=LD(700, 50)', for i det tilfælde er der ingen tool-tip, el. hvad vi nu skal kalde det, som giver info om parametrene.
Hvad problemet med at funktionen returnerer '0' uanset at der er tastet forkert ind - har du en løsning på det?
Jeg tænkte selv noget i retning af:
.... Case else MsgBox Tfejl LD = CVErr(xlErrNA)
.....
Men den går jo ikke da LD kun kan være Double, så jeg får et type-mismatch - nogen forslag?
Public Function LD(Temp_10°_til_600° As Double, D As Double) Dim Dk As Integer, Temp As Double Dim Tfejl As String
Tfejl = "Kun temperaturer i intervallet 10 - 600°. C er gyldige. Indtast igen." 'gradtegnet fås ved at holde ALT nede mens du taster 248 på det nummeriske tastatur og så slipper ALT tasten igen Dk = 0 Temp = Temp_10°_til_600° Select Case Temp Case 10 To 170 If Temp >= 10 And Temp <= 50 Then Dk = -1 End If LD = CDbl((Temp * D) + Dk) Case 170 To 600 LD = CDbl((Temp * D * 1.1) + Dk) Case Else ' brug denne til at fange værdier, uden for kriterierne MsgBox Tfejl LD = CVErr(xlErrNA) End Select
End Function
... men det løser ikke de øvrige problemer og helst ville jeg jo have fokus sendt tilbage til den forkerte indtastning.
Du kan ikke fange hvilken celle, der er tastet ind i , i en funktion.
men prøv, denne i Arkets modul Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then ' cellen hvor temperaturen tastes ind If IsError(Range("C1")) Then ' cellen hvor funktionen er MsgBox "Kun temperaturer i intervallet 10 - 600°. C er gyldige. Indtast igen." Target.Activate End If End If End Sub
og så din funktion
Public Function LD(Temp_10°_til_600° As Double, D As Double) Dim Dk As Integer, Temp As Double Dim Tfejl As String Dk = 0 Temp = Temp_10°_til_600° Select Case Temp Case 10 To 170 If Temp >= 10 And Temp <= 50 Then Dk = -1 End If LD = CDbl((Temp * D) + Dk) Case 170 To 600 LD = CDbl((Temp * D * 1.1) + Dk) Case Else ' brug denne til at fange værdier, uden for kriterierne
Hej Kabbak Jeg tror desværre ikke jeg kommer helt i mål med mine spørgsmål, men du skal have tak for din indsats og hvis du lægger et svar kan vi dele pointene.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.