我正在尝试在四个不同位置的2007 Excel工作表中填写值“AZ,0-9”(我试图将“AZ”和“0-9”放在单元格中:A1
到D9
,E1
至H9
,A10
至D18
以及E10
至H18
)。
到目前为止,我有这段代码:
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
执行此操作,如果我使用第二个for循环的范围,我得到了值{9出现在A1
到D9
的每个单元格中。
那么有没有办法让它能够在我上面指定的其他单元格中获得值“A-Z”和“0-9”?
答案 0 :(得分:1)
好的第一:你可以通过许多不同的方式做到这一点......你的第二个循环中的主要问题是你总是在写一个固定的范围:
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
然后,您可以迭代该数组并输出表(始终使用起始行和列作为参考)。当然,你可以通过使用modulo等来使代码更加灵活。
我希望有所帮助。
答案 1 :(得分:1)
为什么不利用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
答案 2 :(得分:1)
这是另一种方式
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
答案 3 :(得分:0)
一种避免完全循环的有效方法是使用可以直接将矩阵复制到范围的事实(反之亦然)。对Dick代码的修改提供了以下解决方案:
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