假如我们要实现选中的紧挨两列内容在原位置的调换,你会想到什么方法?
涉及知识点:
变量含义理解应用、Index函数学习、cells属性、数组知识。
▼
﹥﹥方法1:借助辅助区域
VBA新手估计首先想到的就是做一个辅助区域,将需要调换的内容copy到辅助区域,再copy回来实现调换两列的目的。这的确是一个曲线救国的方法。
但是,通用性不够好。你随便放数据,万一影响其他原始数据就麻烦了。
﹥﹥方法2:利用中间变量
VBA初级选手估计会这么解决。如果对变量理解的稍微好一些,会想到先将内容赋值给一个中间变量,然后通过这个中间变量实现调换数据的功能。
先来个简单的例子,假如我们就交换A1单元格和B1单元格的内容,我们的代码要这样写。
Sub 调换A1和B1单元格()中间变量 = Range("b1")Range("b1") = Range("a1")Range("a1") = 中间变量End Sub
F8调试过程
中间变量起到一个临时存储数据的作用。
升级一下,如果要交换任意选中两列区域的交换。思路还是那个思路,只不过需要对选中区域进行逐行循环。
代码如下:
Sub 调换任意两列内容() Dim a%, b%, c%, r% , num$ a = Selection.Row b = Selection.Rows.Count c = Selection.Column With ActiveSheet For r = a To a + b-1 num = .Cells(r, c + 1).Value .Cells(r, c + 1).Value = .Cells(r, c).Value .Cells(r, c).Value = num Next End With End Sub
代码中这段代码,就是利用中间变量调换两列数据的过程。
num = .Cells(r, c + 1).Value.Cells(r, c + 1).Value = .Cells(r, c).Value.Cells(r, c).Value = num
接下来要放大招了,请出来我们的数组
﹥﹥方法3:利用数组
VBA中级选手就要用到神器了。其实这种问题,用数组解决最好不过,代码少,运行快。
Sub 调换两列()arr = Selectionar1 = WorksheetFunction.Index(arr, 0, 1)ar2 = WorksheetFunction.Index(arr, 0, 2)Selection.Cells(1, 1).Resize(UBound(ar2), 1) = ar2Selection.Cells(1, 2).Resize(UBound(ar1), 1) = ar1End Sub
知识点讲解
■Index函数:返回列表或数组中的元素值,此元素由行序号和列序号的索引值给定。
语法:Index(array,row_num,column_num)
如果同时使用 row_num 和 column_num,函数Index 返回 row_num 和 column_num 交叉处的单元格的数值。
如果将 row_num 或 column_num 设置为 0,函数 Index 则分别返回整个列或行的数组数值。
在这里主要用作取出二维数组中某一列数据。所以将数组一维参数写成0。
·Index(arr, 0, 1):取出二维数组第一列内容作为一个新数组。
·Index(arr, 0, 2):取出二维数组第二列内容作为一个新数组。
■Selection的cells属性
selection是已选单元格区域。对他应用cells属性,.Cells(1, 1)表示已选单元格区域的左上角第一个单元格。
﹥﹥方法4:VBA高级选手的方法
这种简单的问题,我也不知道高手们怎么解决的。有更好的方法,也希望高手在下方留言提点我。
联系客服