Excel精英培训网

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

[已解决]哪位大神可以保留2个57?

[复制链接]
发表于 2016-2-22 22:47 | 显示全部楼层 |阅读模式
本帖最后由 lingyuncelia1 于 2016-2-23 20:08 编辑

Sub c()
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

a = 5
b = 7

  For k = 1 To 9
  mycount = Application.WorksheetFunction.CountIf(Range("a1:i1"), "*" & "5" & "*" & "7" & "*")
If mycount = 2 And Cells(1, k).Text Like "*" & "5" & "*" & "7" & "*" Then Cells(1, k).Font.Size = 36: Cells(1, k) = a & b
  Next

End Sub

为什么运行以上代码后,H1无法保留57,而C1却可以保留57?
最佳答案
2016-2-23 16:00
如果每行找出一对的话,可用字典解决。
  1. Sub grf()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     arr = [a1].CurrentRegion
  5.     For i = 1 To UBound(arr)
  6.         For j = 1 To UBound(arr, 2)
  7.             x = arr(i, j)
  8.             If Len(x) >= 2 Then
  9.                 For m = 1 To Len(x) - 1
  10.                     For n = m + 1 To Len(x)
  11.                         xkey = Mid(x, m, 1) & Mid(x, n, 1)   '两位数的组合
  12.                         d(xkey) = d(xkey) + 1     '不同两位数出现的次数
  13.                         d1(xkey) = d1(xkey) & "," & Cells(i, j).Address       '不同两位数所在的单元格地址
  14.                     Next
  15.                 Next
  16.             End If
  17.         Next
  18.         For Each xkey In d.keys
  19.             If d(xkey) = 2 Then
  20.                 rg = Mid(d1(xkey), 2)
  21.                 Range(rg).Font.Size = 36
  22.                 Range(rg) = xkey
  23.                 Exit For   '最多只找一对
  24.             End If
  25.         Next
  26.         d.RemoveAll
  27.         d1.RemoveAll
  28.     Next
  29. End Sub
复制代码

卡农.zip

10.74 KB, 下载次数: 9

数独.zip

54.77 KB, 下载次数: 5

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-2-23 09:12 | 显示全部楼层
本帖最后由 lichuanboy44 于 2016-2-23 09:17 编辑

此问题好像已看过一次了,不知这样有可用
Sub 处理()
  a = 5
  b = 7
  For k = 1 To 9
    'mycount = Application.WorksheetFunction.CountIf(Range("a1:i1"), "*" & "5" & "*" & "7" & "*") 原句多余,影响判定
     If Cells(1, k) Like "*" & "5" & "*" & "7" & "*" Then
        Cells(1, k) = a & b
        Cells(1, k).Font.Size = 36
     End If
  Next
End Sub

卡农.rar

14.51 KB, 下载次数: 1

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 赞一个

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-2-23 09:22 | 显示全部楼层
lichuanboy44 发表于 2016-2-23 09:12
此问题好像已看过一次了,不知这样有可用
Sub 处理()
  a = 5

谢谢您的宝贵意见,但是我写的代码目的是:在一行数据里,数字1到9,如果某2个数字出现2次,且2次,每次都出现在同一单元格.
所以才写出if mycount=2.但很奇怪,如果没有代码:cells(1,k)=a & b,代码可以36号显示特定的单元格.但无法保留特定的数字.
后来写以下代码,根本36号都不显示.
Sub 隐含唯2数法()
'数字变文本
    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
Dim mycount As Integer, a As Integer, j As Integer
For j = 1 To 9
  For a = 1 To 8
  For b = a + 1 To 9
   mycount = Application.WorksheetFunction.CountIf(Rows(1), "*" & a & "*" & "b" & "*")
   If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" & "b" & "*" Then
   Cells(1, j).Font.Size = 36
   Cells(1, j) = a & b
   End If
  Next b
  Next a
Next j
End Sub
回复

使用道具 举报

发表于 2016-2-23 11:09 | 显示全部楼层
本帖最后由 lichuanboy44 于 2016-2-23 11:11 编辑

    如果57只出现2次,则标示为36号字体,在A1:I1出现1次或3次则不标示,如果是这个 意思,代码如下:
  1. Sub 处理()
  2.   a = 5
  3.   b = 7
  4.   s = "*" & a & "*" & b & "*"
  5.   Set myrng = Sheet1.Range("A1:I1")
  6.     Set c = myrng.Find(s)
  7.     If Not c Is Nothing Then
  8.       firstad = c.Address
  9.       Do
  10.         p = p + 1
  11.         Set c = myrng.FindNext(c)
  12.       Loop While Not c Is Nothing And c.Address <> firstad
  13.     End If
  14.    
  15.     If p = 2 Then
  16.       For k = 1 To 9
  17.         If Cells(1, k) Like s Then
  18.           Cells(1, k) = a & b
  19.           Cells(1, k).Font.Size = 36
  20.         End If
  21.       Next
  22.      End If
  23. End Sub
