/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
VBA: Rekursiv funktion
Fra : Jesper Stocholm


Dato : 18-12-02 23:01

Jeg har lavet en macro i VBA, der i en af funktionerne checker validitet
af noget input-data. Hvis data ikke er valide, så kan macroen selv
forsøge at rette i data. Hvis macroen har forsøgt at rette i data, så
skal data igen checkes for validitet (da rettelserne ikke altid er nok),
og der er her, at jeg er i tvivl om metoden. Er der specifik måde at få
en funktion til at kalde sig igen ... eller skal jeg blot eksplicit gøre
det ?

Min kode er fx.

01 Private Function validateDimension(ByVal intCLNumRows As Integer, ByVal intCLNumCols As Integer, myTable As FPHTMLTable, ByVal strCLData As String) As Boolean
02 '/Purpose: Validate dimension of data in HTML-table and clipboard
03 '/Created: 2002/10/06 19:21
04
05 '/Parameters: Number of rows in clipboard
06 '/ Number of columns in clipboard
07 '/ Table-object containing the table to manipulate
08 '/ Data from clipboard
09 '/
10 '/Returns: boolean indicating valid format or not
11 On Error GoTo Err
12
13 Dim myRow As FPHTMLTableRow
14 Dim ar1, ar2
15 Dim intResponse As Integer
16 Dim intI As Integer
17 Dim intInactiveRows As Integer
18 Dim intActiveRows As Integer
19 Dim intIncrStop As Integer
20 Dim strMsg As String
21 Dim strDimHTML As String
22 Dim intRowNumber As Integer
23
24 intInactiveRows = getInitialRowSpan(myTable)
25 intActiveRows = myTable.rows.Length - intInactiveRows
26
27 ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
28 ' number of rows in HTML is smaller than rows in clipboard
29
30 If intActiveRows < intCLNumRows Then
31 validateDimension = False
32 intRowNumber = intCLNumRows - myTable.rows.Length + intInactiveRows
33 strMsg = "The number of rows in the destination table is smaller than" & vbCrLf & _
34 "than the number of rows of the data in the clipboard." & vbCrLf & _
35 vbCrLf & _
36 "Would you like the extra rows to be automatically added ?"
37
38 intResponse = MsgBox(strMsg, vbExclamation Or vbYesNo, "Warning: Too few rows in destination table")
39 Select Case intResponse
40 Case 6
41 Call addRows(myTable, intRowNumber, intInactiveRows) 'addRows tilføjer rækker til en HTML-tabel i Frontpage.
42 validateDimension = True
43 End Select
44 Exit Function
45 End If

Det er i linie 42 jeg er i tvivl. Her skal linien skiftes ud med et
rekursivt kald af funktionen igen, men er den eneste måde jeg kan gøre
dette på at lave linierne til

39 Select Case intResponse
40 Case 6
41 Call addRows(myTable, intRowNumber, intInactiveRows)
42 call validateDimension(intCLNumRows, intCLNumCols, myTable, strCLData)
43 End Select

?

Kan dette have nogle uforudsete konsekvenser som jeg ikke lige pt kan se ?

pft

--
Jesper Stocholm - http://stocholm.dk

Svar til gruppen og ikke til mig privat !
Skriv under det du svarer på - www.usenet.dk/netikette/citatteknik.html

 
 
Jesper Stocholm (18-12-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 18-12-02 23:14

Jesper Stocholm wrote :

> Det er i linie 42 jeg er i tvivl. Her skal linien skiftes ud med et
> rekursivt kald af funktionen igen, men er den eneste måde jeg kan gøre
> dette på at lave linierne til
>
> 39 Select Case intResponse
> 40 Case 6
> 41 Call addRows(myTable,intRowNumber,intInactiveRows)
> 42 call validateDimension(intCLNumRows, intCLNumCols, myTable, strCLData)
> 43 End Select

> Kan dette have nogle uforudsete konsekvenser som jeg ikke lige pt kan
> se ?

Jeg kan allerede nu fortælle, at det ikke virker. Det er som om, at
den ikke forstår, at funktionen skal kalde sig selv igen - i hvert
fald returnerer den lystigt enten false eller true - alt efter
brugerens valg.



--
Jesper Stocholm - http://stocholm.dk

Svar til gruppen og ikke til mig privat !
Skriv under det du svarer på - www.usenet.dk/netikette/citatteknik.html

Rayman (24-12-2002)
Kommentar
Fra : Rayman


Dato : 24-12-02 12:27


> > 39 Select Case intResponse
> > 40 Case 6
> > 41 Call addRows(myTable,intRowNumber,intInactiveRows)
> > 42 call validateDimension(intCLNumRows, intCLNumCols, myTable,
strCLData)
> > 43 End Select

> Jeg kan allerede nu fortælle, at det ikke virker. Det er som om, at
> den ikke forstår, at funktionen skal kalde sig selv igen - i hvert
> fald returnerer den lystigt enten false eller true - alt efter
> brugerens valg.

Det som du skal forstå er at der startes en ny 'instance' af
validateDimension, derfor skal linie 2 være:
> > 42 validateDimension = validateDimension(intCLNumRows,
intCLNumCols, myTable, strCLData)

Det ser lidt spøjst ud, men den sætter funktionens retur værdi til det som
den nye 'instance' giver.

Det her KAN give en uendelig løkke, hvis validateDimensions altid fejler, og
brugeren bliver ved med at svare ja.

Du mangler også at angive en returværdi, for den modsatte situationen af:
30 If intActiveRows < intCLNumRows Then


Den kan du angive ovenover og skal nok være:
validateDimensions = true
30 If intActiveRows < intCLNumRows Then


Mvh. Rayman



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste