ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 我尝试了下让ChatGPT为我写了一段VBA跨工作簿匹配的代码,大家看下

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-21 17:20 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
17:05
我:给我写一段如何跨Excel工作簿实现快速数据匹配的VBA代码

17:05
ChatGPT:以下是一个简单的VBA代码示例,用于跨Excel工作簿进行快速数据匹配。本示例假设你有两个工作簿:一个名为“数据源.xlsx”的工作簿,另一个名为“匹配结果.xlsx”的工作簿。我们将在这两个工作簿之间比较一列数据,并将匹配结果记录在“匹配结果.xlsx”工作簿的新列中。

```
Sub 数据匹配()
Dim wb1 As Workbook, wb2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim lastRow1 As Long, lastRow2 As Long
Dim i As Long, j As Long

Set wb1 = Workbooks("数据源.xlsx")
Set wb2 = Workbooks("匹配结果.xlsx")
Set ws1 = wb1.Worksheets("Sheet1")
Set ws2 = wb2.Worksheets("Sheet1")

lastRow1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row
lastRow2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row

'遍历数据源.xlsx的Range("A1:A"&lastRow1),查找与匹配结果.xlsx的Range("A1:A"&lastRow2)匹配的值
For i = 1 To lastRow1
    For j = 1 To lastRow2
        If ws1.Range("A" & i) = ws2.Range("A" & j) Then
            '如果匹配成功,则在匹配结果.xlsx的B列中记录该值
            ws2.Range("B" & j) = ws1.Range("A" & i)
            Exit For
        End If
    Next j
Next i

MsgBox "数据匹配完成!"
End Sub
```

请注意,上述代码仅适用于在同一计算机上打开的工作簿。如果你要在不同的计算机上运行代码,则需要使用其他方法来引用工作簿和工作表。

17:05

我:你上面这个代码运行效率会非常低下,请把VBA的数组、字典这些工具和手段用起来,优化代码,提升运行效率

17:05
ChatGPT:好的,以下是经过优化后的VBA代码:

```
Sub DataMatch()
    Dim dict As Object ' 创建字典对象
    Set dict = CreateObject("Scripting.Dictionary")

    Dim dataArr As Variant ' 声明数据数组
    Dim matchArr As Variant ' 声明匹配数组

    ' 获取第一个工作簿中的数据范围
    With Workbooks("Workbook1.xlsx").Sheets("Sheet1")
        dataArr = .Range("A1").CurrentRegion.Value2 ' 将数据存入数组
        For i = 2 To UBound(dataArr, 1) ' 遍历数据
            If Not dict.exists(dataArr(i, 1)) Then ' 如果字典中没有该值,添加到字典
                dict.Add dataArr(i, 1), dataArr(i, 2)
            End If
        Next i
    End With

    ' 获取第二个工作簿中的数据范围
    With Workbooks("Workbook2.xlsx").Sheets("Sheet1")
        matchArr = .Range("A1").CurrentRegion.Value2 ' 将匹配数据存入数组
        For i = 2 To UBound(matchArr, 1) ' 遍历匹配数据
            If dict.exists(matchArr(i, 1)) Then ' 如果字典中存在该值,将对应的值写入匹配数据所在行的第二列
                .Cells(i, 2).Value2 = dict.Item(matchArr(i, 1))
            End If
        Next i
    End With
End Sub
```

这段代码使用了VBA的字典对象来存储数据,避免了每次都要遍历整个数据集合的问题。同时,通过将数据存储在数组中,也避免了反复访问工作表的开销,提高了代码的运行效率。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-21 17:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
问:请根据一列类别、两列数据,如何生成一个蝴蝶图或旋风图的VBA代码?
答:生成蝴蝶图或旋风图,可以使用VBA代码创建一个散点图,并设置其大小、位置、颜色等属性。下面是一个简单的示例代码:

```vb
Sub CreateButterflyChart()

    Dim cht As Chart
    Set cht = ActiveSheet.Shapes.AddChart2(240, xlXYScatter).Chart
   
    With cht
        ' 设置图表标题
        .HasTitle = True
        .ChartTitle.Text = "蝴蝶图/旋风图"
        
        ' 隐藏图例
        .HasLegend = False
        
        ' 设置数据源
        .SetSourceData Source:=Range("A1:C10")
        
        ' 设置X轴和Y轴范围
        With .Axes(xlValue, xlPrimary)
            .MinimumScale = 0
            .MaximumScale = Application.WorksheetFunction.Max(Range("B1:B10").Value, Range("C1:C10").Value) * 1.1
        End With
        
        ' 添加两个序列
        .SeriesCollection.NewSeries
        .SeriesCollection.NewSeries
        
        ' 第一个序列为红色圆形
        With .SeriesCollection(1)
            .Name = "Series1"
            .MarkerStyle = xlMarkerStyleCircle
            .MarkerBackgroundColorIndex = 3
            .MarkerForegroundColorIndex = 3
            .Format.Line.Visible = msoFalse
            .Values = Range("B1:B10")
            .XValues = Range("A1:A10")
        End With
        
        ' 第二个序列为蓝色正方形
        With .SeriesCollection(2)
            .Name = "Series2"
            .MarkerStyle = xlMarkerStyleSquare
            .MarkerBackgroundColorIndex = 5
            .MarkerForegroundColorIndex = 5
            .Format.Line.Visible = msoFalse
            .Values = Range("C1:C10")
            .XValues = Range("A1:A10")
        End With
        
        ' 调整两个序列的大小和间距
        Dim i As Integer
        For i = 1 To 2
            With .SeriesCollection(i)
                .MarkerSize = 8
                .GapWidth = 0
                .Overlap = -100
            End With
        Next i
        
        ' 调整图表的大小和位置
        .Parent.Height = 300
        .Parent.Width = 400
        .Parent.Top = 50
        .Parent.Left = 50
    End With

End Sub
```

其中,`Range("A1:C10")`表示数据源区域,包括类别列和两列数据列;`.Axes(xlValue, xlPrimary)`表示Y轴(值轴);`.SeriesCollection.NewSeries`表示添加一个新的序列。通过调整序列的大小和间距,可以实现蝴蝶图或旋风图的效果。

我尝试着运行了下,除了有两行出错我注释掉了之外,竟然运行成功了,效果如附图,实际是散点图,可能AI还没能理解什么是蝴蝶图或旋风图,不过已经可以用其来作数据对比啦
2023-03-21_173115.png

TA的精华主题

TA的得分主题

发表于 2023-11-23 16:55 | 显示全部楼层
可否分享一下,如何将ChatGPT集成到excel里?

TA的精华主题

TA的得分主题

发表于 2023-11-23 19:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lcluck2002 发表于 2023-11-23 16:55
可否分享一下,如何将ChatGPT集成到excel里?

我想,是问完,把答案复制到模块里的,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 18:57 , Processed in 0.036467 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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