ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 功能上确实已经很完美了,谁还能把它做得更快?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:31 | 显示全部楼层 |阅读模式
本帖最后由 renahu 于 2014-9-27 06:54 编辑

Private Sub CommandButton5_Click()
    tim = Timer
    Application.ScreenUpdating = False
    w = 1                                                                '把选择区中非对应表中的单词保存到工作表中
    With ListBox1
        For s = 0 To .ListCount - 1
            For t = 1 To UBound(Arr)
                If Arr(t, 1) = .List(s, 0) Then GoTo line0
            Next
            Sheets("单词库").Cells(w, "H") = .List(s, 0)
            Sheets("单词库").Cells(w, "I") = .List(s, 1)
            w = w + 1
line0:
        Next
    End With
   
    ListBox1.Clear
    If TextBox2.Value = "" Then
        ListBox1.List = Arr
        TextBox3 = UBound(Arr)
    Else
        ListBox1.List = BRR
        TextBox3 = UBound(BRR)
    End If
   
    With ListBox1                                                    '把工作表中的外表词回填入选择区中
        For s = 1 To w - 1
            k = TextBox3.Value
            .AddItem
            .List(k, 0) = Sheets("单词库").Cells(s, "H")
            .List(k, 1) = Sheets("单词库").Cells(s, "I")
             Sheets("单词库").Cells(s, "H") = ""
             Sheets("单词库").Cells(s, "I") = ""
             TextBox3.Value = k + 1
        Next
    End With
   
    With ListBox2
       R = .ListCount - 1
       For i = 0 To R
           If i > R Then Exit For
           If .Selected(i) Then
               .Selected(i) = False
               k = TextBox3.Value
               For j = 0 To ListBox1.ListCount - 1    '查看是否重复
                  If ListBox1.List(j, 0) = .List(i, 0) Then
                       ListBox1.Selected(j) = True
                       .RemoveItem (i)
                       i = i - 1
                       R = R - 1
                       GoTo line1
                  End If
               Next
                k = TextBox3.Value
                ListBox1.AddItem
                ListBox1.List(k, 0) = .List(i, 0)
                ListBox1.List(k, 1) = .List(i, 1)
                ListBox1.Selected(k) = True
                TextBox3.Value = k + 1
               .RemoveItem (i)
               i = i - 1
               R = R - 1
           Else
               m = ListBox1.ListCount - 1
               For j = 0 To m    '查看是否重复
                   If j > m Then Exit For
                   If ListBox1.List(j, 0) = .List(i, 0) Then
                       TextBox3.Value = TextBox3.Value - 1
                       ListBox1.RemoveItem (j)
                       j = j - 1
                       m = m - 1
                   End If
               Next
           End If
line1:
        Next
    End With
    TextBox4.Value = R + 1
    Application.ScreenUpdating = True
    MsgBox "总计用时 " & Format(Timer - tim, "0.00") & " 秒!!", 64, "提示"
   
End Sub

换成用字典的方法:

Private Sub CommandButton5_Click()
    Dim BRR()
    tim = Timer
    Application.ScreenUpdating = False
    w = 1                                                                '把选择区中非对应表中的单词保存到字典中
    With ListBox1
        For s = 0 To .ListCount - 1
            For t = 1 To UBound(Arr)
                If Arr(t, 1) = .List(s, 0) Then GoTo line0
            Next
            D(.List(s, 0)) = .List(s, 1)
line0:
        Next
    End With
   
    With ListBox2                                                        '根据打印区的内容调整字典,打印区“选中的”字典中没有就加入字典,有的不管;“未选中的”字典中有的就删除,没有的不管
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                If Not D.exists(.List(i, 0)) Then D(.List(i, 0)) = .List(i, 1)
            Else
                If D.exists(.List(i, 0)) Then D.Remove .List(i, 0)
            End If
        Next
    End With
   
    s1 = D.KEYS                                                          '把字典中的单词列在选择区中
    t1 = D.ITEMS
    ReDim BRR(1 To D.Count, 1 To 2)
    For i = 0 To D.Count - 1
        BRR(i + 1, 1) = s1(i)
        BRR(i + 1, 2) = t1(i)
    Next
    With ListBox1
        .Clear
        .List = BRR
    End With
    TextBox3 = D.Count
     
   
    With ListBox2                                                        '把打印区中选择了的单词取消选择,选择区中有的要选中
        R = .ListCount - 1
        For i = 0 To R
            If i > R Then Exit For
            If .Selected(i) Then
                .Selected(i) = False
                For j = 0 To ListBox1.ListCount - 1    '查看是否重复
                    If ListBox1.List(j, 0) = .List(i, 0) Then
                        ListBox1.Selected(j) = True
                        .RemoveItem (i)
                        i = i - 1
                        R = R - 1
                        GoTo line1
                   End If
                Next
           End If
line1:
        Next
    End With
    TextBox4.Value = R + 1
    Application.ScreenUpdating = True
    MsgBox "总计用时 " & Format(Timer - tim, "0.00") & " 秒!!", 64, "提示"
   
End Sub

这是用字典方法的附件(同10楼附件,含大数据量) 按表选择需要的单词打印成单词条12.rar (168.04 KB, 下载次数: 16)
请数组或字典高手给优化一下,但要保留原有功能,不能以牺牲功能来提高速度


按表选择需要的单词打印成单词条11.rar

36.6 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2014-9-25 17:00 | 显示全部楼层
Sheets("单词库").Cells(w, "H") = .List(s, 0)
像这种最好用数组一次写入单元格,以提高速度

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-25 17:16 | 显示全部楼层
doitbest 发表于 2014-9-25 17:00
Sheets("单词库").Cells(w, "H") = .List(s, 0)
像这种最好用数组一次写入单元格,以提高速度

请问代码怎么写呢,现在是找到一条没有的写出去一条,一次写入单元格怎么理解?请指教,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-25 17:36 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-25 21:28 | 显示全部楼层
本帖最后由 renahu 于 2014-9-26 12:27 编辑

我把字典的功能基本上都用进去了,感觉也没啥变化
按表选择需要的单词打印成单词条12.rar (36.34 KB, 下载次数: 31)

TA的精华主题

TA的得分主题

发表于 2014-9-26 08:31 | 显示全部楼层
renahu 发表于 2014-9-25 21:28
我把字典的功能基本上都用进去了,感觉也没啥变化

您好:
如下图——
QQ截图20140926082542.png
当输入fk时,就提示下标越界,然后窗体就退出了。我知道,这是候选的词条中没有包含fk的词条。
能不能出现这种情况时提示“您输入的词条不存在”,然后清空文本框中的内容而窗体不退出?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 09:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
沙漠滴雨 发表于 2014-9-26 08:31
您好:
如下图——

错误改了,5楼附件已更新

TA的精华主题

TA的得分主题

发表于 2014-9-26 09:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
renahu 发表于 2014-9-26 09:02
错误改了,5楼附件已更新

感谢您的改进。
能否确定之后,输入的fk自动清空,准备输入新的查询条件?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 12:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 renahu 于 2014-9-26 12:35 编辑
沙漠滴雨 发表于 2014-9-26 09:46
感谢您的改进。
能否确定之后,输入的fk自动清空,准备输入新的查询条件?


费半天劲终于搞好了,新的在5楼,我很奇怪,msgbox提示信息关闭后,窗体激活,触发activate事件,想把光标用setfocus定位到 textbox2,就是不行(我想光标应该就在textbox2里面,所以setfocus不起作用),去别的文本框都没问题,后来干脆先去别的文本框,在回到textbox2,算是迂回解决了,有明白的高手给解释一下,有没有更好的办法

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-26 21:57 | 显示全部楼层
本帖最后由 renahu 于 2014-9-26 23:44 编辑
沙漠滴雨 发表于 2014-9-26 09:46
感谢您的改进。
能否确定之后,输入的fk自动清空,准备输入新的查询条件?

空白显示也可以,不一定非要提示,另外我把数据大量复制粘贴,看看这速度能不能再提高
按表选择需要的单词打印成单词条12.rar (168.04 KB, 下载次数: 32)

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

本版积分规则

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

GMT+8, 2024-11-20 16:41 , Processed in 0.045277 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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