Hur sätter man ihop en matrisarray utan att veta hur många rader man vill ha?
2D Matrisarray
18 svar · 345 visningar · startad av Erik Juhlin
Nu snackar du koder med mig erik, när jag ska bygga boooo åt oss ;) Menar du att bygga upp en vanlig 2d array dynamiskt, alltså den kan innehålla allt från 0-100 typ ?
Jupp...
Jag kommer ha en metod i en klass som kommer heta AddRecipient där man lägger in e-post adresser.
Först tänkte jag använda ett appended recordset, men det krånglade. Så nu tänkte jag lägga till rader i en 2D-array. :)
Uhu? Hur fungerar det?
Kan man använda ReDim även i VB? :)
Give me an example! :)
Nu pratar vi väl inte VB? ;)
Exempel:
<%
Dim varArray
redim varArray (0,0)
for i = 0 to 50
redim preserve varArray (0, i)
varArray (0, i) = "här är grej nummer " & i
next
for i = 0 to ubound(varArray, 2)
Response.Write varArray (0, i) & "<br>"
Next
%>
Mvh,
Weee!
Har just fattat hur ArgList fungerar. Inte svårt, men kul. Det som funktionen Array har som gör att man kan skicka in oändligt med argument! :)
Function foo(ParamArray ArgList() As Variant)
Dim vArr As Variant
vArr = ArgList
Dim i As Long
For i = 0 To UBound(vArr)
MsgBox vArr(i)
Next i
End Function
Nu ska jag prova ditt tjaffs. :)
Ok, du är alltså i fel forum och härjar?
Preserve betyder att arrayen får ha kvar sitt innehåll?
Jepps.
Jag försöker göra så här, men får subscript out of range.
Private mEmail As Variant
Public Sub AddRecipient(ByVal sEmail As String, ByVal sName As String)
Dim lNewId As Long
lNewId = UBound(mEmail, 2)
ReDim Preserve mEmail(0, lNewId) ' <-- felraden
mEmail(0, lNewId) = sEmail
mEmail(1, lNewId) = sName
End Sub
Public Sub send()
Dim i As Long
For i = 0 To UBound(mEmail, 2)
MsgBox mEmail(0, i) & "<br>"
Next
End Sub
By the way, tänkte först att det inte var så VB specifikt. Men nu börjar det spåra ur med en massa VB kod. Skulle kunna flyttas. :)
i sub Class_initialize() så skulle jag lägga till detta:
ReDim mEmail(0,0)
<redigerat>
dvs, skapa om arrayen (utan ngt data) när du skapar en instans av klassen.
Du kommer då att inte få några data i första indexet men det kan man bjuda på. Dvs, du får börja arraylooparna så här:
For N = 1 TO UBound(mEmail,2)
då första indexet är tomt =)
</redigerat>
cya,
PatrikB
Det hade jag, men annat störde.
Nu funkar detta, men jag kan inte få in namn. :l
Option Explicit
Private mEmail As Variant
Public Sub AddRecipient(ByVal sEmail As String, ByVal sName As String)
Dim lNewId As Long
lNewId = UBound(mEmail, 2) + 1
ReDim Preserve mEmail(0, lNewId)
mEmail(0, lNewId) = sEmail
'mEmail(1, lNewId) = sName
End Sub
Public Sub send()
Dim i As Long
For i = 0 To UBound(mEmail, 2)
MsgBox mEmail(0, i)
Next
End Sub
Private Sub Class_Initialize()
ReDim mEmail(0, 0)
End Sub
Felet beror nog på att lNewId = -1 och indexet kan inte vara -1
Första gången du kör UBound på mEmail så kommer ubound att returnera -1 vilket betyder att det är en tom array.
cya,
PatrikB
inte konstigt ..... du har ju para en position ;)
Private Sub Class_Initialize()
ReDim mEmail([b]1[/b], 0)
End Sub
cya,
PatrikB
Hoppade över Class_Initialize.
Option Explicit
Private mEmail As Variant
Public Sub AddRecipient(ByVal sEmail As String, ByVal sName As String)
Dim lNewId As Long
If Not IsArray(mEmail) Then
ReDim mEmail(1, 0)
lNewId = 0
Else
lNewId = UBound(mEmail, 2) + 1
End If
ReDim Preserve mEmail(1, lNewId)
mEmail(0, lNewId) = sEmail
mEmail(1, lNewId) = sName
End Sub
Public Sub Send()
Dim i As Long
For i = 0 To UBound(mEmail, 2)
MsgBox mEmail(0, i)
Next
End Sub
Private Sub Class_Initialize()
'ReDim mEmail(1, 0)
End Sub
Nu börjar det funka i alla fall. Tack @nders och PatrikB. :)