WHY OH WHY! ... creating a dynamic array of outlookmail items, then display them.

W

WhytheQ

I'm using the following code, with NO reference to outlook:


Dim objOutlook As Object
Dim objMailItem As Object

Dim myCreatedEmails() As Object

Sub CreateAndDisplayEmails()

Set objOutlook = CreateObject("Outlook.Application")

Erase myCreatedEmails

For i = 1 To 3

Set objMailItem = objOutlook.CreateItem(0)

With objMailItem
.To = "Tester" & i
.Subject = "Tester" & i
End With

ReDim myCreatedEmails(k)
'##### falls down on next line #####
myCreatedEmails(k) = objMailItem
k = k + 1

Next i

For k = 1 To UBound(myCreatedEmails)
myCreatedEmails(k).Display
Next k

End Sub


....I've marked where it already falls down and I assume even if this
line is fixed then it'll fall down later on on the line
"myCreatedEmails(k).Display"

The above must be pretty bl##dy close!...can anyone help?

Help appreciated
Jason
 
J

Jim Thomlinson

A couple of things wrong with that off the top of my head.
1. You are missing the "preserve" key word. Without that each time you redim
all of the previous items stored in the array will be blown away. you
probably want.
ReDim Preserve myCreatedEmails(k)

2. An object reference requires the "Set" key word.
set myCreatedEmails(k) = objMailItem

Just curious. Why not use a collection, instead of a dynamic array. Ususally
they are a bit more handy for storing groups of objects...

dim colCreatedEmails as collection

set colCreatedEmails as new collection

colCreatedEmails.add objMailItem, "Some Unique Key"
 
M

Mark Lincoln

How does it "fall down"? That is, what error do you get?

Just a guess, but it looks like you would lose previous myCreatedEmails
entries as you run through your For/Next loop because you used ReDim
instead of ReDim Preserve. ReDim by itself clears the array.
 
W

WhytheQ

nice one Jim
J


Jim said:
A couple of things wrong with that off the top of my head.
1. You are missing the "preserve" key word. Without that each time you redim
all of the previous items stored in the array will be blown away. you
probably want.
ReDim Preserve myCreatedEmails(k)

2. An object reference requires the "Set" key word.
set myCreatedEmails(k) = objMailItem

Just curious. Why not use a collection, instead of a dynamic array. Ususally
they are a bit more handy for storing groups of objects...

dim colCreatedEmails as collection

set colCreatedEmails as new collection

colCreatedEmails.add objMailItem, "Some Unique Key"
 
W

WhytheQ

Hi Jim
How about the below? (on a machine without outlook at the moment so
can't unfortunately test it)

Option Explicit

Dim objOutlook As Object
Dim objMailItem As Object

Dim i As Integer

Dim myCreatedEmails As Collection


Sub CreateAndDisplayEmails()


Set objOutlook = CreateObject("Outlook.Application")

Set myCreatedEmails = New Collection

For i = 1 To 3


Set objMailItem = objOutlook.CreateItem(0)


With objMailItem
.To = "Tester" & i
.Subject = "Tester" & i
End With

myCreatedEmails.Add objMailItem, i

Next i


For i = 1 To myCreatedEmails.Count
myCreatedEmails(i).Display
Next i


End Sub

I'm not too sure if the Display method is going to work?!
Help greatly appreciated.
Jason.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top