Excel精英培训网

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

[已解决]用VBA怎么做到

[复制链接]
发表于 2017-4-4 21:29 | 显示全部楼层 |阅读模式
老师们,这个我以前用的是公式VLOOKUP+left做的,感觉怎么也没VBA好,所以想用VBA做下,还请老师们帮助下呀,谢谢
还有我用VLOOKUP+left做的时候总有错误,就是基础表和总表对比的格式有区别,比如基础表A列示文本或有空格或有隐藏的字符什么,公式就处理不太好了,不知道VBA是否能很好的解决这点。
最佳答案
2017-4-14 12:43
excel白兔 发表于 2017-4-14 10:48
老师这个很好,但是有个问题,基础 表55,80行* 全部科目带入科目试算平衡表表中数据错误,是不是没有精 ...


当时没有考虑最后一行* 全部科目,全部是以前置数字串来判断的,而且截取数字串的方法是以按空格进行分列后得到,
所以* 全部科目截取到的是字符“*”,*是个通配符,所以无法正确获取数据。
如果你表格的内容基本是固定的,而且特例只有这一个* 全部科目的话,请用以下代码:
Sub aaa()
Dim i&, rng As Range, s$, arr
For i = 3 To [a65536].End(3).Row
  arr = Split(Trim(Cells(i, 1)), " ")
  s = arr(0)
  If s = "*" Then s = arr(1)
  Set rng = Sheets(1).Columns(1).Find(s, lookat:=xlPart)
  If Not rng Is Nothing Then Cells(i, 2).Resize(, 4) = rng.Offset(, 1).Resize(, 4).Value
Next i
End Sub

VBA处理.rar

12.5 KB, 下载次数: 12

VBA

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-4-5 08:33 | 显示全部楼层
Private Sub CommandButton1_Click()
For i2 = 3 To Sheet2.Range("A65536").End(xlUp).Row
    For i1 = 3 To Sheet1.Range("A65536").End(xlUp).Row
      If Sheet1.Cells(i1, 1) = Sheet2.Cells(i2, 1) Then
         For j = 2 To 5
          Sheet2.Cells(i2, j) = Sheet1.Cells(i1, j)
         Next
      End If
    Next
Next
End Sub
回复

使用道具 举报

发表于 2017-4-5 10:14 | 显示全部楼层
以下代码在“科目试算平衡表”内运行
  1. Sub aaa()
  2. Dim i&, rng As Range, s$
  3. For i = 3 To [a65536].End(3).Row
  4.   s = Split(Trim(Cells(i, 1)), " ")(0)
  5.   Set rng = Sheets(1).Columns(1).Find(s, lookat:=xlPart)
  6.   If Not rng Is Nothing Then Cells(i, 2).Resize(, 4) = rng.Offset(, 1).Resize(, 4).Value
  7. Next i
  8. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-4-14 10:48 | 显示全部楼层
大灰狼1976 发表于 2017-4-5 10:14
以下代码在“科目试算平衡表”内运行

老师这个很好,但是有个问题,基础 表55,80行* 全部科目带入科目试算平衡表表中数据错误,是不是没有精确查找?能帮我改下代码吗?我在测试下谢谢老师
回复

使用道具 举报

 楼主| 发表于 2017-4-14 10:52 | 显示全部楼层
yanhj 发表于 2017-4-5 08:33
Private Sub CommandButton1_Click()
For i2 = 3 To Sheet2.Range("A65536").End(xlUp).Row
    For i1  ...

谢谢老师的帮助
有个问题为什么我弄个按钮右击设置宏为什么找不到你这个呢?就是简单的说我弄个按钮触发运行代码找不到不到为什么?
回复

使用道具 举报

发表于 2017-4-14 12:43 | 显示全部楼层    本楼为最佳答案   
excel白兔 发表于 2017-4-14 10:48
老师这个很好,但是有个问题,基础 表55,80行* 全部科目带入科目试算平衡表表中数据错误,是不是没有精 ...


当时没有考虑最后一行* 全部科目,全部是以前置数字串来判断的,而且截取数字串的方法是以按空格进行分列后得到,
所以* 全部科目截取到的是字符“*”,*是个通配符,所以无法正确获取数据。
如果你表格的内容基本是固定的,而且特例只有这一个* 全部科目的话,请用以下代码:
Sub aaa()
Dim i&, rng As Range, s$, arr
For i = 3 To [a65536].End(3).Row
  arr = Split(Trim(Cells(i, 1)), " ")
  s = arr(0)
  If s = "*" Then s = arr(1)
  Set rng = Sheets(1).Columns(1).Find(s, lookat:=xlPart)
  If Not rng Is Nothing Then Cells(i, 2).Resize(, 4) = rng.Offset(, 1).Resize(, 4).Value
Next i
End Sub
回复

使用道具 举报

发表于 2017-4-14 12:44 | 显示全部楼层
02.<P> </P>请无视,看下面的代码
回复

使用道具 举报

 楼主| 发表于 2017-4-17 10:47 | 显示全部楼层
大灰狼1976 发表于 2017-4-14 12:43
当时没有考虑最后一行* 全部科目,全部是以前置数字串来判断的,而且截取数字串的方法是以按空格进行分 ...

老师这个结果可以,但是我不是很懂这代码的意思,能否帮助我备注出来我自己好好理解理解谢谢老师
回复

使用道具 举报

发表于 2017-4-17 15:19 | 显示全部楼层
明天我来注释下
回复

使用道具 举报

 楼主| 发表于 2017-4-18 14:54 | 显示全部楼层

谢谢老师

Sub aaa()
Dim i&, rng As Range, s$, arr
For i = 3 To [a65536].End(3).Row
  arr = Split(Trim(Cells(i, 1)), " ")
  s = arr(0)
  If s = "*" Then s = arr(1)
  Set rng = Sheets(1).Columns(1).Find(s, lookat:=xlPart)
  If Not rng Is Nothing Then Cells(i, 2).Resize(, 4) = rng.Offset(, 1).Resize(, 4).Value
Next i
End Sub

老师我在您的基础上改了改为什么不对呢?
我有个工作表叫(SAP导出基础表)和  科目试算平衡表完毕   对比我应该怎么改呢老师
Sub aaa()
Dim i&, rng As Range, s$, arr
For i = 3 To [a65536].End(3).Row
  arr = Split(Trim(Cells(i, 1)), " ")
  s = arr(0)
  If s = "*" Then s = arr(1)
  Set rng = Sheets(”SAP导出基础表”).Columns(1).Find(s, lookat:=xlPart)
  If Not rng Is Nothing Then Cells(i, 2).Resize(, 4) = rng.Offset(, 1).Resize(, 4).Value
Next i
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 20:10 , Processed in 0.426893 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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