40、选中单元格对称转置。用了两种方法,一种普通的数字转换,一种是利用数组转换,个人更喜欢数组的应用。代码如下:
cRblNFiW.rar
(12.65 KB, 下载次数: 226)
Private Sub CommandButton1_Click() '普通单元格转置
Dim rng As Range
Dim rng1 As Range
Dim Mr%, Mc%, r%, c% '%为整型变量的缩写
Dim i%, j%
On Error Resume Next '产生错误时代码继续执行下一句
Set rng = Selection '当前选定区域设置为一个变量,注意不要在工作表里有筛选,因为数组方法在筛选后的工作表里可能出现错误
If rng.Parent.AutoFilterMode = True Then rng.Parent.AutoFilterMode = False '假如工作表有筛选就取消筛选
'rng为单元格,它的parent父项就是sheet1,由于代码在sheet1里,故Me也表示它,如下面的处理
With rng
r = .row '选定区域的最小行
c = .Column '选定区域的最小列
Mr = .Rows.Count '选定区域行的总数
Mc = .Columns.Count '选定区域列的总数
For i = r To r + Mr - 1 '在行里循环
For j = c To c + Mc - 1 '在列里循环
Cells(i, (c + Mc - 1) * 2 - j + 1).Value = Cells(i, j).Value
Next '(c + Mc - 1) * 2 - j + 1这里需要自己动脑筋想了,可以自己画一个对称图来理解
Next
End With '循环过程中行是不变的,列对称在变
End Sub
Private Sub CommandButton2_Click() '数组方法
Dim arr, arr1()
Dim Mr%, Mc%, r%, c%
Dim rng As Range
On Error Resume Next '产生错误时代码继续执行下一句
Set rng = Selection '当前选定区域设置为一个变量
If rng.Count = 1 Then rng.Offset(0, 1).Value = rng.Value: Exit Sub '由于数组不支持一个单元格的情况,故单独增加一个判断处理
If Me.AutoFilterMode = True Then Me.AutoFilterMode = False '假如工作表有筛选就取消筛选
With rng
r = .row '选定区域的最小行
c = .Column '选定区域的最小列
Mr = .Rows.Count '选定区域行的总数
Mc = .Columns.Count '选定区域列的总数
End With
arr = rng '把单元格赋值给数组arr,这时数组的值为arr(1 to Mr,1 to Mc)
ReDim arr1(1 To Mr, 1 To Mc)
For j = 1 To Mc '列的循环正好与原数组相反
For i = 1 To Mr '行的循环不变
arr1(i, Mc - j + 1) = arr(i, j) '如果j从1到6,则mc为6,即6-j+1=7-j,“Mc - j + 1”就是从6到1了
Next
Next
Cells(r, c + Mc).Resize(Mr, Mc) = arr1 '给单元格赋值
End Sub
|