2011-06-17 165 views
0

我有以下问题。我有一个带有输入字段的用户窗体。用户将输入参与者的号码。我有四组参加者:Excel VBA中填充阵列

 
Group A: 5 
Group B: 6 
Group C: 1 
Group D: 2 

每个参与者都应该被命名为这样的:{GA1,GA2,...,GD2}我想写这个到的顺序数组,然后使用该数组用名字填充单元格,但是我想出的所有单元都是四个for循环将其写入数组,并且也失败了。有一个更好的方法吗?

Dim GA As Integer 
Dim GB As Integer 
Dim GC As Integer 
Dim GD As Integer 
Dim PartSum As Integer 


GA = TextBox32.Value 
GB = TextBox33.Value 
GC = TextBox34.Value 
GD = TextBox35.Value 

PartSum = GA + GB + GC + GD 

Dim NamingArray() As String 

ReDim NamingArray(1 To PartSum) 

For i = 0 To GA 
    NamingArray(i) = "GA " & CStr(i) 
Next i 

For j = GA To GA + GB 
    NamingArray(i) = "GB " & CStr(j) 
Next j 

For k = GA + GB To GA + GB + GC 
    NamingArray(i) = "GC " & CStr(k) 
Next k 

For l = GA + GB + GC To GA + GB + GC + GD 
    NamingArray(i) = "GD " & CStr(l) 
Next l 

'check entries 
For i = LBound(NamingArray) To UBound(NamingArray) 

    MsgBox (NamingArray(i)) 

Next i 
+0

你能后失败的代码? – jonsca 2011-06-17 08:47:34

回答

3

我可以看到三个原因,就像你希望你的代码没有表现。

首先,你在你的For ... Next循环指数使用的变量是不一致的。在这个循环中,例如,你增加k但使用i索引到NamingArray。请注意,i仍然具有从第一个循环剩下的值GA+1

For k = GA + GB To GA + GB + GC 
    NamingArray(i) = "GC " & CStr(k) 
Next k 

只需使用i即可完成所有循环。无需每次都使用不同的字母。

其次,您尝试访问的NamingArray,不存在元素0。

ReDim NamingArray(1 To PartSum) ' starts at 1 

For i = 0 To GA 
    NamingArray(i) = "GA " & CStr(i) ' attempt to refer to NamingArray(0) 
Next i 

第三,您的索引更加笼统。例如,NamingArray(GA)将在第一次循环结束时写入,然后在第二次循环开始时被覆盖。这发生在你所有的循环中;他们的“管辖权”重叠(对不起,我是加拿大人)。我已经纠正了这个(以及所有其他错误)。这工作:

For i = 1 To GA 
    NamingArray(i) = "GA " & CStr(i) 
Next i 

For i = 1 + GA To GA + GB 
    NamingArray(i) = "GB " & CStr(i - GA) 
Next i 

For i = 1 + GA + GB To GA + GB + GC 
    NamingArray(i) = "GC " & CStr(i - GA - GB) 
Next i 

For i = 1 + GA + GB + GC To GA + GB + GC + GD 
    NamingArray(i) = "GD " & CStr(i - GA - GB - GC) 
Next i 

现在回答你的问题:有没有更好的方式来做到这一点?是。但是,这工作正常,尽管它不漂亮,但它在任何方面都不是低效的。

+0

Thx。我用这个和thx来评论。 – user366121 2011-06-29 07:12:28

0

为什么要用数组?声明一个int光标

假设你希望他们跨越第1行

dim col as integer 
dim Acount as integer (etc) 
'get Acount, Bcount etc from form 
for col 1 =1 to Acount 
    cells(1,col).value = "GA" & col 
next 
for col =1 Acount to Bcount-1 
    cells(1,col).value = "GB" & col 
next 

+0

嗯也会试试这个。 – user366121 2011-06-17 09:19:07

0

如果列表不会改变,那么你的阵列可以被简单地声明是这样的:

Dim participantNames 
participantNames = Array("GA1","GA2","GA3","GA4","GA5","GB1","GB2","GB3","GB4","GB5","GB6","GC1","GD1","GD2") 

如果字母和计数的列表可能会有所不同,那么你可能需要一个功能,是这样的:

Option Explicit 

Public Function GroupIDs(grpNames, grpCounts) As Variant 

Dim grpIndex 
Dim countIndex 
Dim output As New Collection 

    For grpIndex = LBound(grpNames) To UBound(grpNames) 
     For countIndex = 1 To grpCounts(grpIndex) 
      output.Add "G" & grpNames(grpIndex) & countIndex 
     Next 
    Next 

ReDim outputArray(1 To output.Count) 

    For countIndex = 1 To output.Count 
     outputArray(countIndex) = output(countIndex) 
    Next 

    GroupIDs = outputArray 

End Function 

...你可以称之为有:

GroupIds(Array("A", "B", "C", "D"),Array(5, 6, 1, 2)) 
+0

我试过你的代码,但当我尝试通过数组来查看输出时出现类型不匹配错误。 – user366121 2011-06-17 09:17:24

0

名称的文本框tbxGA,tbxGB,tbxGC和tbxGD,并使用此代码写入到一个范围。

Private Sub cmdWrite_Click() 

    Dim i As Long, j As Long 
    Dim ctl As Control 
    Dim lCnt As Long 
    Dim aOutput() As String 
    Dim lTotal As Long 

    For i = 65 To 68 
     Set ctl = Me.Controls("tbxG" & Chr$(i)) 
     lTotal = lTotal + Val(ctl.Text) 
    Next i 

    ReDim aOutput(1 To lTotal, 1 To 1) 

    For i = 65 To 68 
     Set ctl = Me.Controls("tbxG" & Chr$(i)) 
     For j = 1 To Val(ctl.Text) 
      lCnt = lCnt + 1 
      aOutput(lCnt, 1) = "G" & Chr$(i) & j 
     Next j 
    Next i 

    Sheet1.Range("A1").Resize(UBound(aOutput, 1), UBound(aOutput, 2)).Value = aOutput 

    Unload Me 

End Sub