ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 根据预设值抓取数据同时计算长度、

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-8 16:15 | 显示全部楼层 |阅读模式
新人一个,目前代码只能实现条件数据筛选,但是想要的功能更加复杂一些。详情请大佬看附件。
如觉得没说清楚 请大佬留下联系方式。。

代码表.zip

63.71 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2019-12-9 11:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-13 09:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

感谢版主给代码。我测试了下 好像并不出数据。。

TA的精华主题

TA的得分主题

发表于 2019-12-14 08:09 | 显示全部楼层
请仔细核对抄写的代码,初学者常常会抄错的。
或者上传出错的代码和附件看看。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-16 16:57 | 显示全部楼层
本帖最后由 lajihaha159 于 2019-12-18 20:56 编辑
蓝桥玄霜 发表于 2019-12-14 08:09
请仔细核对抄写的代码,初学者常常会抄错的。
或者上传出错的代码和附件看看。

感觉版主的回复,应该是没抄错,简单分析了代码还是没有实现,具体看附件,麻烦版主了。。

TA的精华主题

TA的得分主题

发表于 2019-12-17 08:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-18 13:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lajihaha159 于 2019-12-18 20:56 编辑
蓝桥玄霜 发表于 2019-12-17 08:12
没有看到你抄的代码。

代码已经加进去了。。前面的附件代码没有保存好,看版主再看看。。

想实现的目的.zip

24.75 KB, 下载次数: 1

TA的精华主题

TA的得分主题

发表于 2019-12-19 08:36 | 显示全部楼层
还是有2个地方抄错了:
  1. Dim Arr
  2. Sub lqxs()
  3. Dim i&, ks&, mx, n%, zh, m%, aa, j%
  4. Dim d, k, t, nn&, jj%
  5. Set d = CreateObject("Scripting.Dictionary")
  6. Application.ScreenUpdating = False  '这一句
  7. Sheet2.Activate
  8. [a11:Z5000].ClearContents: nn = 10
  9. Arr = Sheet1.[a1].CurrentRegion
  10. For i = 3 To UBound(Arr)
  11.    If Arr(i - 1, 5) < 3 Then
  12.       If Arr(i, 5) >= 3 Then
  13.         ks = i: n = n + 1
  14.         d(Arr(i, 5)) = d(Arr(i, 5)) & i & ","
  15.       End If
  16.     Else
  17.     If Arr(i, 5) >= 3 Then
  18.       d(Arr(i, 5)) = d(Arr(i, 5)) & i & ","
  19.        n = n + 1
  20.     Else
  21.        k = d.keys: t = d.items
  22.        mx = Application.Max(k)  '这一句
  23.        If mx > 6 Then
  24.        zh = n * 0.25
  25.        m = Application.Match(mx, k, 0) - 1
  26.        t(m) = Left(t(m), Len(t(m)) - 1)
  27.         If InStr(t(m), ",") Then
  28.            aa = Split(t(m), ",")
  29.            For jj = 0 To UBound(aa)
  30.               nn = nn + 1
  31.              Call tb(nn, mx, zh, aa(jj))
  32.           Next
  33.      Else
  34.           nn = nn + 1
  35.          Call tb(nn, mx, zh, t(m))
  36.        End If
  37.     End If
  38.     d.RemoveAll
  39.      n = 0
  40.    End If
  41.   End If
  42. Next

  43. Application.ScreenUpdating = True

  44. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-19 12:59 | 显示全部楼层
  1. Option Explicit

  2. Sub Main()
  3.     Dim shData As Worksheet, shCondition As Worksheet, shResult As Worksheet
  4.     Dim arrData As Variant, arrCondition As Variant, objColID As Object
  5.     Dim lngRow As Long, lngCol As Long, lngRow2 As Long
  6.     Dim lngColID As Long, lngCurRow As Long
  7.     Dim arrJudgeCondition As Variant, strName As String, strCountChar As String, strCountVal As String, strMaxChar As String, strMaxVal As String
  8.     Dim arrResult As Variant, strTemp As String, lngCount As Long, dblMaxOrMin As Double, strRowID As String, blHasOK As Boolean
  9.     Dim strSplit() As String, lngID As Long, arrTemp As Variant
  10.    
  11.     Set shData = Sheets("数据")
  12.     Set shCondition = Sheets("分析条件")
  13.     Set shResult = Sheets("分析结果")
  14.     Set objColID = GetDicByColID
  15.    
  16.     arrData = shData.UsedRange '源数据
  17.     arrCondition = shCondition.Range("A10:J18")  '条件数据
  18.     ReDim arrResult(1 To UBound(arrData), 1 To 26)
  19.    
  20.     For lngCol = 2 To UBound(arrCondition, 2)
  21.         strName = arrCondition(1, lngCol)
  22.         For lngRow = 2 To UBound(arrCondition) Step 4
  23.             strCountChar = arrCondition(lngRow, lngCol)
  24.             strCountVal = arrCondition(lngRow + 1, lngCol)
  25.             strMaxChar = arrCondition(lngRow + 2, lngCol)
  26.             strMaxVal = arrCondition(lngRow + 3, lngCol)
  27.             '格式化条件
  28.             arrJudgeCondition = GetJudgeCondition(strName, strCountChar, strCountVal, strMaxChar, strMaxVal)
  29.             '如果条件列存在
  30.             If objColID.Exists(arrJudgeCondition(0)) Then
  31.                 lngColID = objColID(arrJudgeCondition(0))
  32.                 '
  33.                 For lngRow2 = 2 To UBound(arrData)
  34.                     strTemp = arrData(lngRow2, lngColID)
  35.                     If Trim(strTemp) <> "" Then
  36.                         '符合条件开始计数
  37.                         If Application.Evaluate(strTemp & arrJudgeCondition(1)) = True Then
  38.                             blHasOK = True
  39.                             lngCount = lngCount + 1
  40.                             '峰值条件判断
  41.                             If Application.Evaluate(strTemp & arrJudgeCondition(2)) = True Then
  42.                                 If Val(strTemp) > dblMaxOrMin Then
  43.                                     dblMaxOrMin = Val(strTemp)
  44.                                     strRowID = lngRow2
  45.                                 ElseIf Val(strTemp) = dblMaxOrMin Then
  46.                                     strRowID = strRowID & "|" & lngRow2
  47.                                 End If
  48.                             End If
  49.                         Else
  50.                             If blHasOK And strRowID <> "" Then
  51.                                 strSplit = Split(strRowID, "|")
  52.                                 For lngID = LBound(strSplit) To UBound(strSplit)
  53.                                     lngCurRow = lngCurRow + 1
  54.                                     arrTemp = Application.WorksheetFunction.Index(arrData, Val(strSplit(lngID)), 0)
  55.                                     PutDataToResult arrTemp, lngCurRow, lngCount * 0.25, lngColID, arrResult
  56.                                 Next
  57.                             End If
  58.                            
  59.                             blHasOK = False
  60.                             lngCount = 0
  61.                             dblMaxOrMin = -99999
  62.                             strRowID = ""
  63.                         End If
  64.                     End If
  65.                 Next
  66.             End If
  67.         Next
  68.     Next
  69.    
  70.     lngRow = shResult.UsedRange.Rows.Count
  71.     If lngRow < 11 Then lngRow = 11
  72.     shResult.Range("A11:Z" & lngRow).Clear
  73.    
  74.     shResult.Range("A11").Resize(lngCurRow, 26) = arrResult
  75.    
  76.     Set shData = Nothing
  77.     Set shCondition = Nothing
  78.     Set shResult = Nothing
  79.     Set objColID = Nothing
  80.    
  81.     MsgBox "OK"
  82. End Sub


  83. Function PutDataToResult(arrData As Variant, lngRowID As Long, dblLength As Double, lngColID As Long, ByRef arrResult As Variant)
  84.     Dim lngRow As Long
  85.     For lngRow = 1 To 5
  86.         arrResult(lngRowID, lngRow) = arrData(lngRow)
  87.     Next
  88.     For lngRow = 6 To 12
  89.         arrResult(lngRowID, lngRow * 2 - 5) = arrData(lngRow)
  90.     Next
  91.     For lngRow = 13 To 16
  92.         arrResult(lngRowID, lngRow + 7) = arrData(lngRow)
  93.     Next
  94.     arrResult(lngRowID, 25) = arrData(17)
  95.    
  96.     Select Case lngColID
  97.         Case 17
  98.             arrResult(lngRowID, 26) = dblLength
  99.         Case 16
  100.             arrResult(lngRowID, 24) = dblLength
  101.         Case 6 To 11
  102.             arrResult(lngRowID, lngColID * 2 - 4) = dblLength
  103.         Case 5
  104.             arrResult(lngRowID, 6) = dblLength
  105.     End Select
  106. End Function

  107. Function GetDicByColID() As Object
  108.     Dim objDic As Object, shData As Worksheet, arrData As Variant
  109.     Dim strKey As String, lngCol As Long
  110.    
  111.     Set shData = Sheets("数据")
  112.     arrData = shData.Range("A1:Q1")
  113.     Set objDic = CreateObject("Scripting.Dictionary")
  114.    
  115.     For lngCol = 1 To UBound(arrData, 2)
  116.         strKey = Trim(arrData(1, lngCol))
  117.         objDic(strKey) = lngCol
  118.     Next
  119.     Set shData = Nothing
  120.     Set GetDicByColID = objDic
  121. End Function

  122. Function GetJudgeCondition(strName As String, strCountChar As String, strCountVal As String, strMaxChar As String, strMaxVal As String) As Variant
  123.     Dim strResult(2) As String, strTemp As String
  124.    
  125.     strResult(0) = Trim(strName)
  126.     strResult(1) = myReplace(strCountChar, strCountVal)
  127.     strResult(2) = myReplace(strMaxChar, strMaxVal)
  128.     GetJudgeCondition = strResult
  129. End Function

  130. Function myReplace(strOld As String, strVal As String) As String
  131.     Dim strReturn As String
  132.     strReturn = strOld & Val(strVal)
  133.     strReturn = Replace(strReturn, Space(1), "")
  134.     strReturn = Replace(strReturn, "大于", ">")
  135.     strReturn = Replace(strReturn, "小于", "<")
  136.     strReturn = Replace(strReturn, "等于", "=")
  137.     myReplace = strReturn
  138. End Function

复制代码

TA的精华主题

TA的得分主题

发表于 2019-12-19 13:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码审核中,见附件 想实现的目的.rar (32.32 KB, 下载次数: 3)

想实现的目的.rar

32.32 KB, 下载次数: 3

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 07:56 , Processed in 0.036871 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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