Vba 按宏排序的Excel 2010工作簿工作表
我的(日记账分录模板)工作簿包含50多张工作表。 模板布局允许快速上传到会计软件,减少输入时间。 但每个月所需的期刊类型各不相同。 表中有具体的名称,如“奖金”、“应计电费”、“销售额”等。 第一张纸名为“指令”,有一个宏,按实际顺序在a列第1行到第50行列出书中的每张纸。 所需: 要在B列第1行到第50行中输入我想要的数字顺序,例如 当前订单为:本月指令1想要:1 销售2 4 奖金3 2 应计电费4 3 所需宏功能:查看B列中的数字,并按该顺序对工作表进行排序 这将使我不必每次需要特定的工作表时都扫描所有工作表。 同样,如果我以后需要查看管理报告的每张表Vba 按宏排序的Excel 2010工作簿工作表,vba,excel,Vba,Excel,我的(日记账分录模板)工作簿包含50多张工作表。 模板布局允许快速上传到会计软件,减少输入时间。 但每个月所需的期刊类型各不相同。 表中有具体的名称,如“奖金”、“应计电费”、“销售额”等。 第一张纸名为“指令”,有一个宏,按实际顺序在a列第1行到第50行列出书中的每张纸。 所需: 要在B列第1行到第50行中输入我想要的数字顺序,例如 当前订单为:本月指令1想要:1 销售2 4 奖金3 2 应计电费4 3 所需宏功能:查看B列中的数字,并按该顺序对工作表进行排序 这将使我不必每次需要特定的工作表
非常感谢以下人员将阅读“说明”工作表上的A列和B列,然后根据您在B列中输入的数字对工作表重新排序(假设A列中的名称正确)
Option Explicit
Public Sub ReorderWorksheets()
Dim numberOfSheets
Dim sheetTargetPositions() As Variant
Dim n As Long
numberOfSheets = 50
ReDim sheetTargetPositions(1 To 2, 1 To numberOfSheets)
For n = 1 To numberOfSheets
sheetTargetPositions(2, n) = ThisWorkbook.Worksheets("Instruction").Cells(n, 1).Value
sheetTargetPositions(1, n) = ThisWorkbook.Worksheets("Instruction").Cells(n, 2)
Next n
Call QuickSort2(sheetTargetPositions, 1, 1)
For n = 1 To numberOfSheets
If n = 1 Then
Call ThisWorkbook.Worksheets(sheetTargetPositions(2, n)).Move(, ThisWorkbook.Worksheets("Instruction"))
Else
Call ThisWorkbook.Worksheets(sheetTargetPositions(2, n)).Move(, ThisWorkbook.Worksheets(sheetTargetPositions(2, n - 1)))
End If
Next n
ThisWorkbook.Worksheets("Instruction").Activate
End Sub
Public Sub QuickSort2(ByRef pvarArray As Variant, plngDim As Long, plngCol As Long, Optional ByVal plngLeft As Long, Optional ByVal plngRight As Long)
Dim lngFirst As Long
Dim lngLast As Long
Dim varMid As Variant
Dim varSwap As Variant
Dim c As Long
Dim cMin As Long
Dim cMax As Long
cMin = LBound(pvarArray, plngDim)
cMax = UBound(pvarArray, plngDim)
Select Case plngDim
Case 1
If plngRight = 0 Then
plngLeft = LBound(pvarArray, 2)
plngRight = UBound(pvarArray, 2)
End If
lngFirst = plngLeft
lngLast = plngRight
varMid = pvarArray(plngCol, (plngLeft + plngRight) \ 2)
Do
Do While pvarArray(plngCol, lngFirst) < varMid And lngFirst < plngRight
lngFirst = lngFirst + 1
Loop
Do While varMid < pvarArray(plngCol, lngLast) And lngLast > plngLeft
lngLast = lngLast - 1
Loop
If lngFirst <= lngLast Then
For c = cMin To cMax
varSwap = pvarArray(c, lngFirst)
pvarArray(c, lngFirst) = pvarArray(c, lngLast)
pvarArray(c, lngLast) = varSwap
Next
lngFirst = lngFirst + 1
lngLast = lngLast - 1
End If
Loop Until lngFirst > lngLast
If plngLeft < lngLast Then QuickSort2 pvarArray, plngDim, plngCol, plngLeft, lngLast
If lngFirst < plngRight Then QuickSort2 pvarArray, plngDim, plngCol, lngFirst, plngRight
Case 2
If plngRight = 0 Then
plngLeft = LBound(pvarArray, 1)
plngRight = UBound(pvarArray, 1)
End If
lngFirst = plngLeft
lngLast = plngRight
varMid = pvarArray((plngLeft + plngRight) \ 2, plngCol)
Do
Do While pvarArray(lngFirst, plngCol) < varMid And lngFirst < plngRight
lngFirst = lngFirst + 1
Loop
Do While varMid < pvarArray(lngLast, plngCol) And lngLast > plngLeft
lngLast = lngLast - 1
Loop
If lngFirst <= lngLast Then
For c = cMin To cMax
varSwap = pvarArray(lngFirst, c)
pvarArray(lngFirst, c) = pvarArray(lngLast, c)
pvarArray(lngLast, c) = varSwap
Next
lngFirst = lngFirst + 1
lngLast = lngLast - 1
End If
Loop Until lngFirst > lngLast
If plngLeft < lngLast Then QuickSort2 pvarArray, plngDim, plngCol, plngLeft, lngLast
If lngFirst < plngRight Then QuickSort2 pvarArray, plngDim, plngCol, lngFirst, plngRight
End Select
End Sub
选项显式
公共子工作表()
模糊号码表
尺寸表TargetPositions()作为变型
长
张数=50张
ReDim表目标位置(1到2,1到张数)
对于n=1到数量页
sheetTargetPositions(2,n)=此工作簿。工作表(“说明”)。单元格(n,1)。值
sheetTargetPositions(1,n)=此工作簿。工作表(“说明”)。单元格(n,2)
下一个
调用QuickSort2(sheetTargetPositions,1,1)
对于n=1到数量页
如果n=1,则
调用此工作簿。工作表(sheetTargetPositions(2,n))。移动(,此工作簿。工作表(“说明”))
其他的
调用此工作簿。工作表(sheetTargetPositions(2,n))。移动(,ThisWorkbook。工作表(sheetTargetPositions(2,n-1)))
如果结束
下一个
此工作簿。工作表(“说明”)。激活
端接头
公共子QuickSort2(ByRef pvarArray作为变型,plngDim作为长型,plngCol作为长型,可选ByVal plngLeft作为长型,可选ByVal plngRight作为长型)
暗淡的lngFirst尽可能长
昏暗的玻璃像长的一样
Dim varMid作为变体
作为变体的Dim varSwap
尺寸c与长度相同
暗cMin尽可能长
变暗cMax为长
cMin=LBound(pvarArray,plngDim)
cMax=UBound(pvarArray,plngDim)
选择案例plngDim
案例1
如果plngRight=0,则
plngLeft=LBound(pvarArray,2)
plngRight=UBound(pvarArray,2)
如果结束
lngFirst=plngLeft
lngLast=plngRight
varMid=pvarArray(plngCol,(plngLeft+plngRight)\2
做
当pvarray(plngCol,lngFirst)plngLeft
lngLast=lngLast-1
环
如果lngFirst lngLast
如果plngLeftplngLeft
lngLast=lngLast-1
环
如果lngFirst lngLast
如果plngLeft
这很容易做到,如果您使用谷歌搜索
查找它,您会很快找到答案。如果您根本不了解vba,那么很容易学会,而且使用起来也很有趣。我建议