ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求大神VBA解决30万条数据的超难问题

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2018-8-30 11:20
Sub test() 'by kagawa 2018/8/30
   
    tms = Timer '计时开始

感谢,之前出差了,回公司才看贴,抱歉!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 09:42 | 显示全部楼层

感谢,之前出差了,回公司才看贴,抱歉!!我再看看,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 12:01 | 显示全部楼层


大侠,一量数据高于10万行,就出现以下错误

几万条记录都没问题,但记录数超过十万条就出错

求助






3333.PNG

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 13:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
顶起DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

TA的精华主题

TA的得分主题

发表于 2018-9-3 13:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
andyleeq 发表于 2018-9-3 12:01
大侠,一量数据高于10万行,就出现以下错误

几万条记录都没问题,但记录数超过十万条就出错

工作表名有没有改动过? Sheet1???

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:13 | 显示全部楼层

谢谢,两位大侠的回复,其中,试了一下,ISdongjh大侠的SQL方法,成功!,做成模版了,

但做了一些修改,解决了行数多于65000行的报错问题。

就是SQL取值时,不指定行数

【strSQL = "SELECT 单号 " & _
                    "FROM [" & strShName & "$]" & _】




我是野路子,虽然能用,还是希望请大侠指正一下


【1】附上文件

连单查询模版2.rar (280.12 KB, 下载次数: 7)

【2】附上修改后的文件界面

11111.PNG





