2016-10-24 2 views
0

Ich brauche eine Reihe von Werten in einer Variablen zu setzen, das heißt die VariableSpeicher einen Bereich in einer Variablen

tsPeriod(1) = (3, 4, 5) 
tsPeriod(3) = (1, 2, 3). 

Ich weiß nicht, welche Art von Variable zu deklarieren und wie es zu tun. Ich habe versucht, so etwas zu tun:

Dim tsPeriod() as long 
ReDim tsPeriod(nSub) as long 
for i = 1 to nSub 
    tsPeriod(i) = (tsStart(i), tsEnd(i)) 
next 

Aber es funktioniert nicht auf diese Weise und im kinda verloren arbeiten, wie der „Bereich“ in diese Variablen zu setzen. (Wenn der erste Wert 3 ist, und die zweite ist 6 möchte ich die Variable abzurufen (3, 4, 5, 6))

Unten ist ein Teil des Codes:

Dim wb As Workbook 
Set wb = ThisWorkbook 

Dim subjects As Worksheet 
Set subjects = wb.Sheets("Subject") 

Dim nSub As Integer, nRooms As Integer 

nSub= subjects.Cells(Rows.Count, 1).End(xlUp).value 

Dim tsStart() As Long 
ReDim tsStart(nSub) As Long 

For i = 1 To nSub 
    tsStart(i) = subjects.Cells(i + 1, 3).value 
Next 

Dim tsBusy() As Long 
ReDim tsBusy(numDis) As Long 

For i = 1 To nSub 
    tsBusy(i) = subjects.Cells(i + 1, 4).value 
Next 

Dim tsEnd() As Long 
ReDim tsEnd(nSub) As Long 

For i = 1 To nSub 
    tsEnd(i) = tsStart(i) + tsBusy(i) - 1 
Next 

'Here's where im having trouble 
Dim tsPeriod() As Long 
ReDim tsPeriod(nSub) As Long 

For i = 1 To nSub 
    tsPeriod(i) = (tsStart(i), TsEnd(i)) 
Next 
+2

Es gibt keine integrierte "Bereich" -Methode in VBA: Sie müssen ein Array der erforderlichen Größe dimensionieren und es mit einer Schleife füllen. –

+0

'numDis' wird niemals initialisiert. Soll es immer als 'numSub' gedacht sein? – user3598756

+0

@ user3598756 ja, es ist nSub. Ich habe den Code ins Englische übersetzt und vergessen, es zu ändern, haha. Danke! – jf8769

Antwort

1

Es gibt keine integrierte -In "Bereich" -Methode in VBA: Sie müssen ein Array der erforderlichen Größe zu dimensionieren und füllen Sie es mit einer Schleife. Sie können eine Funktion, dies zu tun erstellen:

Function RRange(startNum, endNum) 
    Dim rv() as long, i 
    Redim rv(1 to (endnum-startnum)+1) 
    for i = startNum to endNum 
     rv((i-startNum)+1) = i 
    next i 
    RRange = rv 
End Function 

Dann:

For i = 1 To numDis 
    tsPeriod(i) = RRange(tsStart(i), TsEnd(i)) 
Next 
+3

Einige Kommentare: 1) 'rv ((startNum-i) +1) = i'I sollte sein' rv ((i - startNum) + 1) = i' 2) 'tsPeriod' muss als ein Array von' deklariert werden Variant' type: 'ReDim tsPeriod() As Variant' 3) OP kann alle Arrays 'Dim'-Anweisungen loswerden und nur ihre' ReDim'-Einsen lassen – user3598756

+0

Ok, ich habe es versucht, aber ich habe noch einen Zweifel: warum Kann ich nicht debuggen.print es? – jf8769

+0

So ein Array kann man nicht drucken ... nutze die "add watch" die zeige alle Werte –

0

Sie die Kombination von Application.Transpose verwenden können, Evaluate und die worksheets- ROW Funktion dorthin zu gelangen.

Für die

tsPeriod(i) = (tsStart(i), TsEnd(i)) 

einfach

tsPeriod(i) = Application.Transpose(Evaluate("=ROW(" & tsStart(i) & ":" & tsEnd(i) & ")")) 

verwenden, um ein Array von dem ersten bis zum letzten Wert. Um nur eine kommagetrennte Zeichenfolge zu erhalten, setzen Sie diese in einem Join wie diese

tsPeriod(i) = Join(Application.Transpose(Evaluate("=ROW(" & tsStart(i) & ":" & tsEnd(i) & ")")), ",") 

Join auch für die Prüfung gut ist, wenn alles in Ordnung ist, weil Sie Debug.Print verwenden können.

Verwandte Themen