Excel VBA 进阶:库存管理中的自定义排序

B站影视 内地电影 2025-09-04 22:11 2

摘要:请各位老师帮忙,表格B列按照顺序排序,谢谢!1、B列要求按数字顺序排列,如:1-1、1-2、1-3、1-4、2-1、2-2、2-3、2-4、3-1、3-2、3-3、3-4。2、房间号(要求是按数字顺序排列,如:8513房、8514房、8515房、8516房)。

请各位老师帮忙,表格B列按照顺序排序,谢谢!

1、B列要求按数字顺序排列,如:1-1、1-2、1-3、1-4、2-1、2-2、2-3、2-4、3-1、3-2、3-3、3-4。
2、房间号(要求是按数字顺序排列,如:8513房、8514房、8515房、8516房)。
3、A仓***(要求是A仓后面按数字顺序排列,如:A仓1-1、A仓1-2、A仓1-3)。
4、A仓(要求汇总为一项)。

我们需要对Excel工作表的B列进行排序,该列包含多种不同格式的文本,排序需遵循以下特定规则:

数字-数字格式: 如 1-1, 1-2, 16-1。首先按第一个数字升序,再按第二个数字升序。房间号格式: 如 8513房, 8514房。按房间数字升序排列。仓位格式: 如 A仓1-1, A仓1-2。首先按仓位前缀(如“A仓”)排序,然后按后续的数字对升序排列。空值处理: B列中的空单元格应自动排到所有有效数据的末尾。优先级: 以上三种格式有固定的优先级顺序:数字-数字 > 房间号 > 仓位。

要实现这种非标准的排序,最佳方案是创建一个“排序辅助列”。其核心思路如下:

创建排序键 (Sort Key): 编写一个VBA函数 GetSortKey,它能读取B列每个单元格的值,并根据上述规则将其转换为一个标准化的、可供字母顺序比较的“排序键”字符串。生成辅助列: 宏在工作表上临时找一个空白列,遍历B列所有数据,调用 GetSortKey 函数为每一行生成对应的排序键,并填入这个临时列。执行标准排序: 利用Excel内置的排序功能,对整个数据区域(包括B列和辅助列)进行排序,但排序的依据是这个新生成的“辅助列”。清理现场: 排序完成后,将临时创建的辅助列整列删除,恢复工作表的原始状态。

这种方法的巧妙之处在于,它将复杂的比较逻辑封装在 GetSortKey 函数中,而将排序操作本身交还给Excel高效的内置排序引擎,兼顾了灵活性与性能。

以下是实现上述功能的完整VBA代码。您可以将其粘贴到Excel的VBA模块中使用。

' 主排序过程Sub CustomSortColumnBDim ws As WorksheetDim lastRow As LongDim tempCol As Long' 设置当前活动的工作表Set ws = ActiveSheet' 找到B列数据区域的最后一行lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).RowIf lastRow 0 And IsNumeric(Split(val, "-")(0)) Thenparts = Split(val, "-")If UBound(parts) = 1 And IsNumeric(parts(0)) And IsNumeric(parts(1)) Thennum1 = Format(CLng(parts(0)), "00000")num2 = Format(CLng(parts(1)), "00000")GetSortKey = "01_" & num1 & "_" & num2ElseGetSortKey = "04_" & valEnd If' 规则 2: 房间号 (e.g., 8513房)ElseIf Right(val, 1) = "房" And IsNumeric(Left(val, Len(val) - 1)) Thennum1 = Format(CLng(Left(val, Len(val) - 1)), "00000")GetSortKey = "02_" & num1' 规则 3: A仓 (e.g., A仓1-3)ElseIf InStr(val, "仓") > 0 And InStr(val, "-") > 0 ThenDim prefix As String, numbersPart As Stringprefix = Left(val, InStr(val, "仓"))numbersPart = Mid(val, InStr(val, "仓") + 1)parts = Split(numbersPart, "-")If UBound(parts) = 1 And IsNumeric(parts(0)) And IsNumeric(parts(1)) Thennum1 = Format(CLng(parts(0)), "00000")num2 = Format(CLng(parts(1)), "00000")GetSortKey = "03_" & prefix & "_" & num1 & "_" & num2ElseGetSortKey = "04_" & valEnd If' 其他无法识别的格式,统一归类排在后面ElseGetSortKey = "04_" & valEnd IfEnd Function场景1:按员工工号排序
假设工号格式为“部门-序列号”(如 HR-001, IT-102),可以修改 GetSortKey 函数,将部门(HR, IT)和序列号(001, 102)作为排序键,实现先按部门、再按工号的排序。场景2:按产品版本号排序
对于 v1.2.1, v1.10.0 这样的版本号,标准文本排序会出错(v1.10.0 会排在 v1.2.1 前面)。可以修改 GetSortKey,将版本号拆分为主、次、修订号,并统一格式化(如 01_02_01 和 01_10_00),确保数字部分的正确比较。场景3:按中文混合日期排序
处理像“甲子年三月初五”、“2024年春节”这样的文本时,可以编写更复杂的 GetSortKey 函数,将其统一转换为标准的 YYYY-MM-DD 格式作为排序键,从而实现按时间顺序的精确排序。

来源:终南藏

相关推荐