Avatar billede stry Nybegynder
15. marts 2009 - 10:55 Der 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
       
End Function


På forhånd tak.
Avatar billede kabbak Professor
15. marts 2009 - 11:57 #1
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
     
End Function
Avatar billede stry Nybegynder
15. marts 2009 - 13:43 #2
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?
Avatar billede stry Nybegynder
15. marts 2009 - 13:44 #3
Hvad problemet med at .... = Hvad med problemet at ....
Avatar billede kabbak Professor
15. marts 2009 - 13:52 #4
"LD kun kan være Double"
lav den om til en Variant
Avatar billede stry Nybegynder
15. marts 2009 - 14:25 #5
Ja, det er klart:

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.
Avatar billede kabbak Professor
15. marts 2009 - 16:14 #6
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
   
    LD = CVErr(xlErrNA)
End Select
 
End Function
Avatar billede stry Nybegynder
04. april 2009 - 14:13 #7
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel-kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis