我试图弄清楚如何使用VBA检查公共地址簿中是否有电子邮件地址。我在Web上找到了一些代码,对其进行了修改,但代码在行中出现了错误91,"设置doc = view.GetAllDocumentsByKey(ChkEmailAddr)。"我认为这个问题与变量的声明类型有关" view"或者行中的视图类型"设置视图= b.GetView(" People \ By Internet Mail")。"
我非常确定我已经激活了所有正确的引用。 " Lotus Notes Domino Objects"和#34; Lotus Notes自动化类"被选中。
我试图获得一个视图列表,但我无法弄清楚如何做到这一点。您是否在我的代码中看到错误或者有什么想法可以尝试进行一些故障排除?
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
End Sub
答案 0 :(得分:8)
我很抱歉这样说,但你在这里有很多很多的问题。编写你开始的代码的人不知道他或她在做什么。
首先,除非您在代码运行时要求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
来测试它是否真的有效。
答案 1 :(得分:2)
对于了解莲花笔记的人来说,这是一种琐事。对于那些不这样做的人,可能有一种更简单的方式使用Web访问。
请求此地址 保留你的cookies
http://server/names.nsf?login&username=MYUSERNAM&password=MYPASSWORD
然后访问此网址并查找404状态或200状态
http://server/names.nsf/($Users)/email@domain.com?opendocument
当然,这需要您在服务器上启用Web访问,并且在许多情况下将密码放入代码中是不好的,如果您的服务器以某种方式配置,它将无法工作。
在编码之前,请在您的服务器上进行测试。