valore restituito in una funzione di un modulo

Anonimo
2016-01-14T16:17:52+00:00

Ciao a tutti!

Eccomi qui per chiedere nuovamente il vostro aiuto.

Sto testando le funzioni, ma non riesco a fare una cosa. Faccio esempi “stupidi” ma cosi riesco a capire meglio la teoria.

Ho una maschera con due textBox: la prima si chiama txtTesto e la seconda txtOggetto

In una sub ho questo codice dove viene richiamata una funzione:

Private Sub Comando10_Click()

If IsNull(Me.txtOggetto) Or Me.txtOggetto = "" Then

MsgBox "inserire il campo oggetto"

Exit Sub

ElseIf IsNull(Me.txtTesto) Or Me.txtTesto = "" Then

MsgBox "inserire campo testo"

Exit Sub

End If

Dim testo As String

Dim oggetto As String

Dim risultato As String

testo = Me.txtTesto

oggetto = Me.txtOggetto

Call MessaggioFun(testo, oggetto)

MsgBox MessaggioFun

End Sub

Questa sub è “legata” la bottone della maschera.

Su un modulo a parte, ho creato questa funzione:

Public Function MessaggioFun(testo As String, oggetto As String) As Boolean

    MsgBox testo

    MsgBox oggetto

    MessaggioFun = True

End Function

Quello che non riesco a fare è farmi dare il risultato TRUE nella sub della maschera. Mi piacerebbe usarlo come controllo ma non riesco! Il sistema mi da: Errore di compilazione: Argomento non facoltativo sul msgbox MessaggioFun della sub

Dove sbaglio?

Spero di essere stato chiaro!

Grazie

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2016-01-14T16:36:56+00:00

ciao Zamlix,

potresti evitare l'uso di variabili e passare alla funzione il contenuto degli oggetti :

Private Sub Comando10_Click()

If Len(Me.txtOggetto & vbNullString) = 0 Then

    MsgBox "inserire il campo oggetto"

    Exit Sub

End If

If Len(Me.txtTesto & vbNullString) = 0 Then

    MsgBox "inserire il campo testo"

    Exit Sub

End If

MsgBox MessaggioFun(Me.txtTesto, Me.txtOggetto)

end sub

Public Function MessaggioFun(ByVal testo As String, _

                             ByVal oggetto As String) As Boolean

    MsgBox testo

    MsgBox oggetto 

    MessaggioFun = True

End Function

per visualizzare vero o falso a seconda del risultato della funzione semplicemente questo :

MsgBox MessaggioFun(Me.txtTesto, Me.txtOggetto)

Ciao, Sandro.

ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-01-15T14:54:04+00:00

    Direi molto chiaro!

    Grazie per l'aiuto!

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-01-14T19:10:21+00:00

    ciao Zamlix,

    Grazie mille Sandro!

    prego :-)

    [...]

    Funziona! (ovviamente)

    bene!

    Ho una domanda però, (scusa l'ignoranza). Come mai entra nella funzione senza utilizzare il comando Call?

    il nostro Mauro ti ha risposto molto bene direi :-)

    [...]

    altra cosa nelle parentesi della funzione hai indicato byVal. Per cosa sta?

    [...]

    con VBA puoi passare i parametri byVal o byRef se non specifichi nulla, il predefinito è byRef.

    La differenza.

    ByRef passi il riferimento del parametro che se viene modificato dalla routine chiamata anche la chiamante vede la modifica.

    ByVal passi il valore del parametro che se viene modificato dalla routine chiamata la chiamante non vede la modifica, in pratica byVal non il valore originale resta inalterato.

    Difficile...? no dai...esempio.

    Option Compare Database

    Option Explicit

    Public Function mySum(ByRef primo As Integer, ByRef secondo As Integer) As Integer

    primo = primo + 1

    mySum = primo + secondo

    End Function

    Public Function mySum2(ByVal primo As Integer, ByVal secondo As Integer) As Integer

    primo = primo + 1

    mySum2 = primo + secondo

    End Function

    Public Function mySum3(primo As Integer, secondo As Integer) As Integer

    primo = primo + 1

    mySum3 = primo + secondo

    End Function

    Public Sub byVal_VS_byRef()

    Dim primo As Integer

    primo = 5

    MsgBox mySum(primo, 3)

    MsgBox primo

    End Sub

    Public Sub byVal_VS_byRef2()

    Dim primo As Integer

    primo = 5

    MsgBox mySum2(primo, 3)

    MsgBox primo

    End Sub

    Public Sub byVal_VS_byRef3()

    Dim primo As Integer

    primo = 5

    MsgBox mySum3(primo, 3)

    MsgBox primo

    End Sub

    byVal_VS_byRef e byVal_VS_byRef3 mostrano gli stessi valori e cioè 9 e 6, perché appunto la routine chimante vede la modifica al parametro.

    byVal_VS_byRef2 invece no, 9 e 5 perché passi il valore e non il riferimento in memoria del valore del parametro.

    Grazie mille veramente

    prego!

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-01-14T16:57:14+00:00

    <MSDN>

    You are not required to use the Call keyword when calling a procedure. However, if you use the Call keywordto call a procedure that requires arguments, argument list must be enclosed in parentheses. If you omit the Call keyword, you also must omit the parenthesesaround argumentlist. If you use either Call syntax to call any intrinsic or user-defined function, the function's return value is discarded.

    </MSDN>

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-01-14T16:50:30+00:00

    Grazie mille Sandro!

    Funziona! (ovviamente)

    Ho una domanda però, (scusa l'ignoranza). Come mai entra nella funzione senza utilizzare il comando Call?

    altra cosa nelle parentesi della funzione hai indicato byVal. Per cosa sta?

    Grazie mille veramente

    La risposta è stata utile?

    0 commenti Nessun commento