使用VBA在Excel 2007中的不同单元格中填写不同的string值

我试图在四个不同位置(我试图把“AZ”和“0-9”放在单元格中: A1D9E1H9A10在2007 Excel表格中填写值“AZ,0-9”到D18 ,和E10H18 )。

到目前为止,我有这样的代码:

 Sub TwoDArrays() Dim Matrix(9, 4) As Variant Dim Matrix2(9, 4) As Variant Dim Matrix3(9, 4) As Variant Dim Matrix4(9, 4) As Variant Matrix(1, 1) = "A" Matrix(1, 2) = "B" Matrix(1, 3) = "C" Matrix(1, 4) = "D" Matrix(2, 1) = "E" Matrix(2, 2) = "F" Matrix(2, 3) = "G" Matrix(2, 4) = "H" Matrix(3, 1) = "I" Matrix(3, 2) = "J" Matrix(3, 3) = "K" Matrix(3, 4) = "L" Matrix(4, 1) = "M" Matrix(4, 2) = "N" Matrix(4, 3) = "O" Matrix(4, 4) = "P" Matrix(5, 1) = "Q" Matrix(5, 2) = "R" Matrix(5, 3) = "S" Matrix(5, 4) = "T" Matrix(6, 1) = "U" Matrix(6, 2) = "V" Matrix(6, 3) = "W" Matrix(6, 4) = "X" Matrix(7, 1) = "Y" Matrix(7, 2) = "Z" Matrix(7, 3) = "0" Matrix(7, 4) = "1" Matrix(8, 1) = "2" Matrix(8, 2) = "3" Matrix(8, 3) = "4" Matrix(8, 4) = "5" Matrix(9, 1) = "6" Matrix(9, 2) = "7" Matrix(9, 3) = "8" Matrix(9, 4) = "9" Matrix2(1, 1) = "A" Matrix2(1, 2) = "B" Matrix2(1, 3) = "C" Matrix2(1, 4) = "D" Matrix2(2, 1) = "E" Matrix2(2, 2) = "F" Matrix2(2, 3) = "G" Matrix2(2, 4) = "H" Matrix2(3, 1) = "I" Matrix2(3, 2) = "J" Matrix2(3, 3) = "K" Matrix2(3, 4) = "L" Matrix2(4, 1) = "M" Matrix2(4, 2) = "N" Matrix2(4, 3) = "O" Matrix2(4, 4) = "P" Matrix2(5, 1) = "Q" Matrix2(5, 2) = "R" Matrix2(5, 3) = "S" Matrix2(5, 4) = "T" Matrix2(6, 1) = "U" Matrix2(6, 2) = "V" Matrix2(6, 3) = "W" Matrix2(6, 4) = "X" Matrix2(7, 1) = "Y" Matrix2(7, 2) = "Z" Matrix2(7, 3) = "0" Matrix2(7, 4) = "1" Matrix2(8, 1) = "2" Matrix2(8, 2) = "3" Matrix2(8, 3) = "4" Matrix2(8, 4) = "5" Matrix2(9, 1) = "6" Matrix2(9, 2) = "7" Matrix2(9, 3) = "8" Matrix2(9, 4) = "9" Matrix3(1, 1) = "A" Matrix3(1, 2) = "B" Matrix3(1, 3) = "C" Matrix3(1, 4) = "D" Matrix3(2, 1) = "E" Matrix3(2, 2) = "F" Matrix3(2, 3) = "G" Matrix3(2, 4) = "H" Matrix3(3, 1) = "I" Matrix3(3, 2) = "J" Matrix3(3, 3) = "K" Matrix3(3, 4) = "L" Matrix3(4, 1) = "M" Matrix3(4, 2) = "N" Matrix3(4, 3) = "O" Matrix3(4, 4) = "P" Matrix3(5, 1) = "Q" Matrix3(5, 2) = "R" Matrix3(5, 3) = "S" Matrix3(5, 4) = "T" Matrix3(6, 1) = "U" Matrix3(6, 2) = "V" Matrix3(6, 3) = "W" Matrix3(6, 4) = "X" Matrix3(7, 1) = "Y" Matrix3(7, 2) = "Z" Matrix3(7, 3) = "0" Matrix3(7, 4) = "1" Matrix3(8, 1) = "2" Matrix3(8, 2) = "3" Matrix3(8, 3) = "4" Matrix3(8, 4) = "5" Matrix3(9, 1) = "6" Matrix3(9, 2) = "7" Matrix3(9, 3) = "8" Matrix3(9, 4) = "9" Matrix4(1, 1) = "A" Matrix4(1, 2) = "B" Matrix4(1, 3) = "C" Matrix4(1, 4) = "D" Matrix4(2, 1) = "E" Matrix4(2, 2) = "F" Matrix4(2, 3) = "G" Matrix4(2, 4) = "H" Matrix4(3, 1) = "I" Matrix4(3, 2) = "J" Matrix4(3, 3) = "K" Matrix4(3, 4) = "L" Matrix4(4, 1) = "M" Matrix4(4, 2) = "N" Matrix4(4, 3) = "O" Matrix4(4, 4) = "P" Matrix4(5, 1) = "Q" Matrix4(5, 2) = "R" Matrix4(5, 3) = "S" Matrix4(5, 4) = "T" Matrix4(6, 1) = "U" Matrix4(6, 2) = "V" Matrix4(6, 3) = "W" Matrix4(6, 4) = "X" Matrix4(7, 1) = "Y" Matrix4(7, 2) = "Z" Matrix4(7, 3) = "0" Matrix4(7, 4) = "1" Matrix4(8, 1) = "2" Matrix4(8, 2) = "3" Matrix4(8, 3) = "4" Matrix4(8, 4) = "5" Matrix4(9, 1) = "6" Matrix4(9, 2) = "7" Matrix4(9, 3) = "8" Matrix4(9, 4) = "9" For i = 1 To 9 For j = 1 To 4 Cells(i, j) = Matrix(i, j) Next j Next i 'For i = 1 To 9 'For j = 1 To 4 ' Range("a1:d1", "a1:a10").Value = Matrix(i, j) 'Application.WorksheetFunction.Transpose (Matrix) 'Next j 'Next i End Sub 

