ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 点击下拉框里指定条件,便能显示查询结果的VBA

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-28 23:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 WYS67 于 2018-9-29 07:39 编辑
lss001 发表于 2018-9-28 19:09
实际操作中,条件E9确实用处不大可删了
把模块1中全部9改为8保存重启!

Function SSLJ(a, b, c)
x = a.Count
ReDim br(1 To x + 1, 1 To 1)
For i = 1 To x
    If a(i, 1) <> "" Then
        n = n + 1
        br(n, 1) = a(i, 1)
    End If
Next
r = (n - 2) Mod 3
For i = 1 To x
    If a(i, 1) <> "" Then
        m = m + 1
        If m > r Then
            s = s + 1
            t = t & a(i, 1)
            If s = 3 Then
                y = y + 1
                br(y, 1) = t
                s = 0
                t = ""
            End If
        End If
    End If
Next
If b = 1 Then
    yy = y + 1
    br(yy, 1) = br(n - 1, 1) & br(n, 1)
Else
    yy = y
End If
ReDim cr(1 To x + 1, 1 To 1)
For i = yy + 1 To x + 1
    br(i, 1) = ""
Next
If c = 0 Then
    cr = br
Else
    For i = 1 To c - y - 4
        cr(i, 1) = ""
    Next
    For i = c - y - 3 To c - y - 4 + yy
        Z = Z + 1
        cr(i, 1) = br(Z, 1)
    Next
    For i = c - y - 3 + yy To x + 1
        cr(i, 1) = ""
    Next
End If
SSLJ = cr
End Function


老师:上面是别的老师帮忙为http://club.excelhome.net/thread-1438068-1-1.html帖子写的代码。显示的计算结果虽然都对。但总感觉是用函数公式堆砌起来的,和许多年前我用日本卡西欧编程计算机里的编程语言差不多。不知道面对十几万行的大数据,运算效率怎么样?
前些天在http://club.excelhome.net/thread-1436422-1-1.html  里您写的代码,那么复杂,关联好几个工作表的拆分数据、计数统计,将近30MB之大,更新十来万行的数据,用时也不过30秒,加了这个自定义函数写的两列公式后,每次更新竟都需要80多秒时间。


TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 07:55 | 显示全部楼层
lss001 发表于 2018-9-28 19:09
实际操作中,条件E9确实用处不大可删了
把模块1中全部9改为8保存重启!

老师:57楼里的代码还可以优化和提速吧?恳请您帮忙优化和提速!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 10:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2018-9-28 16:37
请重新下载上楼附件!

根据您写的的代码结构紧凑,比6楼的严谨多了!可运算速度比6楼的慢6秒,真是想不通。

TA的精华主题

TA的得分主题

发表于 2018-9-29 15:34 来自手机 | 显示全部楼层
WYS67 发表于 2018-9-29 10:22
根据您写的的代码结构紧凑,比6楼的严谨多了!可运算速度比6楼的慢6秒,真是想不通。

处理数据不同,速度会有差别
可把第二个至第四个UBound(ar)都改为j + 1

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 16:17 | 显示全部楼层
lss001 发表于 2018-9-29 15:34
处理数据不同,速度会有差别
可把第二个至第四个UBound(ar)都改为j + 1

Function SSLJ(rn As Range, a, Optional b = "")
    Dim ar, br, cr, dr, c%, d&, i&, j&, m&, n&, x&, y&
    Application.Volatile
    ar = rn: x = Application.Count(rn)
    c = (x - 2) Mod 3: d = Int(x / 3)
    For j = UBound(ar) To 1 Step -1
        If ar(j, 1) <> "" Then Exit For
    Next
    ReDim br(1 To j, 0): ReDim cr(1 To UBound(ar), 0): ReDim dr(1 To UBound(ar), 0)
    For i = 1 To j
        If ar(i, 1) <> "" Then y = y + 1: br(y, 0) = ar(i, 1)
    Next
    For i = 1 To UBound(ar)
        m = i * 3 + c
        If i < d Then cr(i, 0) = br(m - 2, 0) & br(m - 1, 0) & br(m, 0) Else: cr(i, 0) = ""
        If b <> 0 And b <> "" Then
            n = b - d - 3
            If i > n And i < b - 3 Then dr(i, 0) = cr(i - n, 0) Else: dr(i, 0) = ""
        End If
    Next
    If a = 1 And (b = 0 Or b = "") Then cr(d, 0) = br(x - 1, 0) & br(x, 0)
    If a = 1 And b <> 0 And b <> "" Then dr(b - 3, 0) = br(x - 1, 0) & br(x, 0)
    If b = 0 Or b = "" Then SSLJ = cr
    If b <> 0 And b <> "" Then SSLJ = dr
End Function
红色填充的3个吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 16:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lss001 发表于 2018-9-29 15:34
处理数据不同,速度会有差别
可把第二个至第四个UBound(ar)都改为j + 1

修改为j + 1后,有时会出现#VALUE!错误。

TA的精华主题

TA的得分主题

发表于 2018-9-29 17:06 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lss001 于 2018-9-29 17:11 编辑
WYS67 发表于 2018-9-29 16:33
修改为j + 1后,有时会出现#VALUE!错误。


出现错误可能公式超出数据源行号
公式只可比A列数据多一行!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 17:34 | 显示全部楼层
lss001 发表于 2018-9-29 17:06
出现错误可能公式超出数据源行号
公式只可比A列数据多一行!

