excel vba填充数组
我有以下问题。 我有一个用户窗体的input字段。 用户将input参与者的号码。 我有四组参与者:
A组:5 B组:6 C组:1 D组:2
每个参与者都应该这样命名:{GA1,GA2,…,GD2}我想按照这个顺序把它写入一个数组,然后用这个数组来填充名字的单元格,但是所有我想到的都是四个将其写入数组并且失败。 有一个更好的方法吗?
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
我可以看到为什么你的代码不像你所期望的那样有三个原因。
首先,在For ... Next
循环中用作索引的variables是不一致的。 在这个循环中,例如,你增加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)
将在第一个循环结束时写入,然后在第二个循环开始时被覆盖。 这发生在你所有的循环中; 他们的“pipe辖权”重叠(对不起,我是加拿大人)。 我已经纠正了这个(和所有其他错误)下面。 这工作:
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
现在回答你的问题:有没有更好的方法来做到这一点? 是。 但是,这工作得很好,虽然不是很漂亮,但不是没有任何效率。
为什么打扰一个数组? 声明一个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
等等
如果列表不会改变,那么你的数组可能被简单地声明为这样:
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))
命名您的文本框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