ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖

[已解决] 组合结果全对就判断为对, 1个结果有错则为错

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-15 17:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lsdongjh 发表于 2019-1-15 15:46
lngMin = Application.WorksheetFunction.Min(Application.WorksheetFunction.Index(arr, 0, 3))
   ...

这个手动修改最小行和最大行的方法,可以解决问题,谢谢老师!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-15 17:08 | 显示全部楼层
zopey 发表于 2019-1-15 14:22
lngRow = 65537  ,运行ok
------------------------------------------------------分界线
lngRow = 655 ...

老师的观察力不错呀!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-15 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢lsdongjh老师为我解惑,用lsdongjh老师的代码如下:

  1. Sub test()
  2.     Dim shData As Worksheet
  3.     Dim arr As Variant, lngRow As Long, lngCol As Long
  4.     Dim lngMin As Long, lngMax As Long, lngPeriod As Long
  5.     Dim strPeriod() As String, lngIndex As Long
  6.     Dim strTemp As String, strSplitTemp() As String, strBloon As String
  7.     Dim lngCount() As Long, lngBloon() As Long
  8.     Dim strResult() As Variant, lngTrue As Long
  9.     Dim lngID As Long, lngSum As Long
  10.    
  11.     Set shData = Sheets("Sheet1")
  12.     lngRow = shData.Range("A" & Rows.Count).End(xlUp).Row
  13.     arr = shData.Range("A2:D" & lngRow)
  14.    
  15.   '  lngMin = Application.WorksheetFunction.Min(Application.WorksheetFunction.Index(arr, 0, 3))
  16. '   lngMax = Application.WorksheetFunction.Max(Application.WorksheetFunction.Index(arr, 0, 3))
  17.   
  18. 'lngRow = 65537  ,运行ok
  19. '------------------------------------------------------分界线
  20. 'lngRow = 65538  ,运行报错

  21.   
  22.    lngMin = 24 '手动修改最小行
  23.     lngMax = 1048576 '手动修改最大行
  24.    
  25.     ReDim strPeriod(lngMin To lngMax)
  26.     ReDim strResult(0 To lngMax - lngMin + 1, 1 To 10)
  27.     strResult(0, 1) = "期"
  28.     strResult(0, 2) = "组合数量"
  29.     strResult(0, 3) = "对的数量"
  30.     strResult(0, 4) = "错的数量"
  31.     strResult(0, 5) = "字母参与数量"
  32.     strResult(0, 6) = "A的数量"
  33.     strResult(0, 7) = "B的数量"
  34.     strResult(0, 8) = "C的数量"
  35.     strResult(0, 9) = "D的数量"
  36.     strResult(0, 10) = "E的数量"
  37.    
  38.     For lngRow = LBound(arr) To UBound(arr)
  39.         lngPeriod = arr(lngRow, 3)
  40.         strPeriod(lngPeriod) = strPeriod(lngPeriod) & "," & arr(lngRow, 2) & arr(lngRow, 4)
  41.     Next
  42.    
  43.     lngIndex = 0
  44.    
  45.     For lngRow = LBound(strPeriod) To UBound(strPeriod)
  46.         lngIndex = lngIndex + 1
  47.         strResult(lngIndex, 1) = lngRow
  48.         If strPeriod(lngRow) <> "" Then
  49.             ReDim lngCount(1 To 5) As Long
  50.             ReDim lngBloon(1 To 5) As Long
  51.             strSplitTemp = Split(strPeriod(lngRow), ",")
  52.             For lngID1 = 1 To UBound(strSplitTemp)
  53.                 strTemp = Mid(strSplitTemp(lngID1), 1, 1)
  54.                 strBloon = right(strSplitTemp(lngID1), 1)
  55.                 Select Case UCase(strTemp)
  56.                     Case "A", "B", "C", "D", "E"
  57.                         lngID = Asc(UCase(strTemp)) - 64
  58.                         lngCount(lngID) = lngCount(lngID) + 1
  59.                         If strBloon = "对" Then lngBloon(lngID) = lngBloon(lngID) + 1
  60.                End Select
  61.             Next
  62.             lngID = 0: lngSum = 1: lngTrue = 1
  63.             For lngCol = 1 To 5
  64.                 If lngCount(lngCol) > 0 Then
  65.                     lngTrue = lngTrue * lngBloon(lngCol)
  66.                     lngID = lngID + 1
  67.                     lngSum = lngSum * lngCount(lngCol)
  68.                 End If
  69.             Next
  70.             strResult(lngIndex, 2) = lngSum
  71.             strResult(lngIndex, 3) = lngTrue
  72.             strResult(lngIndex, 4) = lngSum - lngTrue
  73.             strResult(lngIndex, 5) = lngID
  74.             strResult(lngIndex, 6) = lngCount(1)
  75.             strResult(lngIndex, 7) = lngCount(2)
  76.             strResult(lngIndex, 8) = lngCount(3)
  77.             strResult(lngIndex, 9) = lngCount(4)
  78.             strResult(lngIndex, 10) = lngCount(5)
  79.             
  80.          Else
  81.             For lngCol = 2 To 10
  82.                 strResult(lngIndex, lngCol) = 0
  83.             Next
  84.         End If
  85.         
  86.     Next
  87.    
  88.     shData.Range("F1:O" & Rows.Count).Clear
  89.     shData.Range("F1").Resize(UBound(strResult) + 1, 10) = strResult
  90. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2019-1-15 20:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留个标记…………
  1. Sub dsmch()
  2. Dim arr, brr, d, x, i&, zf$, z$
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("a1").CurrentRegion
  5. w = Array("A", "B", "C", "D", "E")
  6. ReDim x(4)
  7. For i = 2 To UBound(arr)
  8.     z = left(arr(i, 2), 1)
  9.     If Not d.exists(arr(i, 3)) Then
  10.         d(arr(i, 3)) = ""
  11.         Set d(arr(i, 3)) = CreateObject("scripting.dictionary")
  12.     End If
  13.     d(arr(i, 3))(z) = d(arr(i, 3))(z) & "," & i
  14. Next
  15. ReDim brr(1 To d.Count, 1 To 10)
  16. For Each a In d.keys
  17.     n = 1: n2 = 0: s = s + 1
  18.     brr(s, 1) = a
  19.     brr(s, 5) = d(a).Count
  20.     For i = 0 To UBound(w)
  21.         If Not d(a).exists(w(i)) Then d(a)(w(i)) = ",1"
  22.         zf = d(a)(w(i))
  23.         x(i) = Split(zf, ",")
  24.         c = UBound(x(i))
  25.         If c > 0 Then n = n * c
  26.         brr(s, i + 6) = IIf(zf = ",1", c - 1, c)
  27.     Next
  28.     brr(s, 2) = n
  29.     For i0 = 1 To UBound(x(0))
  30.         For i1 = 1 To UBound(x(1))
  31.             For i2 = 1 To UBound(x(2))
  32.                 For i3 = 1 To UBound(x(3))
  33.                     For i4 = 1 To UBound(x(4))
  34.                         zf = arr(x(0)(i0), 4) & arr(x(1)(i1), 4) & arr(x(2)(i2), 4) & arr(x(3)(i3), 4) & arr(x(4)(i4), 4)
  35.                         If InStr(zf, "错") > 0 Then n2 = n2 + 1
  36.                     Next
  37.                 Next
  38.             Next
  39.         Next
  40.     Next
  41.     brr(s, 4) = n2
  42.     brr(s, 3) = brr(s, 2) - brr(s, 4)
  43. Next
  44. Range("n8").Resize(s, 10) = brr
  45. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-1-16 09:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 一把小刀闯天下 于 2019-1-16 11:52 编辑

