Excel精英培训网

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

[已解决]求助:VBA在海量药品中,提取需要的药品

[复制链接]
发表于 2014-10-6 10:43 | 显示全部楼层 |阅读模式
求助:VBA在海量药品中,提取需要的药品

当运行VBA时,弹出对话框,选择“需要提取的药品列”,及“总药品列”

确定后,提取到需要的药品,就像 文件中的手工表一样

请老师们帮帮忙,谢谢大家了!

VBA提取药品.rar (36.22 KB, 下载次数: 32)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-10-6 11:23 | 显示全部楼层
本帖最后由 xdragon 于 2014-10-6 11:25 编辑
  1. Sub 宏1()
  2.     Dim rng As Range
  3.     On Error GoTo endline
  4.     Set rng = Application.InputBox("请选择需要提取的药品列", "提示", , , , , , 8)
  5.     Set rng = Intersect(rng.Parent.UsedRange, rng)
  6.     Sheets("手工结果").Select
  7.     cells.clear
  8.     Sheets("全部药品").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
  9.         CriteriaRange:=rng, CopyToRange:=Range("A1"), _
  10.         Unique:=False
  11. endline:
  12. End Sub
复制代码
利用高级筛选录制宏就能搞定啦

忘记在导出结果前清空工作表了。加了一行

评分

参与人数 1 +12 收起 理由
yjwdjfqb + 12 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-10-6 11:32 | 显示全部楼层
VBA提取药品.rar (374.46 KB, 下载次数: 18)

评分

参与人数 1 +9 收起 理由
yjwdjfqb + 9 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-10-6 20:54 | 显示全部楼层
xdragon 发表于 2014-10-6 11:23
利用高级筛选录制宏就能搞定啦

忘记在导出结果前清空工作表了。加了一行

老师你好,我测试了下,提取的数据不对

数据应该是手工表中那些内容
回复

使用道具 举报

发表于 2014-10-7 01:34 | 显示全部楼层
yjwdjfqb 发表于 2014-10-6 20:54
老师你好,我测试了下,提取的数据不对

数据应该是手工表中那些内容

只是顺序不一致,内容都对啊。你需要结果和你那张表一模一样吗?。。。
回复

使用道具 举报

发表于 2014-10-7 11:12 | 显示全部楼层
本帖最后由 huizhiaisha 于 2014-10-7 11:19 编辑

我日文系统,传不了附件,你留个邮箱发给你
回复

使用道具 举报

 楼主| 发表于 2014-10-7 12:49 | 显示全部楼层
xdragon 发表于 2014-10-7 01:34
只是顺序不一致,内容都对啊。你需要结果和你那张表一模一样吗?。。。

哦,只要内容一样就行了,谢谢老师!
我再核对下数据,非常的感谢!
回复

使用道具 举报

 楼主| 发表于 2014-10-8 11:50 | 显示全部楼层
QLZ0602 发表于 2014-10-6 11:32
是不是这样?

Sub demo()
    Dim rng1 As Range, rng2 As Range, nr As Long, nc As Long
    Dim i, j, k, n
    Dim arr, brr, crr, drr
    On Error Resume Next
    Set rng1 = Application.InputBox("请选择需要提取的药品列", "选择", , , , , , 8)
    If rng1 Is Nothing Then Exit Sub
    On Error Resume Next
    Set rng2 = Application.InputBox("请选择全部药品列", "选择", , , , , , 8)
    If rng2 Is Nothing Then Exit Sub
    With Sheets("全部药品")
        nr = .Cells(Rows.Count, 1).End(xlUp).Row
        nc = .Cells(1, Columns.Count).End(xlToLeft).Column
        arr = .Range(.Cells(1, 1), .Cells(nr, nc))
        brr = rng1.Value
        crr = rng2.Value
        ReDim drr(1 To UBound(arr), 1 To UBound(arr, 2))
        For i = 2 To UBound(arr)
            For j = 1 To UBound(crr)
                If brr(j, 1) = "" Then Exit For
                If brr(j, 1) = crr(i, 1) Then
                    n = n + 1
                    For k = 1 To UBound(arr, 2)
                        drr(n, k) = arr(i, k)
                    Next
                    Exit For
                End If
            Next
        Next
        For k = 1 To UBound(arr, 2)
            drr(1, k) = arr(1, k)
        Next
    End With
    With Sheets("模拟")
        .Cells.Clear
        .Range("a1").Resize(n, UBound(drr, 2)) = drr
    End With
End Sub


老师你好,这个可以,但是提取时,没有带格式提取

请老师帮帮我修改下,可以带格式提取,好吧,谢谢老师了!
回复

使用道具 举报

发表于 2014-10-8 15:15 | 显示全部楼层
如果按“全部药品”表的顺序。。。。。。。。。
  1. Sub demo()
  2.     Dim CopyRng As Range
  3.     Set d = CreateObject("scripting.dictionary")
  4.     brr = Sheets("需提取药品").[d2].CurrentRegion
  5.     With Sheets("全部药品")
  6.         arr = .[a1].CurrentRegion
  7.         Set CopyRng = .[a1:o1]
  8.         For i = 2 To UBound(arr)
  9.             d(arr(i, 3)) = d(arr(i, 3)) & "," & i
  10.         Next
  11.         For i = 2 To UBound(brr)
  12.             k = d(brr(i, 1))
  13.             If Len(k) > 0 Then
  14.                 krr = Split(k, ",")
  15.                 For j = 1 To UBound(krr)
  16.                     x = Val(krr(j))
  17.                     Set CopyRng = Union(CopyRng, .Range("a" & x & ":o" & x))
  18.                 Next
  19.             End If
  20.         Next
  21.     End With
  22.         
  23.     With Sheets("手工结果")
  24.         .Cells.Clear
  25.         CopyRng.Copy .[a1]
  26.     End With
  27. End Sub
复制代码
回复

使用道具 举报

发表于 2014-10-8 15:20 | 显示全部楼层
如果按“需提取药品”表的顺序。。。。。。。。。
  1. Sub demo()
  2.     Dim Sh As Worksheet
  3.     Set Sh = Sheets("手工结果")
  4.     Set d = CreateObject("scripting.dictionary")
  5.     brr = Sheets("需提取药品").[d2].CurrentRegion
  6.     Sh.Cells.Clear
  7.     With Sheets("全部药品")
  8.         arr = .[a1].CurrentRegion
  9.         .[a1:o1].Copy Sh.[a1]
  10.         For i = 2 To UBound(arr)
  11.             d(arr(i, 3)) = d(arr(i, 3)) & "," & i
  12.         Next
  13.         For i = 2 To UBound(brr)
  14.             k = d(brr(i, 1))
  15.             If Len(k) > 0 Then
  16.                 krr = Split(k, ",")
  17.                 For j = 1 To UBound(krr)
  18.                     x = Val(krr(j))
  19.                     n = n + 1
  20.                     .Range("a" & x & ":o" & x).Copy Sh.Cells(n + 1, 1)
  21.                     Sh.Cells(n + 1, 1) = n
  22.                 Next
  23.             End If
  24.         Next
  25.     End With
  26. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:34 , Processed in 0.619624 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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