webForumDet fria alternativet

2D Matrisarray

18 svar · 345 visningar · startad av Erik Juhlin

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#1

Hur sätter man ihop en matrisarray utan att veta hur många rader man vill ha?

erkaMedlem sedan dec. 19996 522 inlägg
#2

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 ?

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#3

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. :)

@ndersMedlem sedan juni 200032 969 inlägg
#4

Du kan använda redim preserve, men du kan bara ändra på den sista dimensionen.

Mvh,

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#5

Uhu? Hur fungerar det?
Kan man använda ReDim även i VB? :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#6

Give me an example! :)

@ndersMedlem sedan juni 200032 969 inlägg
#7

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,

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#8

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
Erik JuhlinMedlem sedan maj 200010 687 inlägg
#9

Nu ska jag prova ditt tjaffs. :)

@ndersMedlem sedan juni 200032 969 inlägg
#10

Ok, du är alltså i fel forum och härjar?

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#11

Preserve betyder att arrayen får ha kvar sitt innehåll?

@ndersMedlem sedan juni 200032 969 inlägg
#12

Jepps.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#13

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. :)

PatrikBMedlem sedan mars 20002 836 inlägg
#14

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#15

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
PatrikBMedlem sedan mars 20002 836 inlägg
#16

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

PatrikBMedlem sedan mars 20002 836 inlägg
#17

inte konstigt ..... du har ju para en position ;)

Private Sub Class_Initialize()
    ReDim mEmail([b]1[/b], 0)
End Sub

cya,
PatrikB

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#18

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
Erik JuhlinMedlem sedan maj 200010 687 inlägg
#19

Nu börjar det funka i alla fall. Tack @nders och PatrikB. :)

136 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)