【问题标题】:Invert/reverse columns that don't have a set range using a command button使用命令按钮反转/反转没有设定范围的列
【发布时间】:2022-01-08 04:29:33
【问题描述】:

我知道已经有人问过这个问题,但我似乎无法让我找到的东西对我有用。

我只想将所有从 A 列开始并从第 2 行到 J 列的数据取出到数据的末尾,然后颠倒顺序(反转数据)

我偶然发现了下面的代码,但它冻结了,我不想做出选择。

Private Sub CommandButton2_Click()

    Dim vTop As Variant
    Dim vEnd As Variant
    Dim iStart As Integer
    Dim iEnd As Integer

    Application.ScreenUpdating = False
    iStart = 1
    iEnd = Selection.Columns.Count

    Do While iStart < iEnd
        vTop = Selection.Columns(iStart)
        vEnd = Selection.Columns(iEnd)
        Selection.Columns(iEnd) = vTop
        Selection.Columns(iStart) = vEnd
        iStart = iStart + 1
        iEnd = iEnd - 1
    Loop
    Application.ScreenUpdating = True

End Sub

为了清楚起见,我想让最后一行成为第一行,最后一行成为第一行。这是一个连续的数据块。 干杯

before after

【问题讨论】:

    标签: excel vba reverse


    【解决方案1】:

    另一个版本的代码 - 看看这是否有效。

    Private Sub CommandButton2_Click()
    
    Dim v(), i As Long, j As Long, r As Range
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    With Range("A1").CurrentRegion
        Set r = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    ReDim v(1 To r.Rows.Count, 1 To r.Columns.Count)
    
    For i = 1 To r.Rows.Count
        For j = 1 To r.Columns.Count
            v(i, j) = r(r.Rows.Count - i + 1, j)
        Next j
    Next i
    
    r = v
    
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      下面的代码将每列中的数据复制到第 20 列 - 当前列索引,并在 For 循环结束时删除位于 A:J 列中的原始数据。

      Option Explicit
      
      Private Sub CommandButton2_Click()
      
      Dim LastRow As Long
      Dim Col As Long
      Dim ColStart As Long, ColEnd As Long
      
      Application.ScreenUpdating = False
      
      ' Column A
      ColStart = 1
      ' Column J
      ColEnd = 10 ' Selection.Columns.Count
      
      ' modify "Sheet1" to your sheet's name
      With Sheets("Sheet1")
          For Col = ColStart To ColEnd
              ' find last row with data for current column
              LastRow = .Cells(.Rows.Count, Col).End(xlUp).Row
      
              ' copy in reverse order to column 20 to 11
              ' copy current column to column 20-current column index
              .Range(Cells(2, Col), Cells(LastRow, Col)).Copy .Range(Cells(2, 20 - Col), Cells(LastRow, 20 - Col))
          Next Col
      End With
      
      ' delete original data in column A:J
      With Sheets("Sheet1")
          .Columns("A:J").EntireColumn.Delete
      End With
      
      Application.ScreenUpdating = True
      
      End Sub
      

      【讨论】:

      • 我想将反转的数据保留在同一列中。当我尝试更改代码的“复制”行以反映这一点时,我收到了一个错误
      【解决方案3】:

      像这样?这假设来自 A2(当前区域)的连续数据块,因此如果有更多数据,则将超出 J,但可能会受到限制

      Private Sub CommandButton2_Click()
      
      Dim v, i As Long, r As Range
      
      Application.ScreenUpdating = False
      
      With Range("A1").CurrentRegion
          Set r = .Offset(1).Resize(.Rows.Count - 1)
      End With
      
      v = r
      
      For i = 1 To r.Rows.Count
          r.Rows(i).Cells = Application.Index(v, r.Rows.Count - i + 1, 0)
      Next i
      
      Application.ScreenUpdating = True
      
      End Sub
      

      【讨论】:

      • 这会破坏数据所在的列,并且不会反转它们。我需要最后一行成为第一行。第一行是最后一行
      • 已在上面编辑。不清楚这就是您所追求的,因为您的原始代码仅反转了列。
      • 出了点问题。这删除了数据,然后复制了一些数据以复制同一行。抱歉,一开始还不清楚。
      • 我在一个样本上进行了测试,它似乎可以工作。您能否发布您想要的屏幕截图并澄清您想要的结果?更改此行会将结果放在.Cells.Offset(.Rows.Count + 1) = v 下方
      • 我在帖子底部添加了两个链接,以显示运行它时会发生什么。它还会翻转第一行,我想保持不变
      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2020-03-11
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多