Excel精英培训网

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

[已解决]求一段类似vlookup的代码,条件有点多,求大神相助

[复制链接]
发表于 2015-6-12 11:27 | 显示全部楼层 |阅读模式
本帖最后由 eking_tang 于 2015-6-12 13:59 编辑

因为其他原因,不能用公式,只能求VBA代码,麻烦各位了,感谢先.
最佳答案
2015-6-12 13:04
  1. Sub ddd()
  2.     Dim dic As Object, d As Object, arr, sht As Worksheet
  3.     Dim iRow%, i%, j%, n%, brr()
  4.     Set dic = CreateObject("Scripting.Dictionary")
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     With ThisWorkbook
  7.         arr = .Sheets("RATE").Range("A1").CurrentRegion
  8.         For i = LBound(arr, 2) + 2 To UBound(arr, 2)
  9.             dic(arr(1, i)) = i           '存储列信息
  10.         Next
  11.         For j = LBound(arr) + 1 To UBound(arr)
  12.             d(CInt(arr(j, 1))) = j             '存储行信息
  13.         Next
  14.         For Each sht In .Sheets          '循环工作表
  15.             If sht.name <> "RATE" Then
  16.                 iRow = sht.Cells(sht.Rows.Count, "B").End(xlUp).row
  17.                 ReDim brr(1 To iRow - 6)
  18.                 For n = 7 To iRow
  19.                     brr(n - 6) = arr(d(CInt(sht.Cells(n, "B"))), dic(sht.name))
  20.                 Next
  21.                 sht.Cells(8, "A").Resize(iRow - 7, 1).ClearContents
  22.                 sht.Cells(8, "A").Resize(iRow - 7, 1) = Application.Transpose(brr)
  23.             End If
  24.         Next
  25.         Set dic = Nothing
  26.         Set d = Nothing
  27.     End With
  28. End Sub
复制代码

2.zip

56.96 KB, 下载次数: 33

发表于 2015-6-12 13:04 | 显示全部楼层    本楼为最佳答案   
  1. Sub ddd()
  2.     Dim dic As Object, d As Object, arr, sht As Worksheet
  3.     Dim iRow%, i%, j%, n%, brr()
  4.     Set dic = CreateObject("Scripting.Dictionary")
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     With ThisWorkbook
  7.         arr = .Sheets("RATE").Range("A1").CurrentRegion
  8.         For i = LBound(arr, 2) + 2 To UBound(arr, 2)
  9.             dic(arr(1, i)) = i           '存储列信息
  10.         Next
  11.         For j = LBound(arr) + 1 To UBound(arr)
  12.             d(CInt(arr(j, 1))) = j             '存储行信息
  13.         Next
  14.         For Each sht In .Sheets          '循环工作表
  15.             If sht.name <> "RATE" Then
  16.                 iRow = sht.Cells(sht.Rows.Count, "B").End(xlUp).row
  17.                 ReDim brr(1 To iRow - 6)
  18.                 For n = 7 To iRow
  19.                     brr(n - 6) = arr(d(CInt(sht.Cells(n, "B"))), dic(sht.name))
  20.                 Next
  21.                 sht.Cells(8, "A").Resize(iRow - 7, 1).ClearContents
  22.                 sht.Cells(8, "A").Resize(iRow - 7, 1) = Application.Transpose(brr)
  23.             End If
  24.         Next
  25.         Set dic = Nothing
  26.         Set d = Nothing
  27.     End With
  28. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
eking_tang + 3 衷心感謝

查看全部评分

回复

使用道具 举报

发表于 2015-6-12 13:33 | 显示全部楼层
  1. Sub 按钮5_Click()
  2.     Dim arr, k&, il&
  3.     Dim dic, a&, st
  4.     Set dic = CreateObject("scripting.dictionary")
  5.     If Sheets("RATE").UsedRange.Count > 1 Then arr = Sheets("RATE").UsedRange
  6.     For k = 1 To UBound(arr, 2)
  7.         If ActiveSheet.name = arr(1, k) Then il = k: Exit For
  8.     Next k
  9.     For k = 1 To UBound(arr, 1)
  10.         dic(arr(k, 1)) = arr(k, il)
  11.     Next k
  12.     Set rg = ActiveSheet.Range("b7")
  13.     Do While Len(rg.Offset(a, 0)) > 0
  14.         st = rg.Offset(a, 0).Value
  15.         If dic.exists(st) = True Then
  16.             rg.Offset(a + 1, -1) = dic.Item(st)
  17.         End If
  18.         a = a + 1
  19.     Loop
  20. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
eking_tang + 3 衷心感謝

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 23:34 , Processed in 0.310039 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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