Excel精英培训网

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

[已解决]求保留特定数字的精简代码

[复制链接]
发表于 2016-2-11 21:00 | 显示全部楼层 |阅读模式
1.png
如上图示,在A1到I1中,数字1到9,只出现两次的数字有:1、5、7.
现求一代码,凡出现2次的数字中,任意2个数字都出现在同一单元格的,清保留该2个数字,并以36号字体显示。
得到如下效果:
2.png
运行以下代码即可:
Sub 数字变文本()
Sheet2.Range("A1:I1").FormulaR1C1 = "=TEXT(sheet1!RC,0)"
Sheet2.Range("A1:I1").Copy
Sheet1.Range("A1:I1").PasteSpecial Paste:=xlPasteValues
Sheet2.Range("A1:I1").Clear
Sheet1.Activate
Call 查找出现2次的数字
Call 保留同行隐含对数
Range("k1").ClearContents
End Sub
Sub 查找出现2次的数字()
Dim mycount As Integer, a As Integer, j As Integer
For j = 1 To 9
  For a = 1 To 9
  xstr = ""
   mycount = Application.WorksheetFunction.CountIf(Rows(1), "*" & a & "*")
   If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" Then Cells(a, 10) = a
Next a
Next j
xstr = ""
Dim x As Range
For Each x In Range("j1:j9")
If x <> "" Then xstr = xstr & x
Next
Cells(1, 11) = xstr
Columns("J:J").ClearContents
End Sub
Sub 保留同行隐含对数()
    Dim reg, s As Range, m
    For i = 1 To Len(Cells(1, 11))
        If b = "" Then b = Mid(Cells(1, 11), i, 1) Else b = b & "," & Mid(Cells(1, 11), i, 1)
    Next
    Set reg = CreateObject("vbscript.regexp")
    With reg
        .Global = True
        .Pattern = "[" & b & "]"
        For Each s In Range("a1:i1")
            Set m = reg.Execute(s.Value)
            If m.Count = 2 Then
               Range(s.Address) = m.Item(0).Value & m.Item(1).Value
               Range(s.Address).Font.Size = 36
            End If
        Next
   End With
   Set reg = Nothing
End Sub
问题是代码太长了,有没有哪位大神可以写得出更精简的代码?


最佳答案
2016-2-11 22:33
本帖最后由 dsmch 于 2016-2-11 22:37 编辑
  1. Sub Macro1()
  2. Dim arr, d, d2, i%, j%
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. [a1:i1].Font.Size = 11
  6. arr = [a1:i1]
  7. For j = 1 To UBound(arr, 2)
  8.     x = arr(1, j)
  9.     For i = 1 To Len(x)
  10.         s = Mid(x, i, 1)
  11.         d(s) = d(s) + 1
  12.     Next
  13. Next
  14. For Each a In d.keys
  15.     If d(a) = 2 Then d2(a) = ""
  16. Next
  17. For j = 1 To UBound(arr, 2)
  18.     x = arr(1, j)
  19.     p = ""
  20.     For i = 1 To Len(x)
  21.         s = Mid(x, i, 1)
  22.         If d2.exists(s) Then p = p & s
  23.     Next
  24.     If Len(p) = 2 Then Cells(1, j) = p: Cells(1, j).Font.Size = 36
  25. Next
  26. End Sub
复制代码

工作簿1.zip

20.29 KB, 下载次数: 4

发表于 2016-2-11 22:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 dsmch 于 2016-2-11 22:37 编辑
  1. Sub Macro1()
  2. Dim arr, d, d2, i%, j%
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. [a1:i1].Font.Size = 11
  6. arr = [a1:i1]
  7. For j = 1 To UBound(arr, 2)
  8.     x = arr(1, j)
  9.     For i = 1 To Len(x)
  10.         s = Mid(x, i, 1)
  11.         d(s) = d(s) + 1
  12.     Next
  13. Next
  14. For Each a In d.keys
  15.     If d(a) = 2 Then d2(a) = ""
  16. Next
  17. For j = 1 To UBound(arr, 2)
  18.     x = arr(1, j)
  19.     p = ""
  20.     For i = 1 To Len(x)
  21.         s = Mid(x, i, 1)
  22.         If d2.exists(s) Then p = p & s
  23.     Next
  24.     If Len(p) = 2 Then Cells(1, j) = p: Cells(1, j).Font.Size = 36
  25. Next
  26. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-2-12 09:48 | 显示全部楼层
dsmch 发表于 2016-2-11 22:33

高手:
1.png
如图示,运行以下代码,得出的结果是Cells(1,10)=7.只出现2次数字的是:1、5、7。原本以为以下代码会使Cells(1,10)=157,但为什么这个代码是在J1先后写入1、5、7,最后只保留7呢?
Sub Celia()
Dim mycount As Integer, a As Integer, j As Integer
For j = 1 To 9
  For a = 1 To 9
  xstr = ""
   mycount = Application.WorksheetFunction.CountIf(Rows(1), "*" & a & "*")
   If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" Then
   xstr = xstr & a
   Cells(1, 10) = xstr
End If
Next a
Next j
End Sub
如果要一次性保留157,代码该如何写?当然我自己也写得出,可惜超长。我先将其变文本,然后另起一列计算等等,长到以下这个样子。如果是你,解题思路是什么啊?
Sub 同行隐含对数()
'数字变文本
Sheet2.Range("A1:I1").FormulaR1C1 = "=TEXT(sheet1!RC,0)"
Sheet2.Range("A1:I1").Copy
Sheet1.Range("A1:I1").PasteSpecial Paste:=xlPasteValues
Sheet2.Range("A1:I1").Clear
Sheet1.Activate
Call 查找出现2次的数字
Call 保留同行隐含对数
Range("k1").ClearContents
End Sub
Sub 查找出现2次的数字()
Dim mycount As Integer, a As Integer, j As Integer
For j = 1 To 9
  For a = 1 To 9
  xstr = ""
   mycount = Application.WorksheetFunction.CountIf(Rows(1), "*" & a & "*")
   If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" Then Cells(a, 10) = a
Next a
Next j
xstr = ""
Dim x As Range
For Each x In Range("j1:j9")
If x <> "" Then xstr = xstr & x
Next
Cells(1, 11) = xstr
Columns("J:J").ClearContents
End Sub


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:03 , Processed in 0.327618 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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