1.问题:数据类型
你的代码是不能工作的几个原因:
的PORTNAME字段存储为DataTypeEnum 12(自动化变体:DBTYPE_VARIANT)
DBTYPE_VARIANT不支持与ADO一起使用(source)。
CopyFromRecordset具有已知数据类型的问题(source)
注:所有其他字段被存储为DataTypeEnum 202(空终止的Unicode字符串)。
2.解决方案
您需要通过记录迭代并导入到PORTNAME一个字符串,然后写一个字符串到正确的单元格。这确保VBA处理转换,而不是尝试确定(in)正确数据类型的CopyFromRecordset。如果您想通过有限的修改来保留原始代码,我在下面提供了一个简单的示例。
我能够在我的机器上复制您的问题;以下修改后的代码按预期工作并包含IP。
Private Sub GetAllPrintersFromAD()
Const ADS_SCOPE_SUBTREE = 2
Set objRoot = GetObject("LDAP://rootDSE")
strDomain = objRoot.Get("defaultNamingContext")
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"SELECT distinguishedName,portName,location,servername FROM 'LDAP://" & strDomain & "' WHERE objectClass='printQueue'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
ActiveSheet.Range("A2").CopyFromRecordset objRecordSet
'Copy over the portName field properly
objRecordSet.MoveFirst
i = 2
Do Until objRecordSet.EOF
strportname = vbNullString
On Error Resume Next
strportname = objRecordSet.Fields("portName")
Err.Clear
On Error GoTo 0
ActiveSheet.Range("B" & i).Value2 = strportname
i = i + 1
objRecordSet.MoveNext
Loop
objRecordSet.Close
objConnection.Close
End Sub