鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: shadowmage

[已解决]@FishC,这次还是想要VBA代码

[复制链接]
发表于 2024-7-23 17:08:53 | 显示全部楼层
shadowmage 发表于 2024-07-23 17:08
还是没对“\”部分进行分割,需要修改代码


谢谢你的耐心,鱼油!看来我们需要显得更加聪明和灵活来对付这个“\”字符。要确保正确处理字符串分割,我们可以使用 `Split` 函数,并在替换之前先将所有的分隔符进行处理。让我们再次修改代码以确保一切正常工作。

以下是经过修改的VBA代码,它会同时对“\”和“,”进行分割,并将分割后的结果填入“展开表”中:

  1. Sub MacroForDataExpansion()
  2.     Dim wsExpand As Worksheet
  3.     Dim wsSource As Worksheet
  4.     Dim lastRow As Long
  5.     Dim i As Long
  6.     Dim j As Long
  7.     Dim arrData As Variant
  8.     Dim strTemp As String
  9.     Dim maxColumns As Long

  10.     ' 设置源工作表
  11.     Set wsSource = ThisWorkbook.Sheets("Sheet1")

  12.     ' 检查是否存在“展开表”
  13.     On Error Resume Next
  14.     Set wsExpand = ThisWorkbook.Sheets("展开表")
  15.     On Error GoTo 0

  16.     If Not wsExpand Is Nothing Then
  17.         ' 如果存在,清空内容
  18.         wsExpand.Cells.Clear
  19.     Else
  20.         ' 如果不存在,创建新工作表
  21.         Set wsExpand = ThisWorkbook.Sheets.Add
  22.         wsExpand.Name = "展开表"
  23.     End If

  24.     ' 复制A列和B列
  25.     wsSource.Range("A:A").Copy wsExpand.Range("A1")
  26.     wsSource.Range("B:B").Copy wsExpand.Range("B1")
  27.    
  28.     ' 找到最后一行
  29.     lastRow = wsSource.Cells(wsSource.Rows.Count, "C").End(xlUp).Row
  30.     maxColumns = 0

  31.     ' 处理C列数据
  32.     For i = 1 To lastRow
  33.         strTemp = wsSource.Cells(i, 3).Value
  34.         
  35.         ' 将“\”和“,”替换为空格,以便分割
  36.         strTemp = Replace(strTemp, "", " ") ' 替换“\”为空格
  37.         strTemp = Replace(strTemp, ",", " ")  ' 替换“,”为空格

  38.         ' 使用空格分割字符串
  39.         arrData = Split(strTemp, " ")
  40.         
  41.         Dim numSegments As Long
  42.         numSegments = UBound(arrData) + 1 ' 得到分割后数组的长度
  43.         
  44.         ' 更新最大列数
  45.         If numSegments > maxColumns Then maxColumns = numSegments
  46.         
  47.         ' 填充分割后的内容到“展开表”的C列及之后的单元格
  48.         For j = 0 To UBound(arrData)
  49.             If Trim(arrData(j)) <> "" Then ' 确保不填入空白
  50.                 wsExpand.Cells(i, 3 + j).Value = Trim(arrData(j)) ' 从C列开始填充
  51.             End If
  52.         Next j
  53.     Next i

  54.     ' 复制D列到J列的内容
  55.     For j = 4 To 10 ' D到J列
  56.         wsSource.Range(wsSource.Cells(1, j), wsSource.Cells(lastRow, j)).Copy wsExpand.Cells(1, maxColumns + 3)
  57.         maxColumns = maxColumns + 1 ' 更新最大列数
  58.     Next j

  59.     ' 调整列宽
  60.     wsExpand.Columns.AutoFit
  61. End Sub
复制代码


### 修改重点:
1. **替换分隔符**:将C列中的“\”和“,”替换为空格,然后用空格进行分割。这样能够有效处理所有分隔符。
2. **避免空白单元格**:添加了条件判断,确保不将空白值填入“展开表”。

请再次尝试运行这个版本的代码。如果还有问题,请随时告诉我,我们一定能一起解决它!谢谢您的支持与理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-23 17:10:51 | 显示全部楼层
FishC 发表于 2024-7-23 17:08
谢谢你的耐心,鱼油!看来我们需要显得更加聪明和灵活来对付这个“\”字符。要确保正确处理字符串分割 ...

