ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1455|回复: 17

[求助] 最火的AI写的代码,请大神改错

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-16 23:38 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用AI写的代码,作用是根据当前列的内容拆分工作表为多个单独文件。具体如下:

  1. Sub SplitSheetByColumn()
  2.     '获取当前选定区域所在的列号
  3.     Dim categoryCol As Integer
  4.     categoryCol = Selection.Column
  5.    
  6.     '获取数据范围
  7.     Dim lastRow As Long
  8.     lastRow = Cells(Rows.Count, categoryCol).End(xlUp).Row
  9.     Dim dataRange As Range
  10.     Set dataRange = Range(Cells(1, 1), Cells(lastRow, Columns.Count).End(xlToLeft))
  11.    
  12.     '创建字典对象并遍历数据范围
  13.     Dim categoryDict As Object
  14.     Set categoryDict = CreateObject("Scripting.Dictionary")
  15.     categoryDict.CompareMode = vbTextCompare
  16.    
  17.     Dim cell As Range
  18.     For Each cell In dataRange.Columns(categoryCol)
  19. <font color="#ff0000">        If Not categoryDict.Exists(cell.Value) Then</font>
  20.             categoryDict.Add cell.Value, cell.Row
  21.         End If
  22.     Next cell
  23.    
  24.     '创建新工作簿并拆分数据
  25.     Dim wb As Object
  26.     Set wb = CreateObject("Excel.Application").Workbooks.Add
  27.    
  28.     Dim category As Variant
  29.     For Each category In categoryDict.Keys
  30.         Dim newSheet As Object
  31.         Set newSheet = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
  32.         newSheet.Name = category
  33.         
  34.         Dim startIndex As Long
  35.         startIndex = categoryDict.Item(category)
  36.         Dim endIndex As Long
  37.         If categoryDict.Exists(categoryDict.Keys()(categoryDict.Keys().IndexOf(category) + 1)) Then
  38.             endIndex = categoryDict.Item(categoryDict.Keys()(categoryDict.Keys().IndexOf(category) + 1)) - 1
  39.         Else
  40.             endIndex = lastRow
  41.         End If
  42.         
  43.         dataRange.Rows(startIndex & ":" & endIndex).Copy newSheet.Range("A1")
  44.     Next category
  45.    
  46.     '保存并关闭新工作簿
  47.     Dim fileName As String
  48.     fileName = ThisWorkbook.Path & "" & "拆分结果.xlsx"
  49.     wb.SaveAs fileName
  50.     wb.Close SaveChanges:=False
  51.    
  52.     '清除对象引用
  53.     Set wb = Nothing
  54.     Set categoryDict = Nothing
  55.    
  56.     '显示消息框
  57.     MsgBox "已成功拆分为多个工作簿并保存到" & fileName, vbInformation
  58. End Sub
复制代码
出现问题的是:If Not categoryDict.Exists(cell.Value) Then 这句,提示错误代码5。
请教各位大神指点一下不太聪明的AI

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-16 23:39 | 显示全部楼层
不知道是不是字典定义那出现问题导致的

TA的精华主题

TA的得分主题

发表于 2023-5-17 00:14 | 显示全部楼层
·遁去的一· 发表于 2023-5-16 23:39
不知道是不是字典定义那出现问题导致的

您的问题可能是:Scripting.Dictionary 在此计算机上没有启用。您可以尝试添加 Microsoft Scripting Runtime 引用。
Sub SplitSheetByColumn()
    '获取当前选定区域所在的列号
    Dim categoryCol As Integer
    categoryCol = Selection.Column
   
    '获取数据范围
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, categoryCol).End(xlUp).Row
    Dim dataRange As Range
    Set dataRange = Range(Cells(1, 1), Cells(lastRow, Columns.Count).End(xlToLeft))
   
    '创建字典对象并遍历数据范围
    Dim categoryDict As Scripting.Dictionary '修改1:用Scripting.Dictionary替换Object类型
    Set categoryDict = New Scripting.Dictionary '修改2:使用New关键字创建对象
    categoryDict.CompareMode = vbTextCompare
   
    Dim cell As Range
    For Each cell In dataRange.Columns(categoryCol)
        If Not categoryDict.Exists(cell.Value) Then
            categoryDict.Add cell.Value, cell.Row
        End If
    Next cell
   
    '创建新工作簿并拆分数据
    Dim wb As Workbook '修改3:用Workbook代替Object类型
    Set wb = Workbooks.Add
   
    Dim category As Variant
    For Each category In categoryDict.Keys
        Dim newSheet As Worksheet '修改4:用Worksheet代替Object类型
        Set newSheet = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
        newSheet.Name = category
        
        Dim startIndex As Long
        startIndex = categoryDict.Item(category)
        Dim endIndex As Long
        If categoryDict.Exists(categoryDict.Keys()(categoryDict.Keys().IndexOf(category) + 1)) Then
            endIndex = categoryDict.Item(categoryDict.Keys()(categoryDict.Keys().IndexOf(category) + 1)) - 1
        Else
            endIndex = lastRow
        End If
        
        dataRange.Rows(startIndex & ":" & endIndex).Copy newSheet.Range("A1")
    Next category
   
    '保存并关闭新工作簿
    Dim fileName As String
    fileName = ThisWorkbook.Path & "" & "拆分结果.xlsx"
    wb.SaveAs fileName
    wb.Close SaveChanges:=False
   
    '清除对象引用
    Set wb = Nothing
    Set categoryDict = Nothing
   
    '显示消息框
    MsgBox "已成功拆分为多个工作簿并保存到" & fileName, vbInformation