然而,在顶部for循环中,它没有使用Range函数与单元格,我只能对单元格A1:D9执行此操作,而如果使用范围的第二个循环,则会得到值9细胞从A1D9

那么是否有办法让我可以在上面指定的其他单元格中获得值“AZ”和“0-9”?

确定第一:你可以用许多不同的方式来做到这一点……你的第二个循环中的主要问题是你总是写一个固定的范围:

 Range("a1:d1", "a1:a10").Value = Matrix(i, j) 

该指令将当前字符(由i和j确定)写入整个范围A1:D1至A1:A10 …最后一个字符为“9”,因此范围最终将填充“9”。

基本上,因为你总是希望将相同的字符写入不同的范围,所以不必一遍又一遍地复制数组。 这是一个你想要的代码片段

 Sub TwoDArrays() Dim Matrix(9, 4) As Variant Dim startCoords(4, 2) As Integer Matrix(1, 1) = "A" Matrix(1, 2) = "B" Matrix(1, 3) = "C" Matrix(1, 4) = "D" Matrix(2, 1) = "E" Matrix(2, 2) = "F" Matrix(2, 3) = "G" Matrix(2, 4) = "H" Matrix(3, 1) = "I" Matrix(3, 2) = "J" Matrix(3, 3) = "K" Matrix(3, 4) = "L" Matrix(4, 1) = "M" Matrix(4, 2) = "N" Matrix(4, 3) = "O" Matrix(4, 4) = "P" Matrix(5, 1) = "Q" Matrix(5, 2) = "R" Matrix(5, 3) = "S" Matrix(5, 4) = "T" Matrix(6, 1) = "U" Matrix(6, 2) = "V" Matrix(6, 3) = "W" Matrix(6, 4) = "X" Matrix(7, 1) = "Y" Matrix(7, 2) = "Z" Matrix(7, 3) = "0" Matrix(7, 4) = "1" Matrix(8, 1) = "2" Matrix(8, 2) = "3" Matrix(8, 3) = "4" Matrix(8, 4) = "5" Matrix(9, 1) = "6" Matrix(9, 2) = "7" Matrix(9, 3) = "8" Matrix(9, 4) = "9" startCoords(1, 1) = 1 startCoords(1, 2) = 1 startCoords(2, 1) = 1 startCoords(2, 2) = 5 startCoords(3, 1) = 10 startCoords(3, 2) = 1 startCoords(4, 1) = 10 startCoords(4, 2) = 5 For tableNo = 1 To UBound(startCoords) For rowNo = 1 To 9 For colNo = 1 To 4 Cells(rowNo + startCoords(tableNo, 1) - 1, colNo + startCoords(tableNo, 2) - 1) = Matrix(rowNo, colNo) Next colNo Next rowNo Next tableNo End Sub 

我的想法是(保持相当简单),你可以使用一个2D数组来保存你的表的起始坐标(4个表格,每个起始坐标2个)。

A1 = 1,1 E1 = 1,5 A10 = 10,1 E10 = 10,5

然后可以遍历该数组并输出表(始终使用起始行和列作为参考)。 你可以通过使用模和任何当然使代码更灵活。

我希望有一点帮助。

为什么不利用Chr函数来代替填充数组呢?

 Sub PopulateAlphaNum() Const intCOLS As Integer = 4 Const intROWS As Integer = 9 Dim rngStart As Range Dim rngAllRanges As Range Dim i As Integer Dim j As Integer Dim iChr As Integer Set rngAllRanges = Range("A1, E1, A10, E10") For Each rngStart In rngAllRanges iChr = 65 For i = 0 To intROWS - 1 For j = 0 To intCOLS - 1 If iChr = 91 Then iChr = 48 rngStart.Offset(i, j).Value = Chr(iChr) iChr = iChr + 1 Next j Next i Next rngStart End Sub 

这是另一种方式

 Sub TwoDArrays() Dim aMatrix(1 To 9, 1 To 4) As String Dim i As Long, j As Long Dim lCnt As Long lCnt = 64 For i = 1 To 9 For j = 1 To 4 If lCnt = 91 Then lCnt = 48 lCnt = lCnt + 1 aMatrix(i, j) = Chr$(lCnt) Next j Next i With Sheet1.Range("A1") For i = 0 To 9 Step 9 For j = 0 To 4 Step 4 .Offset(i, j).Resize(9, 4).Value = aMatrix Next j Next i End With End Sub 

避免完全循环的有效方法是使用可以直接将matrix复制到范围(反之亦然)的事实。 迪克代码的修改提供了以下解决scheme:

 Sub NoLoop() Dim aMatrix(1 To 9, 1 To 4) As String Dim i As Long, j As Long Dim lCnt As Long lCnt = 64 For i = 1 To 9 For j = 1 To 4 If lCnt = 90 Then lCnt = 47 lCnt = lCnt + 1 aMatrix(i, j) = Chr$(lCnt) Next j Next i Range("A1:D9") = aMatrix End Sub