由于不能为Variant分配一个Array值,因此FN过程的返回值变暗 [英] Return value of FN procedure dim'd as Variant cannot be assigned an Array value

查看:66
本文介绍了由于不能为Variant分配一个Array值,因此FN过程的返回值变暗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



以下程序在
http://ffdba.com/downloads/Send_Mail...ok_Express.htm

旨在协同工作,通过OE实现电子邮件发送。

最后一个程序(FN SplitB)在其最后一行失败,这意味着

赋予SplitB(一个变体)的值aSplit的值(

数组暗淡'作为变体)。由于类型不匹配而失败。任何人

知道如何解决这个问题吗?


私有类型MapiRecip

保留为长

RecipClass As Long

Name as String

Address as String

EIDSize As Long

EntryID As Long

结束类型


私有类型MAPIFileDesc

保留为长

标志为长

Position As Long

PathName As String

fileName As String

FileType As Long

结束类型


私有类型MAPIMessage

保留为长

主题为字符串

NoteText为字符串

MessageType As String

DateReceived As String

ConversationID As String

Originator As Long

flags As很长

RecipCount As Long

收件人为长

FileCount为长

文件为长

结束类型


声明函数MAPISendMail _

Lib" ; c:\program files\outlook express\msoe.dll" (_

ByVal会话长,_

ByVal UIParam As Long,_

消息作为MAPIMessage,_

ByVal标志为长,_

ByVal保留为长)


Public Sub SendMailWithOE(ByVal vSubject As String,_

ByVal vMessage As String,_

ByRef vRecipients As String,_

可选ByVal vFiles As String)


Dim aFiles ()As String

Dim aRecips()As String


Dim FilePaths()As MAPIFileDesc

Dim Recips()As MapiRecip

作为MAPIMessage的暗淡消息


Dim z As Long


aFiles = Split(vFiles,"," ;)

ReDim文件路径(LBound(aFiles)到UBound(aFiles))

对于z = LBound(aFiles)到UBound(aFiles)

使用FilePaths(z)

.Position = -1

.PathName = StrConv(aFiles(z),vbFromUnicode)

结束

下一页z


aRecips =拆分(vRecipients,",")

ReDim Recips(LBound(aRecips)To UBound(aRecips))

for z = LBound(aRecips)To UBound(aRecips)

With Recips(z)

.RecipClass = 1

如果InStr(aRecips(z)," @")< 0那么

.Address = StrConv(aRecips(z),vbFromUnicode)

Else

.Name = StrConv(aRecips(z),vbFromUnicode)

结束如果

结束

下一页z


带消息

.FileCount = UBound(FilePaths) - LBound(FilePaths)+ 1

.Files = VarPtr(FilePaths(LBound(FilePaths)))

.NoteText = vMessage

.RecipCount = UBound(Recips) - LBound(Recips)+ 1

.Recipients = VarPtr(Recips(LBound(Recips)))

.Subject = vSubject

结束

MAPISendMail 0,0,消息,0,

结束子


私有子Test_SendMailWithOE()

Dim aFiles()As Variant

Dim aRecips()As String

Dim Files as String

Dim Messag e As String

Dim Recipients As String

Dim Subject As String


''不需要

Files =" C:\ twacker.log"

Files = Files& "," &安培; C:\readme.txt


''需要

收件人=所以***** @ Some.Domain


''不需要

收件人=收件人& "," &安培; 所以********* @ SomeOther.Domain


消息=如果你知道的话,请告诉我。


主题=测试


SendMailWithOE主题,消息,收件人,文件


结束子

公共函数SplitB(ByVal SplitString As String,ByVal Delimiter As

String)As Variant

Dim Position As Long

Dim aSplit()As Variant

Dim Dimension As Long

Position = InStr(SplitString,Delimiter)

Do While Position< 0

ReDim保留aSplit(尺寸)

aSplit(UBound(aSplit))=修剪(左(SplitString,Position - 1))

SplitString = Mid $(SplitString,Position + 1)

Dimension = Dimension + 1

Position = InStr(SplitString,Delimiter)

Loop

ReDim保留aSplit(维度)

aSplit(维度)=修剪(SplitString)

SplitB = aSplit

结束功能


The following procedures found at
http://ffdba.com/downloads/Send_Mail...ok_Express.htm
are meant to work together in harmony to effect eMail sends via OE.
The last procedure (FN SplitB) fails on its last line which is meant
to assign the value of SplitB (a variant) the value of aSplit (an
array dim''d as variant). That fails due to Type Mismatch. Anyone
know how to get around this?

Private Type MapiRecip
Reserved As Long
RecipClass As Long
Name As String
Address As String
EIDSize As Long
EntryID As Long
End Type

Private Type MAPIFileDesc
Reserved As Long
flags As Long
Position As Long
PathName As String
fileName As String
FileType As Long
End Type

Private Type MAPIMessage
Reserved As Long
Subject As String
NoteText As String
MessageType As String
DateReceived As String
ConversationID As String
Originator As Long
flags As Long
RecipCount As Long
Recipients As Long
FileCount As Long
Files As Long
End Type

Declare Function MAPISendMail _
Lib "c:\program files\outlook express\msoe.dll" ( _
ByVal Session As Long, _
ByVal UIParam As Long, _
Message As MAPIMessage, _
ByVal flags As Long, _
ByVal Reserved As Long) As Long

Public Sub SendMailWithOE(ByVal vSubject As String, _
ByVal vMessage As String, _
ByRef vRecipients As String, _
Optional ByVal vFiles As String)

Dim aFiles() As String
Dim aRecips() As String

Dim FilePaths() As MAPIFileDesc
Dim Recips() As MapiRecip
Dim Message As MAPIMessage

Dim z As Long

aFiles = Split(vFiles, ",")
ReDim FilePaths(LBound(aFiles) To UBound(aFiles))
For z = LBound(aFiles) To UBound(aFiles)
With FilePaths(z)
.Position = -1
.PathName = StrConv(aFiles(z), vbFromUnicode)
End With
Next z

aRecips = Split(vRecipients, ",")
ReDim Recips(LBound(aRecips) To UBound(aRecips))
For z = LBound(aRecips) To UBound(aRecips)
With Recips(z)
.RecipClass = 1
If InStr(aRecips(z), "@") <0 Then
.Address = StrConv(aRecips(z), vbFromUnicode)
Else
.Name = StrConv(aRecips(z), vbFromUnicode)
End If
End With
Next z

With Message
.FileCount = UBound(FilePaths) - LBound(FilePaths) + 1
.Files = VarPtr(FilePaths(LBound(FilePaths)))
.NoteText = vMessage
.RecipCount = UBound(Recips) - LBound(Recips) + 1
.Recipients = VarPtr(Recips(LBound(Recips)))
.Subject = vSubject
End With
MAPISendMail 0, 0, Message, 0, 0
End Sub

Private Sub Test_SendMailWithOE()
Dim aFiles() As Variant
Dim aRecips() As String
Dim Files As String
Dim Message As String
Dim Recipients As String
Dim Subject As String

'' not required
Files = "C:\twacker.log"
Files = Files & "," & "C:\readme.txt"

'' required
Recipients = "So*****@Some.Domain"

'' not required
Recipients = Recipients & "," & "So*********@SomeOther.Domain"

Message = "Let me know if you get this, please."

Subject = "Test"

SendMailWithOE Subject, Message, Recipients, Files

End Sub

Public Function SplitB(ByVal SplitString As String, ByVal Delimiter As
String) As Variant
Dim Position As Long
Dim aSplit() As Variant
Dim Dimension As Long
Position = InStr(SplitString, Delimiter)
Do While Position <0
ReDim Preserve aSplit(Dimension)
aSplit(UBound(aSplit)) = Trim(Left(SplitString, Position - 1))
SplitString = Mid$(SplitString, Position + 1)
Dimension = Dimension + 1
Position = InStr(SplitString, Delimiter)
Loop
ReDim Preserve aSplit(Dimension)
aSplit(Dimension) = Trim(SplitString)
SplitB = aSplit
End Function

推荐答案

(SplitString,Position + 1)

Dimension = Dimension + 1

Position = InStr(SplitString,Delimiter) )