代码依然没有分割“\”,只分割了“,”部分。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-23 17:11:11 | 显示全部楼层    本楼为最佳答案   
shadowmage 发表于 2024-07-23 17:10
代码依然没有分割“\”,只分割了“,”部分。


很抱歉之前的实现未能满足您的需求,现在我们将明确处理 `C` 列中的 `\` 和 `,` 分隔符。以下是修正后的代码,确保对这两个字符的处理:

  1. Sub MacroForDataExpansion()
  2.     Dim wsExpand As Worksheet
  3.     Dim wsSource As Worksheet
  4.     Dim lastRow As Long
  5.     Dim i As Long
  6.     Dim j As Long
  7.     Dim arrData As Variant
  8.     Dim strTemp As String
  9.     Dim maxColumns As Long
  10.     Dim regex As Object
  11.     Dim match As Object
  12.     Dim regexPattern As String

  13.     ' 设置源工作表
  14.     Set wsSource = ThisWorkbook.Sheets("Sheet1")

  15.     ' 检查是否存在“展开表”
  16.     On Error Resume Next
  17.     Set wsExpand = ThisWorkbook.Sheets("展开表")
  18.     On Error GoTo 0

  19.     If Not wsExpand Is Nothing Then
  20.         ' 如果存在,清空内容
  21.         wsExpand.Cells.Clear
  22.     Else
  23.         ' 如果不存在,创建新工作表
  24.         Set wsExpand = ThisWorkbook.Sheets.Add
  25.         wsExpand.Name = "展开表"
  26.     End If

  27.     ' 复制A列和B列
  28.     wsSource.Range("A:A").Copy wsExpand.Range("A1")
  29.     wsSource.Range("B:B").Copy wsExpand.Range("B1")

  30.     ' 找到最后一行
  31.     lastRow = wsSource.Cells(wsSource.Rows.Count, "C").End(xlUp).Row
  32.     maxColumns = 0

  33.     ' 初始化正则表达式
  34.     Set regex = CreateObject("VBScript.RegExp")
  35.     regex.Global = True

  36.     ' 处理C列数据
  37.     For i = 1 To lastRow
  38.         strTemp = wsSource.Cells(i, 3).Value
  39.         
  40.         ' 将“\”和“,”替换为“|”
  41.         strTemp = Replace(strTemp, "", "|")
  42.         strTemp = Replace(strTemp, ",", "|")
  43.         
  44.         ' 使用“|”分割字符串
  45.         arrData = Split(strTemp, "|")
  46.         
  47.         Dim numSegments As Long
  48.         numSegments = UBound(arrData) + 1 ' 得到分割后数组的长度
  49.         
  50.         ' 更新最大列数
  51.         If numSegments > maxColumns Then maxColumns = numSegments
  52.         
  53.         ' 填充分割后的内容到“展开表”的C列及之后的单元格
  54.         For j = 0 To UBound(arrData)
  55.             wsExpand.Cells(i, 3 + j).Value = Trim(arrData(j)) ' 从C列开始填充
  56.         Next j
  57.         
  58.         ' 使用正则表达式匹配形式为"\d+x\d+x\d+"的字符串
  59.         regexPattern = "\d+x\d+x\d+" ' 匹配模式
  60.         If regex.Test(strTemp) Then
  61.             Set match = regex.Execute(strTemp)
  62.             wsExpand.Cells(i, 3 + numSegments).Value = match(0) ' 在分割后的最后一列后添加匹配项
  63.         End If
  64.     Next i

  65.     ' 复制D列到J列的内容
  66.     For j = 4 To 10 ' D到J列
  67.         wsSource.Range(wsSource.Cells(1, j), wsSource.Cells(lastRow, j)).Copy wsExpand.Cells(1, maxColumns + 4)
  68.     Next j

  69.     ' 调整列宽
  70.     wsExpand.Columns.AutoFit
  71. End Sub
复制代码


### 更新说明:
1. **分隔符替换**:将 `\` 和 `,` 替换为 `|`,这样可以同时处理两个字符。
2. **分割逻辑**:使用 `Split` 函数根据 `|` 分割字符串,确保内容能正确拆分成若干段。
3. **正则表达式匹配**:会检查 `C` 列的内容是否匹配 `\d+x\d+x\d+` 模式,并将匹配项放在分割结果的最后一列后面。

请您再次尝试运行这个版本的代码,看看能否达到预期效果!如您还有其他问题,请随时告知,我们一起解决!谢谢您的理解与支持!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 05:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表