赞
踩
-
- Dim arr1
-
- arr1 = sh1.Range("c" & 4 & ":h" & maxcount1 + 3)
- arr1 = sh1.Range(sh1.Cells(4, c1), sh1.Cells(maxcount1 + 3, 8))
- ''' '遇到一个奇怪的问题,有一次居然遇到Range("b2:g17")可以,但是 sh1.Range("b2:g17")报错 类型不匹配?
-
-
- 'array()函数的index默认从0开始 ,除非有 option base 1等 array()是默认从0开始
- 'ReDim Preserve arr1(maxcount1, 6) 这样index也会从0开始,最好写成 ReDim Preserve arr1(1 to maxcount1, 1 to 6)
- '但是,无论有没有特殊声明,array()=range() 默认行,列都是从1开始
- '而且如果用option base 1 或 dim ( 1 to 10) 都是从1开始
-
-
-
-
- Sub test11()
-
- ''''--------------下面是把数值一次性装入数组!-------------------
- '方法1,定义为变量,一次性装入赋值,(变量指向 range 就会自动变成 动态数组)
- Dim sh1
- Set sh1 = ThisWorkbook.Worksheets("模拟")
- arr1 = sh1.Range("b2:g17")
- ''' '遇到一个奇怪的问题,有一次居然遇到Range("b2:g17")可以,但是 sh1.Range("b2:g17")报错 类型不匹配?
-
- '方法2,类似方法1 定义为变量,且用range(cells(),cells())
- ''' Dim arr1
- ''' Set sh1 = ThisWorkbook.Worksheets("模拟")
- ''' arr1 = sh1.Range(sh1.Cells(2, 2), sh1.Cells(17, 7))
-
- '方法3,定义为动态数组,可以一次性装入赋值/或者逐个写入都可以
- ''' Dim arr1()
- ''' ReDim arr1(1 To 16, 1 To 6) '其中16,6等都可以是参数, 也可以是数字常数
- ''' arr1() = sh1.Range("b2:g17")
-
- '错误方法01,定义为静态数组,是不行的,静态数组无法一次性装入数据,只能循环一个个写入。
- ''' Dim arr1(1 To 16, 1 To 6) '静态数组的定义,必须一次性dim(不能带参数),且不能redim
- ''' arr1() = sh1.Range("b2:g17") '静态数组不允许一次性装入
-
-
- '显示函数
- For i = LBound(arr1, 1) To UBound(arr1, 1)
- For j = LBound(arr1, 2) To UBound(arr1, 2)
- Debug.Print "arr1(" & i & "," & j & ")=" & arr1(i, j),
- Next
- Debug.Print
- Next
-
- End Sub
见下面的代码
- '读入数据
- Dim sh1 As Object
- Set sh1 = ThisWorkbook.Worksheets("data")
- c1 = WorksheetFunction.Match("rank", sh1.Range("3:3"), 0)
- c2 = WorksheetFunction.Match("ID", sh1.Range("3:3"), 0)
- c3 = WorksheetFunction.Match("name", sh1.Range("3:3"), 0)
- c4 = WorksheetFunction.Match("权重", sh1.Range("3:3"), 0)
- c5 = WorksheetFunction.Match("name", sh1.Range("3:3"), 0)
-
- maxcount1 = sh1.Cells(999, c1).End(xlUp).Row - 3
-
- '根据需要去查全部的其他列数据
- '其实这个可以直接用 等同于 arr1=range("a1:h8")
- Dim arr1()
- For j = 1 To 8
- For i = 1 To maxcount1
- ReDim Preserve arr1(16, j)
- arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- Next
- Next
- Sub test12()
-
- ''''--------------下面是用循环,逐个往数组里装入数值!-------------------
- ''' '上面都是 数组一次性装入数值,下面是逐个装入数据的写法
-
- Dim arr1()
- Set sh1 = ThisWorkbook.Worksheets("模拟")
- c1 = Application.Match("牌数", sh1.Rows("1:1"), 0)
- maxcount1 = sh1.Cells(999, c1).End(xlUp).Row - 1
-
-
- ''' '方法4, 动态数组在循环外redim一次
- ''' 'ReDim Preserve arr1(maxcount1, 6) '这行注释掉了是错的,这样会多出1行和1列,数组index默认从0开始
- ''' ReDim Preserve arr1(1 To maxcount1, 1 To 6) '其实这里只redim了一次,循环开始前已经界定了动态数组实际范围--
- ''' For i = 1 To maxcount1
- ''' For j = 1 To 6
- ''' arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- ''' Next
- ''' Next
-
-
-
- '方法5,动态数组,每次循环都在redim 数组大小(其实写的不太好,方法6更好)
- 'redim 每次循环列都在变化(其实是外层循环时,数组最后一维才变化),同时内循环是行(内部循环时其实列数没变)
- '''' For j = 1 To 6
- '''' For i = 1 To maxcount1
- '''' ReDim Preserve arr1(1 To maxcount1, 1 To j) 'arr1逐个数组从1列逐渐每次 + 新增1列 + 同时往新列里加数据
- '''' arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- '''' Next
- '''' Next
-
-
- '方法6, redim动态数组,写在外层循环内,更合适
- For j = 1 To 6
- ReDim Preserve arr1(1 To maxcount1, 1 To j) 'redim 放在外层循环更合适
- For i = 1 To maxcount1
- arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- Next
- Next
-
-
-
- '''' '错误方法02,遍历时需要考虑 redim 扩展的方向--先填充(内循环的先填充)另外一个维度的内容-------内外2层嵌套次序要写对才行
- '''' '因为只有最后1维可变化,也就是第1维,arr1数组行数始终是 maxcount1=16
- '''' '这样得出的结果是,第1列和最后一行有数据,其他都空的,为啥呢
- '''' '因为 第二维列j一直从1变6,又从6变1,从6变1的时候即使有redim也因为列数变小而丢失了数据
- '''' '所以前面的行都只有第1列有数保留,j=2-5都被删掉了,而最后1行是因为j=6循环结束了不再缩小为1了
- '''' For i = 1 To maxcount1
- '''' For j = 1 To 6
- '''' ReDim Preserve arr1(1 To maxcount1, 1 To j) '只有最后1维允许动态调整,前面那一维不能
- '''' arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- '''' Next
- '''' Next
- ''''
-
- '''' '错误方法03,i修改为16/ maxcount1就对了,因为VBA里动态数组redim只允许最后1列改变
- '''' For j = 1 To 6
- '''' For i = 1 To maxcount1
- '''' ReDim Preserve arr1(1 To 16, 1 To j) '会报错下标index越界,
- '''' arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- '''' Next
- '''' Next
-
-
- '显示函数
- For i = LBound(arr1, 1) To UBound(arr1, 1)
- For j = LBound(arr1, 2) To UBound(arr1, 2)
- Debug.Print "arr1(" & i & "," & j & ")=" & arr1(i, j),
- Next
- Debug.Print
- Next
-
- End Sub
-
-
更好的方法是用 rows() columns() 表示1行,1列更简洁
rows(3) 和 columns(3) 天生的就是 r1c1的引用格式,很简洁
- '读入数据
- Dim sh1 As Object
- Set sh1 = ThisWorkbook.Worksheets("data")
- c1 = WorksheetFunction.Match("rank", sh1.Range("3:3"), 0)
- c2 = WorksheetFunction.Match("ID", sh1.Range("3:3"), 0)
- c3 = WorksheetFunction.Match("name", sh1.Range("3:3"), 0)
- c4 = WorksheetFunction.Match("权重", sh1.Range("3:3"), 0)
- c5 = WorksheetFunction.Match("name", sh1.Range("3:3"), 0)
-
- maxcount1 = sh1.Cells(999, c1).End(xlUp).Row - 3
-
- '测试,用rank=5这个信息去查找对应的id是多少
- m1 = Application.Index(sh1.Columns(c2), Application.Match(5, sh1.Columns(c1), 0))
-
-
- '根据需要去查全部的其他列数据
- '其实这个可以直接用 等同于 arr1=range("a1:h8")
- Dim arr1()
- For j = 1 To 8
- For i = 1 To maxcount1
- ReDim Preserve arr1(16, j)
- arr1(i, j) = Application.Index(sh1.Columns(c1 + j - 1), Application.Match(i, sh1.Columns(c1), 0))
- Next
- Next
'更好的写法,带着参数
c1 = WorksheetFunction.Match("rank", sh1.Range("3:3"), 0)
sh2.Cells(bb, 3) = Application.Index(sh1.Columns(c2), Application.Match(ra1, sh1.Columns(c1), 0))
' 这种写法不好,因为写死了列名,之后不好修改
arr1(i) = WorksheetFunction.Match(i, sh1.Range("c:c"), 0)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。