End Sub
注意:您需要将本代码中的可选行号31-32之间的引号删除。这些引号是用于Markdown代码主题的格式化。

TA的精华主题

TA的得分主题

发表于 2023-5-17 07:59 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
佳能lT搬砖着 发表于 2023-5-17 00:14
您的问题可能是:Scripting.Dictionary 在此计算机上没有启用。您可以尝试添加 Microsoft Scripting Runt ...

   Set categoryDict = CreateObject("Scripting.Dictionary")
如果是mac机器,这行就报错了,建议楼主上传附件方便大家沟通

TA的精华主题

TA的得分主题

发表于 2023-5-17 09:18 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-17 14:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
佳能lT搬砖着 发表于 2023-5-17 00:14
您的问题可能是:Scripting.Dictionary 在此计算机上没有启用。您可以尝试添加 Microsoft Scripting Runt ...

已引用,也试过楼主的这种方式,结果还是一样的

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-17 14:28 | 显示全部楼层
zpy2 发表于 2023-5-17 07:59
Set categoryDict = CreateObject("Scripting.Dictionary")
如果是mac机器,这行就报错了,建议楼主 ...

这是ChatGPT自动生成的通用代码,放入任何文件的模块里就可以用了,没必要上传吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-17 14:30 | 显示全部楼层
WANT-T 发表于 2023-5-17 09:18
谁写的找谁帮你改,这是规矩

规矩我知道啊,但ChatGpt有点傻啊,改了无数次都没解决

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-17 15:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个 是可以运行的代码,还是AI改的,需要的
  1.     Dim ws As Worksheet
  2.     Dim data As Variant
  3.     Dim uniqueValues As Object
  4.     Dim currentColumn As Range
  5.     Dim currentValue As Variant
  6.     Dim NewWorkbook As Workbook
  7.     Dim newWorksheet As Worksheet
  8.     Dim FileName As String
  9.     Dim i As Long, j As Long
  10.     Dim rowCount As Long, colCount As Long
  11.    
  12.     ' 设置要拆分的表格工作表
  13.     Set ws = ThisWorkbook.Worksheets("Sheet1") ' 修改为你的工作表名称
  14.    
  15.     ' 获取当前列
  16.     Set currentColumn = Selection
  17.    
  18.     ' 获取数据范围
  19.     rowCount = ws.Cells(ws.Rows.Count, currentColumn.Column).End(xlUp).Row ' 获取行数
  20.     colCount = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' 获取列数
  21.     data = ws.Range(ws.Cells(1, 1), ws.Cells(rowCount, colCount)).Value ' 将数据加载到数组
  22.    
  23.     ' 创建字典来存储唯一值
  24.     Set uniqueValues = CreateObject("Scripting.Dictionary")
  25.    
  26.     ' 遍历列中的每个单元格,将唯一值添加到字典中
  27.     For i = 1 To rowCount
  28.         uniqueValues(data(i, currentColumn.Column)) = 1
  29.     Next i
  30.    
  31.     ' 循环遍历唯一值
  32.     For Each currentValue In uniqueValues.keys
  33.         ' 创建一个新的工作簿并复制原始工作表
  34.         Set NewWorkbook = Workbooks.Add
  35.         Set newWorksheet = NewWorkbook.Sheets(1)
  36.         newWorksheet.Name = "Sheet1"
  37.         
  38.         ' 复制标题行及格式
  39.         ws.Rows(1).Copy Destination:=newWorksheet.Rows(1)
  40.         
  41.         ' 复制符合当前唯一值的行及格式
  42.         j = 2 ' 从第二行开始复制数据
  43.         For i = 1 To rowCount
  44.             If data(i, currentColumn.Column) = currentValue Then
  45.                 ws.Rows(i).Copy Destination:=newWorksheet.Rows(j)
  46.                 j = j + 1
  47.             End If
  48.         Next i
  49.         
  50.         ' 保存新工作簿并关闭
  51.         FileName = "Split_" & currentValue & ".xlsx" ' 设置文件名
  52.         NewWorkbook.SaveAs FileName
  53.         NewWorkbook.Close SaveChanges:=False
  54.     Next currentValue
  55.    
  56.     ' 提示完成信息
  57.     MsgBox "拆分完成!"
  58. End Sub
复制代码

拿去吧

TA的精华主题

TA的得分主题

发表于 2023-5-17 20:37 | 显示全部楼层
·遁去的一· 发表于 2023-5-17 14:28
这是ChatGPT自动生成的通用代码,放入任何文件的模块里就可以用了,没必要上传吧

這裡倒多了一個..給GPT改錯的用處~~
上傳附件及規則...保證大家都重寫!!!

左看右看...這代碼並不通用~~~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 08:47 , Processed in 0.041173 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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