Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2304|回复: 10

[已解决]请老师编写代码

[复制链接]
发表于 2013-3-31 10:55 | 显示全部楼层 |阅读模式
请老师编写代码。谢谢!
最佳答案
2013-3-31 11:22
这样的??

  1. Private Sub CommandButton1_Click()
  2. Dim D As Object, Arr(), Brr(), Crr(), Drr(), Ar() As String, S As String
  3. Dim Hx As Long, Xt As Long, Bt As Long, Lx As Long
  4.     Set D = CreateObject("Scripting.dictionary")
  5.     Arr = Range("A2:H23").Value
  6.     For Hx = 1 To UBound(Arr)
  7.         For Lx = 1 To UBound(Arr, 2)
  8.             S = S & "-" & Arr(Hx, Lx)
  9.         Next
  10.         D(S) = D(S) + 1
  11.         S = ""
  12.     Next
  13.    
  14.     Brr = D.items
  15.     ReDim Crr(1 To UBound(Brr) + 1, 1 To UBound(Arr, 2))
  16.     ReDim Drr(1 To UBound(Brr) + 1, 1 To UBound(Arr, 2))
  17.     Arr = D.keys
  18.     For Hx = 0 To UBound(Brr)
  19.         If Brr(Hx) = 1 Then
  20.             Xt = Xt + 1
  21.             Ar = Split(Arr(Hx), "-")
  22.             For Lx = 1 To UBound(Ar) - 1
  23.                 Crr(Xt, Lx) = Ar(Lx)
  24.             Next
  25.         Else
  26.             Bt = Bt + 1
  27.             Ar = Split(Arr(Hx), "-")
  28.             For Lx = 1 To UBound(Ar) - 1
  29.                 Drr(Bt, Lx) = Ar(Lx)
  30.             Next
  31.         End If
  32.     Next
  33.     Range("J2:Y100").ClearContents
  34.     Range("J2").Resize(Xt, UBound(Crr, 2)).Value = Crr
  35.     Range("S2").Resize(Bt, UBound(Drr, 2)).Value = Drr
  36. End Sub
复制代码

提取表格中数字相同或不同的行.rar

10.57 KB, 下载次数: 25

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-3-31 11:04 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-3-31 11:18 | 显示全部楼层
hwc2ycy 发表于 2013-3-31 11:04
这个不是写过类似的嘛。

这是在一个表里选取不相同数字行或相同数字行,那是在二个表里进行操作,我也试套用原来的代码没有做好,再麻烦你一次,谢谢!
回复

使用道具 举报

发表于 2013-3-31 11:22 | 显示全部楼层    本楼为最佳答案   
这样的??

  1. Private Sub CommandButton1_Click()
  2. Dim D As Object, Arr(), Brr(), Crr(), Drr(), Ar() As String, S As String
  3. Dim Hx As Long, Xt As Long, Bt As Long, Lx As Long
  4.     Set D = CreateObject("Scripting.dictionary")
  5.     Arr = Range("A2:H23").Value
  6.     For Hx = 1 To UBound(Arr)
  7.         For Lx = 1 To UBound(Arr, 2)
  8.             S = S & "-" & Arr(Hx, Lx)
  9.         Next
  10.         D(S) = D(S) + 1
  11.         S = ""
  12.     Next
  13.    
  14.     Brr = D.items
  15.     ReDim Crr(1 To UBound(Brr) + 1, 1 To UBound(Arr, 2))
  16.     ReDim Drr(1 To UBound(Brr) + 1, 1 To UBound(Arr, 2))
  17.     Arr = D.keys
  18.     For Hx = 0 To UBound(Brr)
  19.         If Brr(Hx) = 1 Then
  20.             Xt = Xt + 1
  21.             Ar = Split(Arr(Hx), "-")
  22.             For Lx = 1 To UBound(Ar) - 1
  23.                 Crr(Xt, Lx) = Ar(Lx)
  24.             Next
  25.         Else
  26.             Bt = Bt + 1
  27.             Ar = Split(Arr(Hx), "-")
  28.             For Lx = 1 To UBound(Ar) - 1
  29.                 Drr(Bt, Lx) = Ar(Lx)
  30.             Next
  31.         End If
  32.     Next
  33.     Range("J2:Y100").ClearContents
  34.     Range("J2").Resize(Xt, UBound(Crr, 2)).Value = Crr
  35.     Range("S2").Resize(Bt, UBound(Drr, 2)).Value = Drr
  36. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