算了,还用您原先的代码。感谢您的帮助!

老师:一个文件夹里,总表为一个独立的工作簿,里面是按时间顺序输入的所有部门的流水账;几个分表都是独立的工作簿。

  由于需要不时输入新数据,所以,总表始终处于打开状态;需要查看哪个分表内容时,打开哪个分表,代码就只自动更新与这个分表相关联的内容【这样可以最大限度地节省时间】。

  请问老师:VBA过程可以实现这个功能吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-29 18:52 | 显示全部楼层
lss001 发表于 2018-9-29 18:33
论坛有很多更新数据帖子
可参考一下

好的。谢谢老师!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-5 16:43 | 显示全部楼层
lss001 发表于 2018-9-28 10:25
请按楼上更正,保存重启!

老师:把代码复制进对应的位置后,复制指定条件和按钮到第六个工作表的C1:F8。数据源《组三》的指定条件在I列,数据区域在T列。一.代码需要复制进 【类1(代码)】里;Public WithEvents myApp As Application
Private Sub myApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Address = "$F$4" Then Call pp
    If Target.Address = "$E$1" Then Call auto_open
    If Target.Address = "$E$2" Then Call auto_open
    If Target.Address = "$E$3" Then Call auto_open
    If Target.Address = "$E$4" Then Call auto_open
    If Target.Address = "$E$5" Then Call auto_open
End Sub

二.以下代码,则需要复制粘贴进【模块1】里。

Dim myAppCls As New 类1
Sub InitializeAppEvent()
    Set myAppCls.myApp = Application
End Sub
Sub qq()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
    ws.Range("f4") = ws.Shapes("myDropDown").ControlFormat.List( _
    ws.Shapes("myDropDown").ControlFormat.Value)
End Sub
Sub pp()
    Dim i, j, k, x, y, ar, br, cr, dr, mysh 'As Worksheet
    ar = Range("e1:e8"): x = Cells(4, "f"): j = Cells(1, "f")
    If ar(1, 1) = "" Then mysh = ActiveSheet.Name Else mysh = ar(1, 1).Name
    br = Range(Sheets("" & mysh & "").Cells(ar(4, 1), ar(2, 1)), Sheets("" & mysh & "").Cells(ar(5, 1), ar(2, 1)))
    cr = Range(Sheets("" & mysh & "").Cells(ar(4, 1), ar(3, 1)), Sheets("" & mysh & "").Cells(ar(5, 1), ar(3, 1)))
    For k = UBound(br) To 1 Step -1
        If br(k, 1) <> "" Then Exit For
    Next
        ReDim dr(1 To k, 0)
    For i = 1 To k
        If br(i, 1) <> "" And cr(i, 1) <> "" And br(i, 1) = x Then
            y = y + 1: dr(y, 0) = cr(i, 1)
        End If
    Next
    For i = 1 To k
        If i > y Then dr(i, 0) = ""
    Next
    Cells(5, j).Resize(ar(8, 1) - 4) = ""
    Cells(ar(7, 1), ar(6, 1)).Resize(ar(8, 1) - 4) = dr
    Cells(1, "f") = ar(6, 1)
End Sub
Sub auto_open()
    Dim i, k, ar, br, cr, myShap As ControlFormat, ws As Worksheet
    Dim h As New Collection, myObj As Object, myshape As Shape, mysh
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(1)
    ar = Range("e1:e8")
    If ar(1, 1) = "" Then mysh = ActiveSheet.Name Else mysh = ar(1, 1).Name
    br = Range(Sheets("" & mysh & "").Cells(ar(4, 1), ar(2, 1)), Sheets("" & mysh & "").Cells(ar(5, 1), ar(2, 1)))
    For k = UBound(br) To 1 Step -1
        If br(k, 1) <> "" Then Exit For
    Next
    For i = 1 To k
        If br(i, 1) <> "" Then h.Add br(i, 1), CStr(br(i, 1))
    Next
        ReDim cr(1 To h.Count): ReDim myArray(1 To h.Count)
    For i = 1 To h.Count: cr(i) = h(i): Next
    For i = 1 To h.Count: myArray(i) = CStr(Application.Small(cr, i)): Next
        ws.Shapes("myDropDown").Delete
        ws.Shapes.AddFormControl(xlDropDown, 250, 1, 30, 30).Name = "myDropDown"
        Set myShap = ws.Shapes("myDropDown").ControlFormat
        Set myObj = myShap: myObj.List = myArray
        Set myshape = ws.Shapes("myDropDown")
    myshape.OnAction = "qq"
    Call InitializeAppEvent
End Sub

但是为什么点开按钮,里面的指定条件没有随之变化,仍是11~20【应该是组三!I列的112~566,共计30个不重复条件】;点击按钮后找不到指定条件,出现错误;点击按钮里面的随便数字,跳出“运行时错误‘1004’警告,单击调试,有问题的黄色填充代码显示如下:

ws.Range("f4") = ws.Shapes("myDropDown").ControlFormat.List( _
    ws.Shapes("myDropDown").ControlFormat.Value)
20181005161704.png 20181005162722.png 20181005163734.png

Video_20181005163345.zip (466.83 KB, 下载次数: 3)    指定宏不能运行。



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

本版积分规则

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

GMT+8, 2025-1-16 03:01 , Processed in 0.027208 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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