根据数组中值的顺序排列列 - 按钮消失

时间:2017-07-27 22:56:07

标签: excel vba excel-vba button

我有这个代码在一个列中查找(在XFD1的另一个工作表上)并根据该列中的值创建一个数组。然后它在当前工作表上的一行中一次搜索一个值。当找到匹配项时,它会剪切列并将其插入与数组中值的顺序对应的位置。

我没有收到任何编译错误。我在工作表上放了一个按钮(不是ActiveX)并用它来执行代码。这就是我所看到的:

  1. 似乎没有任何事情发生。列根本不会移动。
  2. 计算机显然是在思考"因为旋转的声音正在旋转。
  3. 这是神秘的部分 - 按钮消失了!它永远不会回来。我在工作表上放了几个按钮并尝试了所有按钮。按钮每次都会消失。
  4. 我真的需要让这个工作。我想要的是将列重新排序为与我在另一张表上的列表相同的顺序(列表中的95个项目)。我认为这段代码可以做到,但我似乎已经进入了暮光之城,事情并不像他们看起来那样(至少从我的角度来看)!

    这是:

    Sub Reorder_Columns()
        Dim arrColumnOrder(1 To 95) As String
        Dim index As Integer
        Dim Found As range
        Dim tick As Integer
    
            For index = 1 To 95
                arrColumnOrder(index) = UserFormDropDownDataSheet.range("XFD1")
            Next index
    
        Application.ScreenUpdating = False
        tick = 1
            For index = LBound(arrColumnOrder) To UBound(arrColumnOrder)
               Set Found = Rows("1:1").Find(arrColumnOrder(index), LookIn:=xlValues, LookAt:=xlWhole, _
               SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
                   If Not Found Is Nothing Then
                       If Found.column <> tick Then
                       Found.EntireColumn.Cut
                       Columns(tick).Insert Shift:=xlToRight
                       Application.CutCopyMode = False
                       End If
                   tick = tick + 1
                   End If
            Next index
    
        Application.ScreenUpdating = True
    End Sub
    

1 个答案:

答案 0 :(得分:0)

关于我的原始代码有什么问题的答案是:

首先,我试图设置数组的大小,但应该使用动态数组,因为我希望我的数组列中的数据会增加,因为我在我尝试排序的工作表中添加了更多列。因此,Dim arrColumnOrder(1 To 95) As String应该是Dim arrColumnOrder As Variant

然后我尝试用

迭代我的数组
    For index = 1 To 95
        arrColumnOrder(index) = UserFormDropDownDataSheet.range("XFD1")
    Next index

当然这都是错的。我用

替换了它
arrColumnOrder = UserFormDropDownDataSheet.range("XFD1:XFD95").Value

然后,在

       Set Found = Rows("1:1").Find(arrColumnOrder(index), LookIn:=xlValues, LookAt:=xlWhole, _
       SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)

应该是&#34; ... Find (arrColumnOrder(index, 1) ...&#34;

按钮移动原因的答案是我没有设置按钮的格式选项(右键单击按钮,格式控制&gt;属性&gt;选择&#34;不要移动或使用单元格调整大小。 &#34;)所以当事情发生变化时(奇怪的是因为我的代码全部错误)当复制并粘贴列时,按钮随单元格一起移动。

这是我的最终代码,它可以正常运行并完成预期的操作。也就是说,它根据范围&#34; XFD1:XFD95&#34;中的数据创建一个数组。 (在我以正确顺序存储列标题的单独工作表上),然后它对活动工作表中的列进行排序以匹配数组的顺序。我不想显式调用工作表名称,因为它将在不同的工作表上运行。使用Find而不是Match,对我来说效果很好,因为这不是我处理的大量数据,因此速度不是问题。

Sub Reorder_Columns()
    Dim arrColumnOrder As Variant
    Dim index As Interger
    Dim Found As range
    Dim tick As Integer

    arrColumnOrder = UserFormDropDownDataSheet.range("XFD1:XFD95").Value
    Application.ScreenUpdating = False
    tick = 1
        For index = LBound(arrColumnOrder) To UBound(arrColumnOrder)
           Set Found = Rows("1:1").Find(arrColumnOrder(index, 1), LookIn:=xlValues, LookAt:=xlWhole, _
           SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
               If Not Found Is Nothing Then
                   If Found.column <> tick Then
                   Found.EntireColumn.Cut
                   Columns(tick).Insert Shift:=xlToRight
                   Application.CutCopyMode = False
                   End If
               tick = tick + 1
               End If
        Next index
    Application.ScreenUpdating = True
End Sub

对我来说,这里的一个重要教训是,当我只睡了两个小时时,不要尝试编写代码!我真的很累,犯了愚蠢的错误,因为我没有想清楚。我度过了一个美好的夜晚,然后今天早上我很容易就能看到我出错了。