一、需求描述
从目录列的第188行~199行与第1行~187行为两种不同格式,目录列的左邻列为用于间隔的列,该列也有自己的格式。在模块中写FormatSpecificColumn方法,实现所需的功能。

原代码有问题,发现目标列的左行没有识别出来


' 在 FormatModule 模块中
Public Sub FormatSpecificColumn(targetColumn As String)
Dim ws As Worksheet
Dim leftCol As String
Set ws = ThisWorkbook.ActiveSheet
On Error GoTo ErrorHandler
' 获取左邻列字母
If targetColumn = "A" Then
leftCol = "A"
Else
leftCol = Chr(Asc(targetColumn) - 1)
End If
Debug.Print "开始设置列格式..."
Debug.Print "目标列: " & targetColumn & ", 左邻列: " & leftCol
' 设置列宽
ws.Columns(targetColumn).ColumnWidth = 15.73
Debug.Print "目标列宽设置完成"
ws.Columns(leftCol).ColumnWidth = 2
Debug.Print "左邻列宽设置完成"
' 设置行高
ws.Rows("188:199").RowHeight = 25.5
Debug.Print "188-199行高设置完成"
ws.Rows("1:187").RowHeight = 5.9
Debug.Print "1-187行高设置完成"
' 跳过边框设置
Debug.Print "边框设置已跳过"
Debug.Print "列 " & targetColumn & " 和左邻列 " & leftCol & " 基础格式设置完成!"
Exit Sub
ErrorHandler:
Debug.Print "错误发生在: " & Erl
MsgBox "设置列格式时出错: " & Err.Description, vbCritical
End Sub
二、修复后
修复后可以实现例如:
"AY" → "AX" 、"B" → "A" 、"AA" → "Z"、 "A" → "A"的情况

' 在 FormatModule 模块中
Public Sub FormatSpecificColumn(targetColumn As String)
Dim ws As Worksheet
Dim leftCol As String
Set ws = ThisWorkbook.ActiveSheet
On Error GoTo ErrorHandler
' 正确获取左邻列字母
leftCol = GetPreviousColumn(targetColumn)
Debug.Print "开始设置列格式..."
Debug.Print "目标列: " & targetColumn & ", 左邻列: " & leftCol
' 设置列宽
ws.Columns(targetColumn).ColumnWidth = 15.73
Debug.Print "目标列宽设置完成"
ws.Columns(leftCol).ColumnWidth = 2
Debug.Print "左邻列宽设置完成"
' 设置行高
ws.Rows("188:199").RowHeight = 25.5
Debug.Print "188-199行高设置完成"
ws.Rows("1:187").RowHeight = 5.9
Debug.Print "1-187行高设置完成"
Debug.Print "列 " & targetColumn & " 和左邻列 " & leftCol & " 基础格式设置完成!"
Exit Sub
ErrorHandler:
Debug.Print "错误发生在: " & Erl
MsgBox "设置列格式时出错: " & Err.Description, vbCritical
End Sub
' 正确的左邻列计算函数
Private Function GetPreviousColumn(colLetter As String) As String
Dim colNumber As Long
Dim result As String
' 将列字母转换为列号
colNumber = ColumnLetterToNumber(colLetter)
' 计算前一列(如果是A列则返回A)
If colNumber > 1 Then
colNumber = colNumber - 1
End If
' 将列号转换回字母
GetPreviousColumn = ColumnNumberToLetter(colNumber)
End Function
' 列字母转列号(支持多字母列)
Private Function ColumnLetterToNumber(colLetter As String) As Long
Dim i As Long
ColumnLetterToNumber = 0
colLetter = UCase(colLetter)
For i = 1 To Len(colLetter)
ColumnLetterToNumber = ColumnLetterToNumber * 26 + (Asc(Mid(colLetter, i, 1)) - 64)
Next i
End Function
' 列号转列字母(支持多字母列)
Private Function ColumnNumberToLetter(colNumber As Long) As String
Dim result As String
If colNumber <= 26 Then
' 单字母列 (A-Z)
result = Chr(64 + colNumber)
Else
' 多字母列 (AA-ZZ, AAA-XFD等)
Dim firstPart As Long
Dim secondPart As Long
firstPart = (colNumber - 1) \ 26
secondPart = (colNumber - 1) Mod 26 + 1
result = ColumnNumberToLetter(firstPart) & Chr(64 + secondPart)
End If
ColumnNumberToLetter = result
End Function
其他:
1).HorizontalAlignment 和 .VerticalAlignment 是 Range 对象的直接属性,不需要再用 With 语句嵌套。
2)辅助函数
GetPreviousColumnLetter:获取前一列字母
GetColumnNumber:列字母转列号
GetColumnLetter:列号转列字母
ApplyBordersToColumns:专业边框设置
ApplySimpleBorders:简化边框设置
3)主要居中属性: .
HorizontalAlignment = xlCenter - 水平居中
.VerticalAlignment = xlCenter - 垂直居中
其他选项:xlLeft(左对齐)、xlRight(右对齐)、xlTop(顶端对齐)、xlBottom(底端对齐)