【3】附上代码:
————————————————
Function Test(strStyleID As String)
    Dim shSource As Worksheet, strShName As String
    Dim lngRows As Long, arr As Variant, strFindID As String
    Dim Conn As Object, Rst As Object, strPath As String
    Dim strConn As String, strSQL As String
    Dim rg As Range
    Dim lngSumSala As Long '销量
    Dim lngCountSala As Long '销售单数
    Dim lngSameSala As Long '同单数
    Dim arrResult(1 To 1, 1 To 4) As Variant

    Dim myt
    myt = Timer




    strShName = "Sheet1" '工作表名
    Set shSource = Sheets(strShName) 'shSoure 成为工作表
    Set rg = shSource.Range("H2")   'rg 成为目标款号的所在的单元格

    lngRows = shSource.Range("A" & Rows.Count).End(xlUp).Row 'lngRows 数据源A列行数

    Set Conn = CreateObject("ADODB.Connection") '以打开的数据EXCEL表为源,建立外部数据连接
    Set Rst = CreateObject("ADODB.Recordset")
    strPath = ThisWorkbook.FullName
    Select Case Application.Version * 1
        Case Is <= 11
            strConn = "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & strPath
        Case Is >= 12
            strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=YES"";"""
    End Select

    'MsgBox SRCONN

    Conn.Open strConn

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '统计单数情况
    strSQL = "SELECT 单号 " & _
                    "FROM [" & strShName & "$]" & _
                    "WHERE 款号 = '" & strStyleID & "' " & _
                    "GROUP BY 款号, 单号"
    'MsgBox strSQL

    Rst.Open strSQL, Conn, 3, 1
    '如果有单号,则将单号写入查询 变量
    lngCountSala = Rst.RecordCount                                    '将查询款号的总单数写入lngCountSala
    If lngCountSala > 0 Then
        arr = Rst.getrows  '查询结果写入数组arr
        arr = Application.WorksheetFunction.Index(arr, 1, 0)          '将ARR第一行用index方式写入ARR? 为什么要这句
        strFindID = "'" & Join(arr, "','") & "'"                      '将ARR写入strFindID,成"单号1,单号2,...",作下面统行单号的条件
        Rst.Close
    Else
        '没有单号,退出
        Set Rst = Nothing
        Set Conn = Nothing
        Exit Function
    End If


    'MsgBox "1~~" & (Timer - myt)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '统计销量
    strSQL = "SELECT Sum([数量]) AS  合计 " & _
                    "FROM [" & strShName & "$]" & _
                    "WHERE  款号='" & strStyleID & "';"
    If Rst.State = 1 Then Rst.Close
    Rst.Open strSQL, Conn, 3, 1
    lngSumSala = Rst.Fields("合计")                                   '将查询款号的销售总量写入 lngSumSala
    Rst.Close


    'MsgBox "2~~" & (Timer - myt)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '统计同单数
    strSQL = "SELECT 单号, Count(款号) AS 款号之计数 " & _
                    "FROM (SELECT 单号, 款号 " & _
                    "FROM [" & strShName & "$]" & _
                    "WHERE (单号) In (" & strFindID & ")  " & _
                    "GROUP BY 单号, 款号)  " & _
                    "GROUP BY 单号 " & _
                    "HAVING  Count(款号) >1 ;"
    If Rst.State = 1 Then Rst.Close
    Rst.Open strSQL, Conn, 3, 1
    lngSameSala = Rst.RecordCount                                   '将查询款号的同单数写入 lngSameSala
    '如果有同单号,则将单号写入查询 变量
    If lngSameSala > 0 Then
        arr = Rst.getrows
        arr = Application.WorksheetFunction.Index(arr, 1, 0)     '将ARR第一行用index方式写入ARR,只要单号
        strFindID = "'" & Join(arr, "','") & "'"                 '将ARR写入strFindID,成"单号1,单号2,...",作下面统行单号的条件
        Rst.Close
    Else
        '没有单号,退出
        Set Rst = Nothing
        Set Conn = Nothing
        Exit Function
    End If

    'MsgBox "3~~" & (Timer - myt)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    arrResult(1, 1) = lngSumSala                                              '将目标款号销售总数写入数组arrResult的第1列
    arrResult(1, 2) = lngCountSala                                           '将目标款号总单数写入数组arrResult的第2列
    arrResult(1, 3) = lngSameSala                                           '将目标款号同款单数写入数组arrResult的第3列
    arrResult(1, 4) = Round((lngSameSala / lngCountSala) * 100, 2) & "%"    '将目标款号连带率写入数组arrResult的第2列

    shSource.Range("I2").Resize(1, 4) = arrResult                          '将数组写入汇总单元格
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '统计同单款号情况
    strSQL = "SELECT  [款号],Count([单号]) AS 计数, (round((Count([单号])/" & lngCountSala & ")*100,2 ) & '%' ) AS 同单率 " & _
                "FROM (SELECT 单号, 款号 " & _
                "FROM [" & strShName & "$] " & _
                "WHERE  单号 In (" & strFindID & ") And 款号<>'" & strStyleID & "' " & _
                "GROUP BY 单号, 款号) " & _
                "GROUP BY [款号] " & _
                "ORDER BY Count([单号]) DESC;"
    If Rst.State = 1 Then Rst.Close
    Rst.Open strSQL, Conn, 3, 1

    MsgBox "4~~" & (Timer - myt)

    'MsgBox Rows.Count & "-" & rg.Row


    'rg.Resize(Rows.Count - rg.Row, 3).ClearContents   ''将目标款号所在单元素的第二行起写入查询结果

    Range("H5:J105").ClearContents

    Range("H5:J105").CopyFromRecordset Rst

    Set Rst = Nothing
    Set Conn = Nothing
End Function

————————————————————————————————
sheet1:
_______________________________
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$H$2" Then Exit Sub

    If Target.Value <> "" Then
        Application.ScreenUpdating = False
        Application.Cursor = xlWait
        Application.EnableEvents = False

        Test Target.Value

        Application.ScreenUpdating = True
        Application.Cursor = xlDefault
        Application.EnableEvents = True
    End If

End Sub





TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2018-8-30 11:20
Sub test() 'by kagawa 2018/8/30
   
    tms = Timer '计时开始

补充,以上代码,运算22万条记录,用时53秒,还算可以

真的要努力学习SQL,解决这类问题,好像比数组的效率要高

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2018-8-30 11:20
Sub test() 'by kagawa 2018/8/30
   
    tms = Timer '计时开始

感谢 香川群子 大侠(女侠??)

数组成功,但因为我的问题,没有把真实的单号(非数字)给出,所以解决方案不能适合我的需求,但还是非常感谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 andyleeq 于 2018-9-3 14:27 编辑
lsdongjh 发表于 2018-9-3 13:54
工作表名有没有改动过? Sheet1???

大侠,是因为EXCEL2010版本,超过65580就不能用指定行号来引用数据,

select * from [sheet1$A行号:C行号]

改成

select * from [sheet1$]

不指定行号,就可以了

您看这样可以??

我把改后的文件附上了,但系统要审核?,还没有成功上传


PS:您用的SQL真棒,我想学习,能推荐些书籍?我有SQL一点点基础,主要是想学习EXCEL使用的实例

谢谢

TA的精华主题

TA的得分主题

发表于 2018-9-3 16:37 | 显示全部楼层
andyleeq 发表于 2018-9-3 14:21
感谢 香川群子 大侠(女侠??)

数组成功,但因为我的问题,没有把真实的单号(非数字)给出,所以解 ...

如果单号不是数字,那就可以用字典处理一下。

款号也不是数字吧?那就要用2个字典了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-13 13:57 , Processed in 0.025433 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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