Vba 按宏排序的Excel 2010工作簿工作表

Vba 按宏排序的Excel 2010工作簿工作表,vba,excel,Vba,Excel,我的(日记账分录模板)工作簿包含50多张工作表。 模板布局允许快速上传到会计软件,减少输入时间。 但每个月所需的期刊类型各不相同。 表中有具体的名称,如“奖金”、“应计电费”、“销售额”等。 第一张纸名为“指令”,有一个宏,按实际顺序在a列第1行到第50行列出书中的每张纸。 所需: 要在B列第1行到第50行中输入我想要的数字顺序,例如 当前订单为:本月指令1想要:1 销售2 4 奖金3 2 应计电费4 3 所需宏功能:查看B列中的数字,并按该顺序对工作表进行排序 这将使我不必每次需要特定的工作表

我的(日记账分录模板)工作簿包含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,那么很容易学会,而且使用起来也很有趣。我建议