ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何跨表取值,并按条件进行拆分组合?

如何跨表取值,并按条件进行拆分组合?

作者:绿色风 分类: 时间:2022-08-17 浏览:120
楼主
liuguansky
Q:如何依另一个工作簿中的三个工作表中的数据进行工程号查找,并拆分返回成数值X数值的形式,同时要兼容大小写,空格有无的情况?
A:
用如下代码可以实现:

  1. Sub justtest()
  2.     Dim dic, arr, sht As Worksheet, i&, j&, m&, arr1, arr2, arrt(), n1&, n2&
  3.     Set dic = CreateObject("scripting.dictionary")
  4.     Application.ScreenUpdating = False
  5.     Workbooks.Open (ThisWorkbook.Path & "/印刷工程單記錄.xls")
  6.     With ActiveWorkbook
  7.         For i = 6 To 8
  8.             Set sht = .Worksheets(i)
  9.             arr = sht.Cells(1, 2).Resize(Cells(sht.Rows.Count, 2).End(3).Row, 15).Value
  10.             For j = 2 To UBound(arr, 1)
  11.                 If Not dic.exists(arr(j, 1)) Then
  12.                     dic.Add arr(j, 1), arr(j, 2) & vbTab & arr(j, 15)
  13.                 End If
  14.             Next j
  15.         Next i
  16.         .Close False
  17.     End With
  18.     With Sheet3
  19.         m = .Cells(.Rows.Count, 3).End(3).Row - 4
  20.         .Range("d5:m" & m + 4).ClearContents
  21.         arr = Cells(5, 3).Resize(m, 1).Value
  22.         ReDim arrt(1 To m, 1 To 5)
  23.         For i = 1 To UBound(arr, 1)
  24.             If arr(i, 1) <> "" And dic.exists(arr(i, 1)) Then
  25.                 arrt(i, 3) = "×"
  26.                 arr1 = Split(dic(arr(i, 1)), vbTab)
  27.                 arrt(i, 1) = arr1(0)
  28.                 n1 = InStr(1, arr1(1), "x")
  29.                 n2 = InStr(1, arr1(1), "X")
  30.                 If n1 + n2 > 0 Then
  31.                     arr2 = Split(arr1(1), IIf(n1 > 0, "x", "X"))
  32.                     arrt(i, 2) = arr2(0)
  33.                     arrt(i, 4) = Split(Trim(arr2(1)))(0)
  34.                     arrt(i, 5) = Application.WorksheetFunction.Round(Val(arrt(i, 2)) * Val(arrt(i, 4)), 2)
  35.                     Else: arrt(i, 2) = "": arrt(i, 4) = "": arrt(i, 5) = ""
  36.                 End If
  37.                 Else
  38.                 For j = 1 To 5
  39.                     arrt(i, j) = ""
  40.                 Next j
  41.             End If
  42.         Next i
  43.         .Cells(5, 4).Resize(m, 1) = Application.Index(arrt, , 1)
  44.         For i = 1 To 4
  45.             .Cells(5, "j").Offset(0, i - 1).Resize(m, 1) = Application.Index(arrt, , i + 1)
  46.         Next i
  47.     End With
  48.     Application.ScreenUpdating = True
  49.     Set dic = Nothing
  50. End Sub


2楼
xing_xingyou
又学了一招,谢谢!
3楼
7786910
没学会

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap