ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 初学编写宏代码:请教如何提升宏代码运行速度?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-21 23:01 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
初学编写宏代码:想从《数据库》读取D列编号的不规律数据,遇数据较多时,以下代码运行速度很慢,请教大神如何优化?


Sub dj()
    Application.ScreenUpdating = False
   
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim dataRange As Range
    Dim sourceData As Variant
    Dim i As Long
    Dim j As Long
   
    Set ws1 = Sheet1
    Set ws2 = Sheet2
   
    lastRow1 = ws1.Cells(ws1.Rows.Count, 4).End(xlUp).Row
    lastRow2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
   
   
    Set dataRange = ws2.Range("A1:AW" & lastRow2)
    sourceData = dataRange.Value
   
    For i = 4 To lastRow1
        For j = 2 To lastRow2
            
            If ws1.Cells(i, 4).Value = sourceData(j, 1) Then
               
                With ws1.Rows(i)
                    .Cells(1).Value = i - 6 + 1
                    .Cells(2).Value = sourceData(j, 2)
                    .Cells(3).Value = sourceData(j, 4)
                    .Cells(6).Value = sourceData(j, 5)
                    .Cells(7).Value = sourceData(j, 8)
                    .Cells(8).Value = sourceData(j, 9)
                    .Cells(9).Value = sourceData(j, 12)
                    .Cells(10).Value = sourceData(j, 13)
                    .Cells(11).Value = sourceData(j, 21)
                    .Cells(12).Value = sourceData(j, 23)
                    .Cells(13).Value = sourceData(j, 26)
                    .Cells(14).Value = sourceData(j, 45)
                End With
                Exit For
            End If
        Next j
    Next i
   

    Application.ScreenUpdating = True
End Sub


新建文件夹.rar

1.74 MB, 下载次数: 20

TA的精华主题

TA的得分主题

发表于 2024-3-22 07:10 | 显示全部楼层
双重循环,数据多就会慢,使用ADO SQL提速

  1. Option Explicit

  2. Sub SqlQuery()
  3.     Dim conn As Object, rst As Object, strSQL$, i&, PathStr$, sht As Worksheet
  4.     Set conn = CreateObject("ADODB.Connection")
  5.     Set rst = CreateObject("ADODB.Recordset")
  6.     PathStr = ThisWorkbook.FullName
  7.     Select Case Application.Version * 1
  8.     Case Is <= 11
  9.         conn.Open "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & PathStr & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=0'"
  10.     Case Is >= 12
  11.         conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & PathStr & ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=0'"
  12.     End Select
  13.     Dim dataRng As Range
  14.     With Sheets("汇总").Range("A5").CurrentRegion
  15.         Set dataRng = Sheets("汇总").Range("A5", .Cells(.Cells.Count))
  16.     End With
  17.     strSQL = "SELECT a.序号,b.故障描述,b.故障类型,b.工单号,a.[F5],b.工单来源,b.工单状态,b.客户名称,b.联系电话,b.联系地址,b.报修时间,b.指派时间,b.回执时间,b.维修完成图片 from [汇总$" & dataRng.Address(0, 0) & "] as a left outer join [数据库$] as b on a.工单号=b.工单号 order by a.序号"
  18.     rst.Open strSQL, conn, 1, 1
  19.     Sheets("汇总").Range("a6").CopyFromRecordset rst
  20.     rst.Close:    conn.Close:    Set conn = Nothing:    Set rst = Nothing
  21. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-22 07:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-22 07:55 | 显示全部楼层
还可以:1、数组双循环
2,表2工单号:字典(工单号)=j

TA的精华主题

TA的得分主题

发表于 2024-3-22 08:23 | 显示全部楼层
Sub dj()
Application.ScreenUpdating = False
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r As Long
Dim rs As Long
Dim ar As Variant, br As Variant
Dim i As Long
Dim s As Long
Set ws1 = Sheet1
Set ws2 = Sheet2
r = ws1.Cells(ws1.Rows.Count, 4).End(xlUp).Row
rs = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
ar = ws2.Range("a1:aw" & rs)
br = ws1.Range("a5:n" & r)
For i = 2 To UBound(br)
    For s = 2 To UBound(ar)
        If br(i, 4) = ar(s, 1) Then
            br(i, 1) = i - 1
            br(i, 2) = ar(s, 2)
            br(i, 3) = ar(s, 4)
            br(i, 6) = ar(s, 5)
            br(i, 7) = ar(s, 8)
            br(i, 8) = ar(s, 9)
            br(i, 9) = ar(s, 12)
            br(i, 10) = ar(s, 13)
            br(i, 11) = ar(s, 21)
            br(i, 12) = ar(s, 23)
            br(i, 13) = ar(s, 26)
            br(i, 14) = ar(s, 45)
            Exit For
        End If
    Next s
Next i
ws1.Range("a5:n" & r) = br
Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-22 08:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
读取数据.rar (1.74 MB, 下载次数: 6)

TA的精华主题

TA的得分主题

发表于 2024-3-22 09:09 | 显示全部楼层
用数组啊,你直接对单元格操作,数据一多,速度肯定下来了。

TA的精华主题

TA的得分主题

发表于 2024-3-22 09:40 | 显示全部楼层
本帖最后由 xbox1210 于 2024-3-22 11:04 编辑

参与一下。

读取数据.7z

766.44 KB, 下载次数: 7

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-22 09:45 | 显示全部楼层
楼主的代码明显是AI写的。

用字典+数组新写一个,速度应该快很多了。

读取数据2.7z

791.1 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-22 09:46 | 显示全部楼层
参与一下。。。
  1. Sub ykcbf()  '//2024.3.22
  2.     Set d = CreateObject("Scripting.Dictionary")
  3.     Set d1 = CreateObject("Scripting.Dictionary")
  4.     b = [{2,3,6,7,8,9,10,11,12,13,14}]
  5.     With Sheets("汇总")
  6.         c = .UsedRange.Columns.Count
  7.         brr = .[a5].Resize(1, c)
  8.     End With
  9.     For j = 2 To UBound(brr, 2)
  10.         s = brr(1, j)
  11.         If s <> Empty Then d1(s) = j
  12.     Next
  13.     With Sheets("数据库")
  14.         r = .Cells(Rows.Count, 1).End(3).Row
  15.         c = .UsedRange.Columns.Count
  16.         arr = .[a1].Resize(r, c)
  17.     End With
  18.     For i = 2 To UBound(arr)
  19.         s = arr(i, 1)
  20.         d(s) = i
  21.     Next
  22.     On Error Resume Next
  23.     With Sheets("汇总")
  24.         r = .Cells(Rows.Count, 1).End(3).Row
  25.         c = .UsedRange.Columns.Count
  26.         brr = .[a1].Resize(r, c)
  27.         For i = 6 To UBound(brr)
  28.             s = brr(i, 4)
  29.             If d.exists(s) Then
  30.                 For j = 2 To UBound(b)
  31.                     brr(i, b(j)) = arr(d(s), d1(brr(5, j)))
  32.                 Next
  33.             End If
  34.         Next
  35.         .[a1].Resize(r, c) = brr
  36.     End With
  37.     MsgBox "OK!"
  38. End Sub
复制代码


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 01:31 , Processed in 0.044053 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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