循环

ReDim保留aSplit(维度)

aSplit(维度)=修剪(SplitString)

SplitB = aSplit

结束函数
(SplitString, Position + 1)
Dimension = Dimension + 1
Position = InStr(SplitString, Delimiter)
Loop
ReDim Preserve aSplit(Dimension)
aSplit(Dimension) = Trim(SplitString)
SplitB = aSplit
End Function


SplitB返回变量数组。


它可以用作


Dim aV As Variant

aV = SplitB(Lyle R Fairfield," ")

Debug.Print aV(0)

''Lyle


''或


昏暗aV作为变体

Dim z As Long

对于z = LBound(aV)到UBound(aV)

Debug.Print aV(z)

下一页z

''Lyle

''R

''Fairfield


''使用


SplitB(Lyle R Fairfield,")(0)

SplitB(Lyle R Fairfield,")(1)

SplitB(Lyle R Fairfield,")(2)


''对于上述任务有效,但比我们应该要求VBA更多的工作

做。


无论我认为它' SendMailwithOE代码不再需要了吗?


-

Lyle Fairfield
SplitB returns a variant array.

It can be used as

Dim aV As Variant
aV = SplitB("Lyle R Fairfield", " ")
Debug.Print aV(0)
''Lyle

''or

Dim aV As Variant
Dim z As Long
For z = LBound(aV) To UBound(aV)
Debug.Print aV(z)
Next z
''Lyle
''R
''Fairfield

''using

SplitB("Lyle R Fairfield", " ")(0)
SplitB("Lyle R Fairfield", " ")(1)
SplitB("Lyle R Fairfield", " ")(2)

''for the above task works but is more work than we should ask VBA to
do.

Regardless I think it''s no longer required for the SendMailwithOE code?

--
Lyle Fairfield


< ; snip>


的程序 http://www.ffdba.com /downloads/Send_...ok_Express.htm

仍在使用它。它是一套非常方便的程序。我会尝试

让它运转起来。如果可以,我会在这里发布。

<snip>
The procedures at
http://www.ffdba.com/downloads/Send_...ok_Express.htm
still use it. Its a very handy set of procedures there. I''ll try to
get it working. If I can, I''ll post it here.


>
无论我认为它不再需要SendMailwithOE代码?
>
Regardless I think it''s no longer required for the SendMailwithOE code?


这篇关于由于不能为Variant分配一个Array值,因此FN过程的返回值变暗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