Excel精英培训网

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

[已解决]find函数“运行时错误:'91':对象变量或 With 块变量未设置”

[复制链接]
发表于 2014-1-15 19:40 | 显示全部楼层 |阅读模式
如图1,需要根据文件2各工作表的c6单元格的内容,在文件1的aa列查找对应的行数(图2),再在该行的o列(“薄片鉴定”列)录入文件2同一工作表的F7单元格的岩石名称。例如,本例中需要根据文件2的“薄片鉴定”工作表C6 单元格的“CK170+860.30右0.01m”,在文件1的AA列查找到它在第37行,并在文件1的o列37行填写文件2的F7单元格内容“强硅化二云斜长变粒岩”。我编写的代码如下:
Sub 自动录入薄片鉴定结果()
Dim f, wb, wh, x, m1
f = Application.GetOpenFilename("Excel2003,*.xls,Excel2010,*.xlsx", 1)
Set wb = Workbooks.Open(f)
Set wh = ThisWorkbook.Sheets(1)
wh.Activate
wc = wb.Sheets.Count
    For x = 1 To wc
    With wb.Sheets(x)
        m1 = wh.Range("aa:aa").Find(.Range("c6"), LookAt:=xlWhole).Row
        wh.Range("o" & m1) = .[f7]
    End With
    Next x
End Sub
运行后报错如图3。请高手指点一二~~
最佳答案
2014-1-16 09:42
本帖最后由 810126769 于 2014-1-16 09:53 编辑
tongxon 发表于 2014-1-15 21:32
可是“CK170+860.30右0.01m”确实有试验结果啊,如果按照你的代码,程序找不到CK170+860.30右0.01m后机会 ...

原来没有注意到,以为真的没有
CK170+860.30右0.01m

这个数据,看了你的问题,再仔细查看了一下,真的有这个数据,只是它们是不完全不相同的,EXCEL就认为它们不同。

你再仔细看看,2.xls的表1中的  
CK170+860.30右0.01m     的“右”字前没有空格,而1.xls中AA列的这个数据
CK170+860.30  右0.01m在下面,它的“右”字前有一个空格。这对于EXCEL来说,它们就不是同一个数据。所以还是查找不到。

CK170+860.30  右0.01m


你的数据太不规范了,有的中间有空格,有的没有空格。不太好处理。





图片1

图片1

图片2

图片2

图片3

图片3

附件.rar

20.19 KB, 下载次数: 13

附件

发表于 2014-1-15 20:52 | 显示全部楼层
本帖最后由 810126769 于 2014-1-15 20:53 编辑

当find查找不到要查找的内容时,它就不能返回单元格对象,这个时候就不能用  .row  属性来返回行号,所以出现错误。可以作以下修改:

加一个判断语句,如果查找到,就取得这个单元格的行号,如果查找不到,就查找下一个工作表中的C6单元格中的内容。

代码如下:
  1. Sub 自动录入薄片鉴定结果()
  2. Dim f, wb, wh, x, m1, r&
  3. f = Application.GetOpenFilename("Excel2003,*.xls,Excel2010,*.xlsx", 1)
  4. Set wb = Workbooks.Open(f)
  5. Set wh = ThisWorkbook.Sheets(1)
  6. wh.Activate
  7. wc = wb.Sheets.Count
  8.     For x = 1 To wc
  9.     With wb.Sheets(x)
  10.    
  11.       Set m1 = wh.Range("aa:aa").Find(.Range("c6"), LookAt:=xlWhole)
  12.        If Not m1 Is Nothing Then
  13.           r = m1.Row
  14.         wh.Range("o" & r) = .[f7]
  15.        End If
  16.     End With
  17.     Next x
  18. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-1-15 21:32 | 显示全部楼层
810126769 发表于 2014-1-15 20:52
当find查找不到要查找的内容时,它就不能返回单元格对象,这个时候就不能用  .row  属性来返回行号,所以出 ...

可是“CK170+860.30右0.01m”确实有试验结果啊,如果按照你的代码,程序找不到CK170+860.30右0.01m后机会跳过去,那在总表里岂不是漏掉了这个数据?
回复

使用道具 举报

 楼主| 发表于 2014-1-15 21:38 | 显示全部楼层
810126769 发表于 2014-1-15 20:52
当find查找不到要查找的内容时,它就不能返回单元格对象,这个时候就不能用  .row  属性来返回行号,所以出 ...

我想知道,明明总表里有这个,程序为什么匹配不到呢?
回复

使用道具 举报

发表于 2014-1-15 21:59 | 显示全部楼层
tongxon 发表于 2014-1-15 21:38
我想知道,明明总表里有这个,程序为什么匹配不到呢?

不是找不到结果,而是有点小问题:
例如~~~~~find(.range("c6"))
这个点前面要有with语句的
或者不用with,这句改成~~~~~find(wh.range("c6"))
试试?
回复

使用道具 举报

 楼主| 发表于 2014-1-15 22:09 | 显示全部楼层
leixiao123 发表于 2014-1-15 21:59
不是找不到结果,而是有点小问题:
例如~~~~~find(.range("c6"))
这个点前面要有with语句的

前面有With wb.Sheets(x)语句啊,应该不是这个问题。
回复

使用道具 举报

发表于 2014-1-16 09:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 810126769 于 2014-1-16 09:53 编辑
tongxon 发表于 2014-1-15 21:32
可是“CK170+860.30右0.01m”确实有试验结果啊,如果按照你的代码,程序找不到CK170+860.30右0.01m后机会 ...

原来没有注意到,以为真的没有
CK170+860.30右0.01m

这个数据,看了你的问题,再仔细查看了一下,真的有这个数据,只是它们是不完全不相同的,EXCEL就认为它们不同。

你再仔细看看,2.xls的表1中的  
CK170+860.30右0.01m     的“右”字前没有空格,而1.xls中AA列的这个数据
CK170+860.30  右0.01m在下面,它的“右”字前有一个空格。这对于EXCEL来说,它们就不是同一个数据。所以还是查找不到。

CK170+860.30  右0.01m


你的数据太不规范了,有的中间有空格,有的没有空格。不太好处理。





回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 07:55 , Processed in 0.270308 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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