作者:手机用户2502912857 | 来源:互联网 | 2023-05-28 12:21
我试图找出如何使用VBA检查公共地址簿中是否有电子邮件地址.我在Web上找到了一些代码,对其进行了修改但是代码在行中出现了错误91"Set doc = view.GetAllDocumentsByKey(ChkEmailAddr)." 我认为问题与变量"view"的声明类型或"Set view = b.GetView("People\By Internet Mail")行中的视图类型有关."
我很确定我已经激活了所有正确的引用.选择"Lotus Notes Domino Objects"和"Lotus Notes Automation Classes".
我试图获得一个视图列表,但我无法弄清楚如何做到这一点.您是否在我的代码中看到错误或者有什么想法可以尝试进行一些故障排除?
Sub CheckEmailAddress()
Dim books As Variant
Dim view As lotus.NotesView
'Dim view As Object
Dim doc As NotesDocumentCollection
Dim dc As NotesDocument
Dim done As Variant
Dim docarr(3, 50) As Variant
Dim ChkEmailAddr As String
ChkEmailAddr = "tyrone.sunde@usbank.com"
Set Session = CreateObject("Notes.Notessession")
books = Session.AddressBooks
dOne= False
For Each b In books
' check every public address book,
' unless we're already done
If (b.IsPublicAddressBook) Then
Debug.Print TypeName(b)
Call b.Open("", "")
Debug.Print b.Title
' look up person's last name
' in People view of address book
Set view = b.GetView("People\By Internet Mail")
Debug.Print TypeName(view)
'Debug.Print view
'Set view = b.GetView("main")
'Debug.Print TypeName(view)
Set doc = view.GetAllDocumentsByKey(ChkEmailAddr)
' if person is found, display the phone number item
'from the Person document
If Not (doc Is Nothing) Then
For j = 0 To doc.Count
docarr(0, j) = doc.GetNthDocument(j).Items(11).Text
docarr(1, j) = doc.GetNthDocument(j).Items(93).Text
docarr(2, j) = doc.GetNthDocument(j).Items(95).Text
docarr(3, j) = doc.GetNthDocument(j).Items(14).Text
Next j
End If
End If
Next b
findEmailLotus = docarr
结束子
1> Richard Schw..:
我很抱歉这样说,但你这里有很多问题.编写你开始的代码的人不知道他或她在做什么.
首先,除非您在代码运行时要求Notes客户端正在运行,否则您应该使用Lotus.NotesSession
而不是Notes.NotesSession
.(前者对应于"Lotus Notes Domino Objects",并使用COM与Notes API对话,后者对应于"Lotus Notes自动化类,并使用OLE与Notes客户端通信以与API通信 - 因此要求客户端必须运行.)
其次,您还没有提到您正在处理的Lotus Notes版本,但是更新的版本(8及更高版本)包含了一个NotesDirectory
类,其中包含一个LoookupNames方法,它可能比您自己的代码编写更好的解决方案.循环通过地址簿.
第三,做完set view
手术后,你真的应该做一个If Not view is Nothing
测试.这将告诉您实际上是否在打开视图时遇到问题.
第四,doc
来自的返回值是一个非常糟糕的变量名GetAllDocumentsByKey
.在编写Notes代码20多年后,我可以说任何阅读Notes代码的人都希望变量名doc
始终引用单个文档.你得到的NotesDocumentCollection
不是一份文件.帮自己一个忙,把它换成docs
或者dc
除了之外的任何东西doc
.
第五,GetNthDocument
通常不建议在这种情况下使用.它在大型集合中表现非常糟糕.然而,更糟糕的是,当你每次迭代只能进行一次调用时,你会调用它四次.而不是For
循环,考虑将其更改为调用GetFirstDocument
后跟While Not doc is Nothing
循环,该循环检索项值并将它们存储在数组中,然后getNextDocument
在循环的底部调用.
第六,该代码引用.Items(11)
,.Items(93)
......这是完全错误的.任何给定文档中的可用项都是可变的,因为Notes是无模式的.那些项目编号将指代不同人的不同字段 - 即,基本上是随机值.那可能不是你想要的.您应该使用getFirstItem()
具有您真正想要放入数组的项目的实际名称的调用.您需要研究Domino目录中使用的字段名称来解决这个问题.我推荐NotesPeek作为一个很好的工具,用于探索Notes数据库和/或只是在Domino Designer客户端中打开Domino目录,并查看Person表单(和相关的子表单)以找出您需要的内容.
至于您询问的实际错误,我的猜测是,通过添加推荐的测试,If Not view Is Nothing
您将获得更多信息,但可能还不够.你还没有提到你的调试打印产生了什么,但我相信有些情况下标题可用,即使数据库没有成功打开,所以我认为你不应该相信这是一个测试是否调用工作.事实上,你真的不应该只是Call db.open("","")
打电话.你应该做一个If db.open("","") = true
测试它是否真的有效.