我是VBA的新手,我正试图弄清楚如何在没有硬编码的情况下颠倒所选列范围的顺序。我查看的每个示例要么硬编码列以反转顺序,要么假设您要反转工作表中的所有列。我不是想让别人为我写这个,但这很简单,只要有人解释我所缺少的东西,我就应该没事。
有人有任何建议吗?
答案 0 :(得分:12)
您可以使用排序来执行此操作。
使用此方法,您可以按照任何方式排列列。
如果您的数据如下所示:
A B C
1 header1 header2 header3
2 dataA dataE dataI
3 dataB dataF dataJ
4 dataC dataG dataK
5 dataD dataH dataL
在第一行添加一些数字:
A B C
1 1 2 3
2 header1 header2 header3
3 dataA dataE dataI
4 dataB dataF dataJ
5 dataC dataG dataK
6 dataD dataH dataL
然后使用sort,没有标题行,然后选择选项从左到右排序而不是从上到下排序。
按行1排序,降序:
A B C
1 3 2 1
2 header3 header2 header1
3 dataI dataE dataA
4 dataJ dataF dataB
5 dataK dataG dataC
6 dataL dataH dataD
如果您想编写此脚本,请使用按行排序而不是列的选项。
我在这里写了一个.vbs:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/f6085342-a1ae-49d8-acfc-38368256ee42?lc=1033
答案 1 :(得分:1)
这段代码水平翻转整个范围,一次一行是痛苦的。享受
Sub FlipHorizontal()
On Error GoTo EndMacro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set Rng = Selection
rw = Selection.Rows.Count
cl = Selection.Columns.Count
If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then
MsgBox "You May Not Select An Entire Row", vbExclamation, _
"Flip Selection"
Exit Sub
End If
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then
MsgBox "You May Not Select An Entire Column", vbExclamation, _
"Flip Selection"
Exit Sub
End If
ReDim Arr(rw, cl)
For cc = 1 To cl ' = Rng.Columns.Count
For rr = 1 To rw 'rr = Rng.Rows.Count
Arr(rr, cc) = Rng.Cells(rr, cc) '.Formula
a = Arr(rr, cc)
Next
Next
'copy arry to range flippingnhorizontal
cc = cl
For a = 1 To cl ' to loop the columns
For rr = 1 To rw 'rr = Rng.Rows.Count
Rng.Cells(rr, cc) = Arr(rr, a) '= .Formula
Next
cc = cc - 1
Next
EndMacro:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
答案 2 :(得分:0)
从此处:Flipping Or Mirroring A Range:
此宏将反转一系列数据的顺序。您可以在单行或单列数据中翻转数据(即,N乘1阵列或1乘N阵列)。您可能无法选择整行或整列。
Public Sub FlipSelection()
Dim Arr() As Variant
Dim Rng As Range
Dim C As Range
Dim Rw As Long
Dim Cl As Long
On Error GoTo EndMacro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set Rng = Selection
Rw = Selection.Rows.Count
Cl = Selection.Columns.Count
If Rw > 1 And Cl > 1 Then
MsgBox "Selection May Include Only 1 Row or 1 Column", _
vbExclamation, "Flip Selection"
Exit Sub
End If
If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then
MsgBox "You May Not Select An Entire Row", vbExclamation, _
"Flip Selection"
Exit Sub
End If
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then
MsgBox "You May Not Select An Entire Column", vbExclamation, _
"Flip Selection"
Exit Sub
End If
If Rw > 1 Then
ReDim Arr(Rw)
Else
ReDim Arr(Cl)
End If
Rw = 0
For Each C In Rng
Arr(Rw) = C.Formula
Rw = Rw + 1
Next C
Rw = Rw - 1
For Each C In Rng
C.Formula = Arr(Rw)
Rw = Rw - 1
Next C
EndMacro:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
答案 3 :(得分:0)
Selection.Columns(Selection.Columns.Count).Column
- 为您提供结束列号
Selection.Columns(1).Column
- 为您提供起始列号
你可以使用上面的方法进行反向循环。
答案 4 :(得分:0)
使用相对单元格引用记录宏,然后检查代码。每当我感到懒得查找某些功能时,我会这样做(因为,让我们面对现实,来自MS的文档对于VBA而言越来越差)。
答案 5 :(得分:0)
我相信你想做的事情看起来像这样:
A1 B1 C1 D1 E1 | E1 D1 C1 B1 A1
A2 B2 C2 D2 E2 | E2 D2 C2 B2 A2
如果您正在尝试这样做,请尝试此工作表功能:
= INDEX($ A $ 1:$ B $ 5中,ROW(A1),6- COLUMN(A1))
其中6是1 +您想要反转的范围中的列数。可能有更好的方法来做这个部分,但我在这里很简单。
将该功能放入单元格F1并将其复制/粘贴到与原始范围相同的尺寸。然后你可以剪切/粘贴值。