ymq123 + 3

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-3-31 11:32 | 显示全部楼层
无聊的疯子 发表于 2013-3-31 11:22
这样的??

不好意思,还要麻烦你,请把选取相同和不同的代码分开编写。谢谢
回复

使用道具 举报

发表于 2013-3-31 11:33 | 显示全部楼层
  1. Private Sub CommandButton1_Click()
  2.     Dim arr, arrtemp
  3.     Dim rg As Range

  4.     On Error Resume Next

  5.     Set rg = Range("a2:g23").SpecialCells(xlCellTypeBlanks)
  6.     If Not rg Is Nothing Then rg = " "
  7.     arr = Range("a2:g23")
  8.     Set rg = Nothing
  9.     Dim dic As Object, str$
  10.     Set dic = CreateObject("scripting.dictionary")

  11.     For i = LBound(arr) To UBound(arr)
  12.         str = Join(WorksheetFunction.Index(arr, i, 0), "#")
  13.         dic(str) = dic(str) + 1
  14.     Next
  15.     arr = arrGet(dic, False)
  16.     If IsArray(arr) Then Range("s2").Resize(UBound(arr), UBound(arr, 2)) = arr
  17. End Sub

  18. Function arrGet(dic As Object, Optional isIn As Boolean = False)
  19. 'isIn为FALSE 提取非重复值
  20. 'isIn为TRUE,提取重复值
  21.     Dim arr()
  22.     Dim arrtemp
  23.     If dic.Count = 0 Then arrGet = False: Exit Function

  24.     Dim lCount As Long
  25.     Dim keys
  26.     For Each keys In dic.keys
  27.         If dic(keys) > 1 Then dic.Key(keys) = keys & "/"
  28.     Next
  29.     arrtemp = Filter(dic.keys, "/", isIn)
  30.     If UBound(arrtemp) = -1 Then arrGet = False: Exit Function

  31.     ReDim arr(1 To UBound(arrtemp) + 1)
  32.     Dim str$
  33.     For i = LBound(arr) To UBound(arr)
  34.         str = Replace(arrtemp(i - 1), "/", "")
  35.         arr(i) = Split(str, "#")
  36.     Next
  37.     arrGet = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))
  38. End Function
复制代码
回复

使用道具 举报

发表于 2013-3-31 11:34 | 显示全部楼层
要提取重复值还是非重复值,只要改下arrget的第2个参数即可。
回复

使用道具 举报

发表于 2013-3-31 11:38 | 显示全部楼层
ymq123 发表于 2013-3-31 11:32
不好意思,还要麻烦你,请把选取相同和不同的代码分开编写。谢谢

要做成两段代码??由你自己选择 相同或者不同?
回复

使用道具 举报

