如果大家看了我上一篇文章,相信大家应该都已经学会录制宏了,这一次,我跟大家继续分享关于VBA的一些常用的知识点。
使用VBA进行【列转行】
通过截图我们先看一下我们要做的工作是什么

我在实际工作中遇到了这种列转行的情况,当然,不通过VBA,通过EXCEL本身的菜单操作也可以完成,我主要是想讲用VBA来如何实现这个功能。
代码如下:
Public Sub 班级列转行循环()
Dim startCol, endCol As Integer
Dim i_col_1, i_col_2 As Integer
Dim wk, desc_wk As Worksheet
Dim i_row As Long
Dim desc_i_row As Long
Dim is_have As Boolean
Set wk = Application.ActiveWorkbook.Worksheets("Sheet1")
Set desc_wk = Application.ActiveWorkbook.Worksheets("Sheet2")
startCol = 1 '需要从第几列开始转
endCol = 5 '到第几列结束
is_have = False
desc_i_row = 1
For i_row = 1 To 3
If desc_i_row < i_row Then
desc_i_row = i_row
End If
For i_col_1 = startCol To endCol
If Len(wk.Cells(i_row, i_col_1)) > 0 Then
is_have = True
Exit For
End If
Next i_col_1
If is_have = False Then
i_col_2 = startCol - 1
While i_col_2 >= 1
desc_wk.Cells(desc_i_row, i_col_2) = wk.Cells(i_row, i_col_2)
i_col_2 = i_col_2 - 1
Wend
Else
For i_col_1 = startCol To endCol
If Len(wk.Cells(i_row, i_col_1)) > 0 Then
i_col_2 = startCol - 1
While i_col_2 >= 1
desc_wk.Cells(desc_i_row, i_col_2) = wk.Cells(i_row, i_col_2)
i_col_2 = i_col_2 - 1
Wend
desc_wk.Cells(desc_i_row, startCol) = wk.Cells(i_row, i_col_1)
desc_i_row = desc_i_row + 1
End If
Next i_col_1
End If
Next i_row
MsgBox "转换完成"
End Sub
我对部分代码做一下简单的讲解:
代码中有2个变量我添加了注释,通过startCol和endCol来控制需要转换的列的起始和结束位置。
Set wk = Application.ActiveWorkbook.Worksheets("班级列转行源数据")
Set desc_wk = Application.ActiveWorkbook.Worksheets("班级列转行")
这2行代码主要是用来获取需要进行数据转换的Sheet,把转换后的内容输出到新的Sheet中。
desc_i_row = 1 这个是用来控制把转换后的内容输出到新的Sheet时候,从第几行开始,1:代表是从新的Sheet的第一行开始输出。
For i_row = 1 To 3 这是一个循环,i_row是用来控制到底有多少行数据需要转换。通过截图我们也能看到,我需要转换的数据是从第1行开始,共3行需要转换。
For i_col_1 = startCol To endCol 这是循环列。
这里是为了工作方便,很多数值都直接写死到了代码中,大家可以根据自己的需要进行修改,也可以通过InputBox函数或者其他方式来进行动态获取。
5110



被折叠的 条评论
为什么被折叠?



