簡體   English   中英

如何使用VBA反轉所選Excel列的順序

[英]How to Reverse the Order of a Selected Range of Excel Columns using VBA

我是VBA的新手,我正試圖弄清楚如何在沒有硬編碼的情況下顛倒所選列范圍的順序。 我查看的每個示例要么硬編碼列以反轉順序,要么假設您要反轉工作表中的所有列。 我不是想讓別人為我寫這個,但這很簡單,只要有人解釋我錯過了什么,我就應該沒問題。

有人有建議嗎?

您可以使用sort來執行此操作。

使用此方法,您可以按照任何方式排列列。

如果您的數據如下所示:

    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

這段代碼水平翻轉整個范圍,一次一行是一種痛苦。 請享用

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

我相信你想做的事情看起來像這樣:

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中,然后將其復制/粘貼到與原始范圍相同的尺寸。 然后你可以剪切/粘貼值。

從這里翻轉或鏡像范圍

該宏將反轉一系列數據的順序。 您可以在單行或單列數據中翻轉數據(即,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

Selection.Columns(Selection.Columns.Count).Column - 為您提供結束列號
Selection.Columns(1).Column - 為您提供起始列號

你可以使用上面的方法進行反向循環。

使用相對單元格引用記錄宏,然后檢查代碼。 每當我感到懶得查找某些功能時,我就會這樣做(因為,讓我們面對現實,來自MS的文檔對於VBA而言越來越差)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM