ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 小程序练习

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-30 10:17 | 显示全部楼层
zpy2 发表于 2020-1-30 08:19
一般情况下,字典估计比集合会速度快那么一点。

老师新年好!多重区域还没试过字典。
不知老师有没看过学生的这个工作簿,我自己现在还不能确定其中的这几个功能,能否作成一个加载宏文件?
我不知道加载宏工作簿是不是要一个功能一个功能分别做成独立的文件的。

TA的精华主题

TA的得分主题

发表于 2020-1-30 11:59 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
OKJSJSF 发表于 2020-1-30 10:17
老师新年好!多重区域还没试过字典。
不知老师有没看过学生的这个工作簿,我自己现在还不能确定其中的这 ...

老师新年好!
你现在的sub不涉及事件和具体的工作表,应该可以保存在一个xla加载项里。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-30 22:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢老师!那我想办法弄好它,方便平时用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-30 22:31 | 显示全部楼层
zpy2 发表于 2020-1-30 11:59
老师新年好!
你现在的sub不涉及事件和具体的工作表,应该可以保存在一个xla加载项里。

谢谢老师!那我想办法弄好它,方便平时用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 16:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2020-1-30 11:59
老师新年好!
你现在的sub不涉及事件和具体的工作表,应该可以保存在一个xla加载项里。

删除重复项代码遇到问题,按道理忽略列参数,相当于查所有列,但忽略参数,占位,计算不对。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 16:17 | 显示全部楼层
Sub cb7(control As IRibbonControl)
    If MsgBox("选择当前工作表二行及以上有数据单元格后单击,可以统计出不重复可见行的行数。(注意事项:不计筛选、隐藏、真空行,但会统计空格、换行符等非打印字符)", vbOKCancel + vbInformation, "功能说明:") <> vbOK Then Exit Sub
    Dim myran As Range, myran2 As Range, ran As Range, i As Integer, i2 As Integer
    On Error GoTo errline
    Set myran = Application.InputBox("请选择待统计的单元格(二行以上)", "数据设置", , , , , , 8)
    If myran.Rows.Count = 1 Then Exit Sub
    For Each myran2 In myran
        If myran2 <> "" Then
            myran.SpecialCells(xlCellTypeVisible).Select
            Selection.Copy
            Worksheets.Add
            ActiveSheet.Paste
            i = Selection.Rows.Count
            Set ran = Selection.RemoveDuplicates(, xlNo)
            For i2 = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1 To 1 Step -1
                If Application.WorksheetFunction.CountA(Rows(i2)) = 0 Then Rows(i2).Delete
            Next
            i2 = Selection.CurrentRegion.Rows.Count
'            Application.DisplayAlerts = False
'            ActiveSheet.Delete
'            Application.DisplayAlerts = True
            
            MsgBox "选区不重复可见行行数: " & i2 & Chr(10) & "选区可见行总行数: " & i, , "计算结果:"
            Set myran = Nothing
            Set myran2 = Nothing
        End If
    Next
errline:
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 16:26 | 显示全部楼层
本帖最后由 OKJSJSF 于 2020-1-31 21:26 编辑

删除重复项代码第一参数忽略就出错,用数组也不行,用字符串也不行
selection.RemoveDuplicates Columns:=Array(1, 2, 3, 4), Header:=xlNo

selection.RemoveDuplicates Columns:=Array(left(str,len(str)-1), Header:=xlNo
selection.RemoveDuplicates Columns:=Arr, Header:=xlNo
selection.RemoveDuplicates Columns:=Array( ), Header:=xlNo
selection.RemoveDuplicates , Header:=xlNo
老版主罗刚君说,如果忽略第一参数,则表示选区的每一列都参与运算,作为判断重复的依据。当以多列作为判断依据时应赋值为数组,当以单列作为判断依据时,赋值为代表列数的数值即可。但Array(1, 2, 3, 4)这种多列都参与运算是自怎么个变量赋法呢?这在多条件筛选或透视表运用中也有。
它不能写成一列列循环的单列去重复组合,括号内也不是字符串“1, 2, 3, 4”。如果选区80多列,从1写到80多吗?是否非得用多列各行合并后生成一列的方法呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-1 23:16 | 显示全部楼层
本帖最后由 OKJSJSF 于 2020-2-2 16:43 编辑

因为无法用“删除重复项方法”功能,只能用老办法“高级筛选”了,去重计算好像完全正确。   Sub cb7(control As IRibbonControl)
    If MsgBox("选择当前工作表二行及以上有数据单元格后单击,可以统计出可见行的不重复行数。(注意事项:不计筛选、隐藏、真空行,但会统计空格、换行符等非打印字符)", vbOKCancel + vbInformation, "功能说明:") <> vbOK Then Exit Sub
    Dim myran As Range, myran2 As Range, i As Integer, i2 As Integer, i3 As Integer
    On Error GoTo errline
    Set myran = Application.InputBox("请选择待统计的单元格(二行以上)", "数据设置", , , , , , 8)
    If myran.Rows.Count = 1 Then Exit Sub
    For Each myran2 In myran
        If myran2 <> "" Then
            myran.SpecialCells(xlCellTypeVisible).Select
            Selection.Copy
            Worksheets.Add
            ActiveSheet.Paste
            i = Selection.Rows.Count
            i2 = Selection.Columns.Count
'            Selection.RemoveDuplicates Columns:=Array(1, 2, 3, , , ,16384), Header:=xlNo 没法用变量
            For i3 = i To 1 Step -1
                If Application.WorksheetFunction.CountA(Rows(i3)) = 0 Then
                    Rows(i3).Delete
                End If
            Next
            Rows(1).Insert
            With Range("A1")
                .Value = "列标"
                .AutoFill Destination:=.Resize(1, i2), Type:=xlFillDefault
                .CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, unique:=True
                Set myran = .CurrentRegion.SpecialCells(xlCellTypeVisible)
            End With
            With myran
                For i2 = 1 To .Areas.Count
                    i3 = i3 + .Areas(i2).Rows.Count
                Next
            End With
            Application.DisplayAlerts = False
            ActiveSheet.Delete
            Application.DisplayAlerts = True
            MsgBox "选区可见行不重复行数: " & i3 - 1 & Chr(10) & "选区可见行总行数: " & i, , "计算结果:"
            Set myran = Nothing
            Set myran2 = Nothing
        End If
    Next
errline:
End Sub




TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-1 23:33 | 显示全部楼层
本帖最后由 OKJSJSF 于 2020-2-2 16:42 编辑

看了一些字典或数组用于列表去重计数,好像是采用把一行中的多列数据连接起来的办法,生成单列数据后去重计数。我怀凝这样会可能出错。因为:现在工作表一行有一万六千多个格子,每个格子可以录入长度三万多的字符,如果串连起来,相当于一个格子必须容得下六万万个字符。我不知道集合、字典、数组中的每个元素,有没有字符长度限制,能否装下六万万,否则去重计算就可能错。但不知“高级筛选”与“删除重复项”的原本身功能原理是否也如此?比如先计算各行各列格子长度之和是否相同,不同肯定不重复,再比较长度之和相同的,即可能重复的,纵向各行有一列不同的就是不重复的,剩下的才是重复的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-2 11:50 | 显示全部楼层
终于查到删除重复项方法第一参数的含义: 当选定一个区域,
Columns:=1或Columns:=Array(1)的话,那么第一列中重复项所在行都会被删除,如果是Columns:=2或Columns:=Array(1,2),则列表中第1,2两列均重复的行会被删除,以此类推,Columns:=x或Columns:=Array(1,2, , ,x),区域第1至x列均重复的行才会被删除。
如果想在几列中只根据某几列的重复来删除,比如,1、38、16000列。那么参数写为Columns:=Array(1 , 38 , 16000)。手工操作时,就是先取消全部勾选,再勾选需要比对的列项。

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

本版积分规则

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

GMT+8, 2024-11-18 23:22 , Processed in 0.030439 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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