ID Date Code Price
9202188 04/11/2014 212015 29,47
212026 30,5
9202190 03/11/2014 813012 99,47
814027 60,5
我在 Excel 文件中有这些数据(作为示例)。每行都以 ID 号开头,可以有多个与之关联的代码。(我从一个旧网站获取了这些数据,大致是这种格式)。
因此,在这个例子中,ID 9202188 有 2 个代码,1 个日期有 2 个价格,可以说这是一个分组商品。
我现在试图让 Excel 在整个组周围添加一个外边框,如下所示:
ID Date Code Price
______________________________________
|9202188 04/11/2014 212015 29,47|
|_______________________212026___30,5_|
|9202190 03/11/2014 813012 99,47|
|_______________________814027___60,5_|
这可以自动处理 200 组项目列表(每组至少包含 2 行或更多行,但始终只有 1 个 ID 号)吗?
然后,我还需要能够按 ID 对组进行排序,同时将行保持在一起,但这是另一个问题。
答案1
这个宏应该可以让你得到你想要的边界。
Sub wrap_border()
Dim r As Long, br As Long, lColumns_Wide As Long, lColumn_With_Solid_Data As Long
lColumns_Wide = 17
lColumn_With_Solid_Data = 16
With ActiveSheet
For r = 2 To .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
If CBool(Len(.Cells(r, 1).Value)) Then
If CBool(Len(.Cells(r + 1, 1).Value)) Then
br = r
ElseIf CBool(Application.CountA(.Cells(r + 1, 1).Resize(Rows.Count - r, 1))) Then
br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
br = Application.Evaluate("MIN(INDEX(ROW(" & (r + 1) & ":" & br & ")+NOT(LEN(A" & (r + 1) & ":A" & br & "))*1E+99,,))")
Else
br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row + 1
End If
.Cells(r, 1).Resize(br - r, lColumns_Wide).BorderAround ColorIndex:=13, Weight:=xlThick
End If
Next r
End With
End Sub
在您的工作表上运行它之后,您可以期待类似以下的结果。
修改边框样式的参数.BorderAround
可以在以下位置找到Range.BorderAround 方法。请记住,您可以使用Color:=
或,ColorIndex:=
但不能同时使用。我发现ColorIndex
只要您可以使用有限的调色板,使用起来就更容易了。这里有一个 ColorIndex 表可供选择。
至于排序,您必须填写 A 列中的空白单元格,或使用帮助列向右移动以协助保持价值观一致。
修改:我添加了额外的功能,以便可以设置边框区域的宽度。这要求还识别其中一列没有空白单元格。请参阅修订后的代码中的第 2 行和第 3 行。
答案2
这是使用条件格式的部分解决方案
=NOT(ISBLANK(B2))
=ISBLANK(B2)