Sub FormatData Dim wb As Workbook Dim ws As Worksheet Dim lastRow As Long Dim i As Long j As Long Dim currentValue As String nextValue As String Dim productName As String Dim pack
Sub FormatData() ' 定义变量 Dim wb As Workbook ' 工作簿 Dim ws As Worksheet ' 工作表 Dim lastRow As Long ' 最后一行 Dim i As Long, j As Long ' 循环变量 Dim currentValue As String, nextValue As String ' 当前值和下一个值 Dim productName As String ' 产品名称 Dim packageCount As Integer ' 包数
' 设置工作簿和工作表
Set wb = ThisWorkbook ' 当前工作簿
Set ws = wb.Worksheets(1) ' 第一个工作表
' 获取最后一行
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 遍历数据
For i = 8 To lastRow
' 获取当前值和下一个值
currentValue = ws.Range("C" & i).Value
nextValue = ws.Range("C" & i + 1).Value
' 判断是否需要插入空白行
If Not IsEmpty(nextValue) And Left(currentValue, 7) <> Left(nextValue, 7) Then
' 插入两行空白行
ws.Rows(i + 1 & ":" & i + 2).Insert Shift:=xlDown
' 合并第一行单元格并设置行高
ws.Range("A" & i & ":Q" & i).Merge
ws.Range("A" & i).RowHeight = 30
' 复制第5行格式到第二行
ws.Rows(i + 1).Copy
ws.Rows(i + 2).PasteSpecial Paste:=xlPasteFormats
' 提取工作簿名并生成产品名称
productName = Left(wb.Name, Len(wb.Name) - 14) ' 去掉“板件明细表.xls”
productName = Split(productName, "_")(0)
productName = productName & "-" & Split(currentValue, "-")(2) & " " & productName & "第" & Split(currentValue, "-")(3) & "包(圆方)(黑身)"
' 判断产品名称中的包数
packageCount = Split(currentValue, "-")(2)
' 填入对应的数值
ws.Range("A" & i).Value = productName
ws.Range("B" & i + 1 & ":B" & i + 2).Value = Split(currentValue, "-")(0) & "-" & Split(currentValue, "-")(1) & " " & productName
ws.Range("K" & i + 2).Value = packageCount & " 包"
' 更新索引
lastRow = lastRow + 2
i = i + 2
End If
Next i
End Sub
逐句解释代码:
Sub FormatData() ' 定义一个名为FormatData的子过程 ' 定义变量 Dim wb As Workbook ' 声明一个Workbook类型的变量,表示工作簿 Dim ws As Worksheet ' 声明一个Worksheet类型的变量,表示工作表 Dim lastRow As Long ' 声明一个Long类型的变量,表示最后一行的行号 Dim i As Long, j As Long ' 声明两个Long类型的变量,用于循环 Dim currentValue As String, nextValue As String ' 声明两个String类型的变量,表示当前值和下一个值 Dim productName As String ' 声明一个String类型的变量,表示产品名称 Dim packageCount As Integer ' 声明一个Integer类型的变量,表示包数
' 设置工作簿和工作表
Set wb = ThisWorkbook ' 将当前工作簿赋值给变量wb
Set ws = wb.Worksheets(1) ' 将第一个工作表赋值给变量ws
' 获取最后一行
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' 获取C列最后一个非空单元格所在行的行号
' 遍历数据
For i = 8 To lastRow ' 从第8行开始遍历到最后一行
' 获取当前值和下一个值
currentValue = ws.Range("C" & i).Value ' 获取C列第i行的值
nextValue = ws.Range("C" & i + 1).Value ' 获取C列第i+1行的值
' 判断是否需要插入空白行
If Not IsEmpty(nextValue) And Left(currentValue, 7) <> Left(nextValue, 7) Then ' 如果下一个值非空且当前值的前7个字符与下一个值的前7个字符不相同,则需要插入空白行
' 插入两行空白行
ws.Rows(i + 1 & ":" & i + 2).Insert Shift:=xlDown ' 在第i+1行和第i+2行之间插入两行空白行
' 合并第一行单元格并设置行高
ws.Range("A" & i & ":Q" & i).Merge ' 合并A列到Q列的第i行的单元格
ws.Range("A" & i).RowHeight = 30 ' 设置第i行的行高为30
' 复制第5行格式到第二行
ws.Rows(i + 1).Copy ' 复制第i+1行的格式
ws.Rows(i + 2).PasteSpecial Paste:=xlPasteFormats ' 粘贴格式到第i+2行
' 提取工作簿名并生成产品名称
productName = Left(wb.Name, Len(wb.Name) - 14) ' 提取工作簿名,并去掉后缀"板件明细表.xls"
productName = Split(productName, "_")(0) ' 以"_"分割工作簿名的第一部分作为产品名称的一部分
productName = productName & "-" & Split(currentValue, "-")(2) & " " & productName & "第" & Split(currentValue, "-")(3) & "包(圆方)(黑身)" ' 将产品名称的其他部分拼接成完整的产品名称
' 判断产品名称中的包数
packageCount = Split(currentValue, "-")(2) ' 以"-"分割当前值,取第三部分作为包数
' 填入对应的数值
ws.Range("A" & i).Value = productName ' 将产品名称填入A列第i行的单元格
ws.Range("B" & i + 1 & ":B" & i + 2).Value = Split(currentValue, "-")(0) & "-" & Split(currentValue, "-")(1) & " " & productName ' 将当前值的前两部分和产品名称拼接后填入B列第i+1行和第i+2行的单元格
ws.Range("K" & i + 2).Value = packageCount & " 包" ' 将包数填入K列第i+2行的单元格
' 更新索引
lastRow = lastRow + 2 ' 更新最后一行的行号
i = i + 2 ' 更新循环变量i的值
End If
Next i ' 进入下一次循环
End Sub ' 结束子过
原文地址: https://www.cveoy.top/t/topic/hLb9 著作权归作者所有。请勿转载和采集!