我有这个代码在一个列中查找(在XFD1的另一个工作表上)并根据该列中的值创建一个数组。然后它在当前工作表上的一行中一次搜索一个值。当找到匹配项时,它会剪切列并将其插入与数组中值的顺序对应的位置。
我没有收到任何编译错误。我在工作表上放了一个按钮(不是ActiveX)并用它来执行代码。这就是我所看到的:
我真的需要让这个工作。我想要的是将列重新排序为与我在另一张表上的列表相同的顺序(列表中的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
答案 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
对我来说,这里的一个重要教训是,当我只睡了两个小时时,不要尝试编写代码!我真的很累,犯了愚蠢的错误,因为我没有想清楚。我度过了一个美好的夜晚,然后今天早上我很容易就能看到我出错了。