'好玩而已。修改了一下用时小于1s,完全可以接受,,,

Option Explicit

Sub test()
  Dim arr, kk As Long, m As Long, n As Long, dic, t, p As Long, sum, a As Long, tt
  Dim i1  As Long, i2 As Long, i3 As Long, i4 As Long, i5 As Long
  Dim x As Long, y As Long, i As Long, j As Long, k As Long
  tt = Timer
  Set dic = CreateObject("scripting.dictionary")
  arr = [a1].CurrentRegion.Offset(1)
  ReDim crr(1 To 10 ^ 5, 1 To 8) As String
  ReDim drr(1 To UBound(arr, 1), 1 To 10)
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 3) <> arr(j + 1, 3) Then
        For x = i To j - 1
          For y = x + 1 To j
            If arr(x, 2) > arr(y, 2) Then
              For k = 1 To 4
                t = arr(x, k): arr(x, k) = arr(y, k): arr(y, k) = t
              Next
            End If
        Next y, x
        ReDim brr(1 To 5, 1 To 20) As String, cnt(1 To 5) As Long
        m = 1: n = 0: dic.RemoveAll
        ReDim sum(65 To 69), mark(1 To 5) As Long
        For k = i To j
          n = n + 1: brr(Asc(left(arr(k, 2), 1)) - 64, n) = arr(k, 2)
          If left(arr(k, 2), 1) <> left(arr(k + 1, 2), 1) Or arr(k, 3) <> arr(k + 1, 3) Then
            t = Asc(left(arr(k, 2), 1)) - 64
            cnt(t) = n: mark(t) = 1: n = 0
          End If
          dic(arr(k, 2)) = arr(k, 4)
          t = Asc(left(arr(k, 2), 1))
          sum(t) = sum(t) + 1
        Next
        For k = 1 To UBound(cnt)
          If cnt(k) = 0 Then cnt(k) = 1
        Next
        t = 0
        For i1 = 1 To cnt(1)
          If dic(brr(1, i1)) = "对" Or mark(1) = 0 Then
          For i2 = 1 To cnt(2)
            If dic(brr(2, i2)) = "对" Or mark(2) = 0 Then
            For i3 = 1 To cnt(3)
              If dic(brr(3, i3)) = "对" Or mark(3) = 0 Then
              For i4 = 1 To cnt(4)
                If dic(brr(4, i4)) = "对" Or mark(4) = 0 Then
                For i5 = 1 To cnt(5)
                  If dic(brr(5, i5)) = "对" Or mark(5) = 0 Then
                    t = t + 1
                  End If
                Next
                End If
              Next
              End If
            Next
            End If
          Next
          End If
        Next
        a = a + 1: kk = kk + cnt(1) * cnt(2) * cnt(3) * cnt(4) * cnt(5)
        drr(a, 1) = arr(i, 3): drr(a, 2) = kk - p: drr(a, 3) = t: drr(a, 4) = drr(a, 2) - t
        t = 0
        For k = 6 To 10
          drr(a, k) = sum(59 + k)
          If drr(a, k) > 0 Then t = t + 1
        Next
        drr(a, 5) = t: p = kk
        i = j: Exit For
      End If
  Next j, i
  With [f2]
    .Resize(UBound(arr, 1), UBound(drr, 2)).ClearContents
    .Resize(a, UBound(drr, 2)) = drr
  End With
  Debug.Print Format(Timer - tt, "0.00s"), "组合数:" & kk
End Sub

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 00:04 , Processed in 0.041934 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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