发表于 2013-3-31 11:40 | 显示全部楼层
  1. Private Sub CommandButton1_Click()
  2.     Dim arr, arrtemp
  3.     Dim rg As Range

  4.     On Error Resume Next

  5.     Set rg = Range("a2:g23").SpecialCells(xlCellTypeBlanks)
  6.     If Not rg Is Nothing Then rg = " "
  7.     arr = Range("a2:g23")
  8.     Set rg = Nothing
  9.     Dim dic As Object, str$
  10.     Set dic = CreateObject("scripting.dictionary")

  11.     For i = LBound(arr) To UBound(arr)
  12.         str = Join(WorksheetFunction.Index(arr, i, 0), "#")
  13.         dic(str) = dic(str) + 1
  14.     Next
  15.     Application.ScreenUpdating = False
  16.    
  17.     '提取非重复值
  18.     arr = arrGet(dic, False)
  19.     If IsArray(arr) Then Range("s2").Resize(UBound(arr), UBound(arr, 2)) = arr
  20.    
  21.     '提取重复值
  22.     arr = arrGet(dic, True)
  23.     If IsArray(arr) Then Range("aa2").Resize(UBound(arr), UBound(arr, 2)) = arr
  24.     Application.ScreenUpdating = True
  25. End Sub

  26. Function arrGet(dic As Object, Optional isIn As Boolean = False)
  27. 'isIn为FALSE 提取非重复值
  28. 'isIn为TRUE,提取重复值
  29.     Dim arr()
  30.     Dim arrtemp
  31.     If dic.Count = 0 Then arrGet = False: Exit Function

  32.     Dim lCount As Long
  33.     Dim keys
  34.     For Each keys In dic.keys
  35.         If dic(keys) > 1 Then dic.Key(keys) = keys & "/"
  36.     Next
  37.     arrtemp = Filter(dic.keys, "/", isIn)
  38.     If UBound(arrtemp) = -1 Then arrGet = False: Exit Function

  39.     ReDim arr(1 To UBound(arrtemp) + 1)
  40.     Dim str$
  41.     For i = LBound(arr) To UBound(arr)
  42.         str = Replace(arrtemp(i - 1), "/", "")
  43.         arr(i) = Split(str, "#")
  44.     Next
  45.     arrGet = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))
  46. End Function
复制代码
回复

使用道具 举报

发表于 2013-3-31 11:56 | 显示全部楼层
ymq123 发表于 2013-3-31 11:32
不好意思,还要麻烦你,请把选取相同和不同的代码分开编写。谢谢



把代码写成一个公用过程,直接调用 就行了,
参数说明,
第一个参数为数据源区域,
第二个参数为 相同或者不同,true 为相同,false 为不同
第三个参数为 数据写入的目标单元格

按钮里用调用了2次,第一次处理相同,第二次处理不同

  1. Private Sub CommandButton1_Click()
  2.     Range("J2:P100").ClearContents
  3.     ChuLi Range("A2:H23"), True, Range("J2")
  4.     Range("S2:Y100").ClearContents
  5.     ChuLi Range("A2:H23"), False, Range("S2")
  6. End Sub
  7. Private Sub ChuLi(ByVal DaYuan As Range, ByVal Xt As Boolean, ByVal MuBiao As Range)
  8. Dim D As Object, Arr(), Brr(), Crr(), Drr(), Ar() As String, S As String
  9. Dim Hx As Long, X As Long, Lx As Long
  10.     Set D = CreateObject("Scripting.dictionary")
  11.     Arr = Range("A2:H23").Value
  12.     For Hx = 1 To UBound(Arr)
  13.         For Lx = 1 To UBound(Arr, 2)
  14.             S = S & "-" & Arr(Hx, Lx)
  15.         Next
  16.         D(S) = D(S) + 1
  17.         S = ""
  18.     Next
  19.     Brr = D.items
  20.     ReDim Crr(1 To UBound(Brr) + 1, 1 To UBound(Arr, 2))
  21.     Arr = D.keys
  22.     If Xt Then
  23.         For Hx = 0 To UBound(Brr)
  24.             If Brr(Hx) = 1 Then
  25.                 X = X + 1
  26.                 Ar = Split(Arr(Hx), "-")
  27.                 For Lx = 1 To UBound(Ar) - 1
  28.                     Crr(X, Lx) = Ar(Lx)
  29.                 Next
  30.             End If
  31.         Next
  32.     Else
  33.         For Hx = 0 To UBound(Brr)
  34.             If Brr(Hx) > 1 Then
  35.                 X = X + 1
  36.                 Ar = Split(Arr(Hx), "-")
  37.                 For Lx = 1 To UBound(Ar) - 1
  38.                     Crr(X, Lx) = Ar(Lx)
  39.                 Next
  40.             End If
  41.         Next
  42.     End If
  43.     MuBiao.Resize(X, UBound(Crr, 2)).Value = Crr
  44. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-7 14:57 , Processed in 0.345384 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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