复制代码
另外,不要盲目地硬用countif,你原来的程序语句mycount = Application.WorksheetFunction.CountIf(Rows(1), "*" & a & "*" & "b" & "*") 始终统计结果为0,原因为:"*" & a & "*" & "b" & "*",运算结果为"*5*7*",这是一个文本字符,而工作表A1:I1中的值为数值,故明明看见有15678和357,但统计结果为0,故其后的If mycount = 2永远不符合条件。除非你将A1:I1设置成文本。
        

卡农.rar

16.13 KB, 下载次数: 2

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 来学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-2-23 12:01 | 显示全部楼层
本帖最后由 lingyuncelia1 于 2016-2-23 12:02 编辑
lichuanboy44 发表于 2016-2-23 11:09
如果57只出现2次,则标示为36号字体,在A1:I1出现1次或3次则不标示,如果是这个 意思,代码如下:另外, ...


谢谢您的宝贵意见,我的确是这个意思.如果变成如下代码是可以的:
Sub c()
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
a = 5
b = 7
mycount = Application.WorksheetFunction.CountIf(Range("a1:i1"), "*" & "5" & "*" & "7" & "*")
  For k = 1 To 9
If mycount = 2 And Cells(1, k).Text Like "*" & "5" & "*" & "7" & "*" Then Cells(1, k).Font.Size = 36: Cells(1, k) = a & b
  Next
End Sub

但我改写成以下代码又不成功了
Sub 隐含唯2数法()
'数字变文本
    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
  For j = 1 To 9
  For a = 1 To 8
  For b = a + 1 To 9
   mycount = Application.WorksheetFunction.CountIf(Range("a1:i1"), "*" & a & "*" & "b" & "*")
next
next
     If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" & "b" & "*" Then
   Cells(1, j).Font.Size = 36
   Cells(1, j) = a & b
    end if
      Next
  End Sub
难道要用肉眼找数字5与7?
回复

使用道具 举报

发表于 2016-2-23 12:57 | 显示全部楼层
本帖最后由 lichuanboy44 于 2016-2-23 13:07 编辑
lingyuncelia1 发表于 2016-2-23 12:01
谢谢您的宝贵意见,我的确是这个意思.如果变成如下代码是可以的:
Sub c()Sheet2.Range("A1:I1").Formul ...


原代码错误的原因是将 "*" & a & "*" & "b" & "*")中的b加了双引号,
但即使你把数字通过复制后粘贴变成了文本格式,但你程序语句有点乱 ,好像达不到效果
Sub 隐含唯2数法()
'数字变文本
    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
  For j = 1 To 9
  For a = 1 To 8
  For b = a + 1 To 9
   mycount = Application.WorksheetFunction.CountIf(Range("a1:i1"), "*" & a & "*" & "b" & "*")
next
next
     If mycount = 2 And Cells(1, j).Value Like "*" & a & "*" & "b" & "*" Then
   Cells(1, j).Font.Size = 36
   Cells(1, j) = a & b
    end if
      Next
  End Sub
      你以上语句的意思是, a从1到8,b从a+1到9进行组合,循环查找,但这样的组合依次为:11到19;23到29;34至39直至78到89。但没有21,31到91,以及32,42到92。所以还是没弄明白,你要查找什么样的数字组合。
     另外,以上程序,首先查找到两个18和两个28,C1的15678和另外一个F1的1238首先循环到因符合个数等于2,其变成了18,永远也变不成57了。

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2016-2-23 14:09 | 显示全部楼层
经过测试,当第一个57查找出来并用a&b赋值后,mycount=1。应该是赋值后系统自动把a&b认为是数据型的了,在以后的countif中找不出来。把判断语句改一下问题就解决了:
If mycount = 2 And Cells(1, k) Like x Then Cells(1, k).Font.Size = 36: Cells(1, k) = "'" & a & b

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2016-2-23 14:09 | 显示全部楼层
语句中的 x = "*" & a & "*" & b & "*"

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2016-2-23 14:11 | 显示全部楼层
请看附件。

卡农.rar

14.06 KB, 下载次数: 5

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1

查看全部评分

回复

使用道具 举报

发表于 2016-2-23 14:51 | 显示全部楼层
看了楼主的几个类似帖子,好像这个57不是指定的,而是根据a1:i1区域数据分析判断出来的。楼主需要解决的问题好像是下面这样的,如果是这样的话,建议用递归算法。
1 数据区域是a1:i1,数据以行为分析依据,a1:i1为一组。
2  单元格中的数据按二个数字进行组合,不区分数字的前后位置,即12与21是重复数据,
如a1单元格数据组合后是:12、13、16、23、26、32、36。如果是全组合的,即12、13、
16、23、26、32、36、21、31、61、62、63需要把21、31、61、62、63删除。
3  需要筛选出在a1:i1单元格范围内,某个组合数据仅出现二次的数据,比如38和57




$PV]`))D]W8[A10Y@B`{H]U.png

评分

参与人数 1 +1 收起 理由
lingyuncelia1 + 1 很给力

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 18:50 , Processed in 0.490050 second(s), 22 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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