Provade denna ex. kod: Prova det här du måste tala om var i detta fall Text1 finns Tack för ditt svar Sven! Gör inte Join() funktionen jobbet åt dig? >En fråga bara, du la till " ByVal " till " strGreeting As String " varför? Hej Sven! Tycker inte att man kan säga att man alltid ska skicka parametrar ByVal.Skriva ut en array från en modul!
Private Sub cmdMyButton_Click()
Dim strMembers(1 To 3) As String
strMembers(1) = "Kalle"
strMembers(2) = "Pelle"
strMembers(3) = "Lisa"
Welcome strMembers, "Hej "
End Sub
Sub Welcome(strNames() As String, strGreeting As String)
Dim lngLower As Long
Dim lngUpper As Long
Dim lngX As Long
lngLower = LBound(strNames)
lngUpper = UBound(strNames)
For lngX = lngLower To lngUpper
MsgBox strGreeting & strNames(lngX)
Next lngX
End Sub
fast la in sub i en modul kallad Public Function Welcom.
Nu är det så att jag provade att byta ut MsgBoxe i modulen till en Textbox men då fick jag medelandet Object requierd, varför?
Jag har en text ruta i formen!
Tillägg, den funkar om jag har msgboxen...
MVH Mikael svenssonSv: Skriva ut en array från en modul!
<code>
Option Explicit
'Text1 MultiLine = True
Private Sub cmdMyButton_Click()
Dim strMembers(1 To 3) As String
strMembers(1) = "Kalle"
strMembers(2) = "Pelle"
strMembers(3) = "Lisa"
Text1.Text = ""
Call Welcome(strMembers, "Hej ")
End Sub
'BasModul Sub
Sub Welcome(strNames() As String, ByVal strGreeting As String)
Dim lngLower As Long
Dim lngUpper As Long
Dim lngX As Long
lngLower = LBound(strNames)
lngUpper = UBound(strNames)
For lngX = lngLower To lngUpper
Form1.Text1.Text = Form1.Text1.Text _
& strGreeting _
& strNames(lngX) _
& vbCrLf
Next 'lngX
End Sub
</code>Sv: Skriva ut en array från en modul!
En fråga bara, du la till " ByVal " till " strGreeting As String " varför?
Och vad är det för skillnad på att använda Public function och sub?
Är något bättre än det andra?
MVH Mikael svenssonSv: Skriva ut en array från en modul!
<code>
Option Explicit
''Text1 MultiLine = True
Private Sub cmdMyButton_Click()
Dim strMembers() As String
ReDim strMembers(1 to 3)
strMembers(1) = "Kalle"
strMembers(2) = "Pelle"
strMembers(3) = "Lisa"
Text1.Text = "Hej " & Join(strMembers, ", ")
End Sub
</code>Sv: Skriva ut en array från en modul!
Det har jag som grundregel,då skickar jag det sanna värdet till strGreeting.
Om jag inte skriver ByVal så skickar man egentligen adressen där i ditt
fall strMember står. Det kan då bli konflikt om du har fler variabler som är döpta till strMember.
Vidare så blir det strul om du ändrar på variabelns värde i den Public Sub du skickat den till.
I ditt exempel hade det funkat vilket som.Rekommenderar att alltid skicka ByVal.
När du skickar från VB till en API i C mfl .dll så vill den ha värdet ByVal i 99 % av alla fall.
Men Obs en array som du skickar skall alltid skickas som du gör ByReference
Dvs Arrayer kan inte skickas ByVal
Sub och Public är samma sak dvs Public är underförstått om du bara skriver Sub.
mvh
SvenSv: Skriva ut en array från en modul!
Tack för ditt svar, det gav mig lite mer klarhet i hur det fungerar!
MVH Mikael SvenssonSv: Skriva ut en array från en modul!
Skicka ByVal om du inte behöver/vill förändra värdet på den parameter du skickar in.
Bra att ha så man inte oavsiktligt förändrar värdet heller, så grundtanken som Sven har är ju bra. Bra om man tänker till innan bara.
Skicka ByRef om värdet ska kunna förändras.
Om man skickar ett objekt i en parameter går det lite snabbare om man skickar ByRef eftersom objektets reference counter inte ökas och minskas när man går in resp. ur proceduren.
Att skicka ett objekt som ByVal hindrar inte heller från att subobjekt kan modifieras, exempelvis innehållet i en Dictionary som man skickar in i en procedur.
Exempelvis ger förändrar båda procedurerna innehållet i objektet:
(Dictionary finns i "Microsoft Scripting Runtime")
<code>
Private Sub Command1_Click()
Dim col As New Dictionary
col.Add "Test", "Test av ByRef & ByVal"
Call TestByVal(col)
Debug.Print col.Item("Test")
Call TestByRef(col)
Debug.Print col.Item("Test")
End Sub
Private Sub TestByVal(ByVal col As Dictionary)
col.Item("Test") = col.Item("Test") & ", ByVal först"
End Sub
Private Sub TestByRef(ByRef col As Dictionary)
col.Item("Test") = col.Item("Test") & " och ByRef sen"
End Sub
</code>
Som sagt....tänk efter vad du har för behov innan du väljer om du ska ha ByRef eller ByVal.
/Egget