Open File Dialog - Access 2000

G

Guest

I have code in my Access 2000 database which allows me to send an e-mail,
through Outlook, directly from the database. I would like to
programmatically open the Open File Dialog to allow my users to select
file(s) to attach to the e-mail.

My questions are:

1. How do I programmatically open the Open File Dialog

2. How do I retrieve the names of the files selected (there could be more
than one file attached to the e-mail)

Please note that I do not want to open the files selected, just retrieve
their entire filenames (including path) so I can add them as attachments to
my e-mails.

Thank you,

Michael
 
D

Douglas J. Steele

There's code at http://www.mvps.org/access/api/api0001.htm at "The Access
Web" for how to use the Open File Dialog.

What it's missing, though, is how to use it in multiselect mode.

In multiselect mode, what's returned is a string containing the folder name
followed by a Null character (Chr(0)), then the name of the first file,
followed by a Null character, the name of the next file, followed by a Null
character, and so on until the last file name, which is followed by 2 Null
characters.

This means that you'd need to scrap the TrimNull function that's in the
sample above, because it'll trim your string after the file name.

Instead, use the Split function to put what's in OFN.strFile into an array:

Dim varFiles As Variant

varFiles = Split(OFN.strFile, Chr$(0))

Now, varFiles(0) will contain the name of the folder, varFiles(1) will
contain the name of the first file selected in that folder, and so on.
Because of the 2 nulls at the end, varFiles(UBound(varFiles)) will actually
point to nothing.

HTH
 
G

Guest

Thanks, I'll check it out.

Michael

Douglas J. Steele said:
There's code at http://www.mvps.org/access/api/api0001.htm at "The Access
Web" for how to use the Open File Dialog.

What it's missing, though, is how to use it in multiselect mode.

In multiselect mode, what's returned is a string containing the folder name
followed by a Null character (Chr(0)), then the name of the first file,
followed by a Null character, the name of the next file, followed by a Null
character, and so on until the last file name, which is followed by 2 Null
characters.

This means that you'd need to scrap the TrimNull function that's in the
sample above, because it'll trim your string after the file name.

Instead, use the Split function to put what's in OFN.strFile into an array:

Dim varFiles As Variant

varFiles = Split(OFN.strFile, Chr$(0))

Now, varFiles(0) will contain the name of the folder, varFiles(1) will
contain the name of the first file selected in that folder, and so on.
Because of the 2 nulls at the end, varFiles(UBound(varFiles)) will actually
point to nothing.

HTH
 
G

Guest

I've tested this code and it works when selecting one file. However, the
Open File Dialog doesn't allow me to select more than one file. How can I
get it to allow to do this?

Thanks,

Michael
 
D

Dirk Goldgar

Michael said:
I've tested this code and it works when selecting one file. However,
the Open File Dialog doesn't allow me to select more than one file.
How can I get it to allow to do this?

Did you set the ahtOFN_ALLOWMULTISELECT option? I've used this code for
multiselect, so I know it works.
 
G

Guest

I see: Global Const ahtOFN_ALLOWMULTISELECT = &H200 but I don't see where
it's used. How do I set this Constant to allow multiselect? Also, if I want
the user the ability to change directories, how do I do that? How does
changing directories change the returned value?

Thanks,

Michael
 
D

Dirk Goldgar

Michael said:
I see: Global Const ahtOFN_ALLOWMULTISELECT = &H200 but I don't see
where it's used. How do I set this Constant to allow multiselect?

Here's an example :"GetOpenFileMulti" function, along with a modified
version of the TrimNull function. The TrimNull() function had to be
modified, since now the return string is terminated by two nulls, not
just one. However, this version of TrimNull will also work when you are
not doing multiselect.

'----- start of code -----
Public Function TrimNull(ByVal strItem As String) As String

Dim intPos As Integer

intPos = InStr(strItem & vbNullChar & vbNullChar, _
vbNullChar & vbNullChar)

If intPos > 0 Then
TrimNull = Left(strItem, intPos - 1)
Else
TrimNull = strItem
End If
End Function


Function GetOpenFileMulti(Optional varDirectory As Variant, _
Optional varTitleForDialog As Variant) As Variant

' Here's an example that gets an Access database name.

Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant

Dim varFileList() As String

' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
lngFlags = _
ahtOFN_FILEMUSTEXIST Or _
ahtOFN_HIDEREADONLY Or _
ahtOFN_NOCHANGEDIR Or _
ahtOFN_ALLOWMULTISELECT Or _
ahtOFN_EXPLORER
If IsMissing(varDirectory) Then
varDirectory = ""
End If
If IsMissing(varTitleForDialog) Then
varTitleForDialog = ""
End If

' Define the filter string and allocate space in the "c"
' string Duplicate this line with changes as necessary for
' more file templates.
strFilter = ahtAddFilterItem(strFilter, _
"Access (*.mdb)", "*.MDB;*.MDA")
' Now actually call to get the file name.
varFileName = ahtCommonFileOpenSave( _
OpenFile:=True, _
InitialDir:=varDirectory, _
Filter:=strFilter, _
flags:=lngFlags, _
DialogTitle:=varTitleForDialog)

GetOpenFileMulti = varFileName

End Function
'----- end of code -----
Also, if I want the user the ability to change directories, how do I
do that? How does changing directories change the returned value?

You can't choose from multiple directories when using multiselect, if
that's what you mean. All files chosen must be from the same directory,
because only one directory path is returned. The ahtOFN_NOCHANGEDIR
option just prevents the OpenFile dialog from changing the Windows
"current drectory" to the directory the use chooses files from.
 
D

Dirk Goldgar

Dirk Goldgar said:
Here's an example :"GetOpenFileMulti" function, along with a modified
version of the TrimNull function. The TrimNull() function had to be
modified, since now the return string is terminated by two nulls, not
just one. However, this version of TrimNull will also work when you
are not doing multiselect.

One further note: if your users are going to be choosing large numbers
of files using this dialog, you're going to need a larger buffer. The
code in ahtCommonFileOpenSave allows only 256 characters for the path
and file names. You can expand this to, say, 512, by changing these
lines in the posted code:

strFileName = Left(FileName & String(256, 0), 256)
strFileTitle = String(256, 0)

to

strFileName = Left(FileName & String(512, 0), 512)
strFileTitle = String(512, 0)
 
G

Guest

Thank you. I'll check it out.

Michael

Dirk Goldgar said:
One further note: if your users are going to be choosing large numbers
of files using this dialog, you're going to need a larger buffer. The
code in ahtCommonFileOpenSave allows only 256 characters for the path
and file names. You can expand this to, say, 512, by changing these
lines in the posted code:

strFileName = Left(FileName & String(256, 0), 256)
strFileTitle = String(256, 0)

to

strFileName = Left(FileName & String(512, 0), 512)
strFileTitle = String(512, 0)

--
Dirk Goldgar, MS Access MVP
www.datagnostics.com

(please reply to the newsgroup)
 
G

Guest

I've put your code in and it's still not letting me multi-select. What am I
missing? Do I need to change the value of the multiselect Global Constant?
Anything else missing?

Thanks,

Michael
 
D

Dirk Goldgar

Michael said:
I've put your code in and it's still not letting me multi-select.
What am I missing? Do I need to change the value of the multiselect
Global Constant? Anything else missing?

You must not change the value of the constant. It's hard to say what's
missing. Are you calling GetOpenFileMulti, instead of the original
GetOpenFile? Did you replace the original TrimNull function with the
one I posted? When you say it's not letting you multi-select, do you
mean that the file dialog only lets you pick one file, even though you
control-click or shift-click on multiple files, or do you mean that you
appear to select multiple files but only get one back, or do you mean
that you don't get anything back at all?
 
G

Guest

I tried calling GetOpenFileMulti but got an error. I noticed that there was
only one line of code that was different between GetOpenFileMulti and
GetOpenFile so I modified GetOpenFile to be the same as GetOpenFileMulti and
then called GetOpenFile. I did replace the old TrimNull with your version of
TrimNull.

The problem I'm having is that the Open File Dialog only lets me select one
file despite my efforts to select more than one with Shift-Click or
Control-Click.

Perhaps it'll be easier for us to communicate if you look at my entire code
which follows below.

Thanks,

Michael

Option Compare Database
Option Explicit

'***************** Code Start **************
'This code was originally written by Ken Getz.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'
' Code courtesy of:
' Microsoft Access 95 How-To
' Ken Getz and Paul Litwin
' Waite Group Press, 1996

Type tagOPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
strFilter As String
strCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
strFile As String
nMaxFile As Long
strFileTitle As String
nMaxFileTitle As Long
strInitialDir As String
strTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
strDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean

Declare Function aht_apiGetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean

Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long

Global Const ahtOFN_READONLY = &H1
Global Const ahtOFN_OVERWRITEPROMPT = &H2
Global Const ahtOFN_HIDEREADONLY = &H4
Global Const ahtOFN_NOCHANGEDIR = &H8
Global Const ahtOFN_SHOWHELP = &H10
' You won't use these.
'Global Const ahtOFN_ENABLEHOOK = &H20
'Global Const ahtOFN_ENABLETEMPLATE = &H40
'Global Const ahtOFN_ENABLETEMPLATEHANDLE = &H80
Global Const ahtOFN_NOVALIDATE = &H100
Global Const ahtOFN_ALLOWMULTISELECT = &H200
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400
Global Const ahtOFN_PATHMUSTEXIST = &H800
Global Const ahtOFN_FILEMUSTEXIST = &H1000
Global Const ahtOFN_CREATEPROMPT = &H2000
Global Const ahtOFN_SHAREAWARE = &H4000
Global Const ahtOFN_NOREADONLYRETURN = &H8000
Global Const ahtOFN_NOTESTFILECREATE = &H10000
Global Const ahtOFN_NONETWORKBUTTON = &H20000
Global Const ahtOFN_NOLONGNAMES = &H40000
' New for Windows 95
Global Const ahtOFN_EXPLORER = &H80000
Global Const ahtOFN_NODEREFERENCELINKS = &H100000
Global Const ahtOFN_LONGNAMES = &H200000

Function TestIt()

Dim strFilter As String
Dim lngFlags As Long

strFilter = ahtAddFilterItem(strFilter, "Access Files (*.mda, *.mdb)",
"*.MDA;*.MDB")
strFilter = ahtAddFilterItem(strFilter, "dBASE Files (*.dbf)", "*.DBF")
strFilter = ahtAddFilterItem(strFilter, "Text Files (*.txt)", "*.TXT")
strFilter = ahtAddFilterItem(strFilter, "All Files (*.*)", "*.*")
MsgBox "You selected: " & ahtCommonFileOpenSave(InitialDir:="C:\", _
Filter:=strFilter, FilterIndex:=4, Flags:=lngFlags, _
DialogTitle:="Hello! Open Me!")

' Since you passed in a variable for lngFlags,
' the function places the output flags value in the variable.
Debug.Print Hex(lngFlags)

End Function

Function GetOpenFile(Optional varDirectory As Variant, Optional
varTitleForDialog As Variant) As Variant

' Here's an example that gets an Access database name.
Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant

' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
'lngFlags = ahtOFN_FILEMUSTEXIST Or _
' ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
lngFlags = _
ahtOFN_FILEMUSTEXIST Or _
ahtOFN_HIDEREADONLY Or _
ahtOFN_NOCHANGEDIR Or _
ahtOFN_ALLOWMULTISELECT Or _
ahtOFN_EXPLORER

If IsMissing(varDirectory) Then
varDirectory = ""
End If

If IsMissing(varTitleForDialog) Then
varTitleForDialog = ""
End If

' Define the filter string and allocate space in the "c"
' string Duplicate this line with changes as necessary for
' more file templates.
strFilter = ahtAddFilterItem(strFilter, "Access (*.mdb)", "*.MDB;*.MDA")

' Now actually call to get the file name.
varFileName = ahtCommonFileOpenSave( _
OpenFile:=True, _
InitialDir:=varDirectory, _
Filter:=strFilter, _
Flags:=lngFlags, _
DialogTitle:=varTitleForDialog)

If Not IsNull(varFileName) Then
varFileName = TrimNull(varFileName)
End If

GetOpenFile = varFileName

End Function

Function ahtCommonFileOpenSave( _
Optional ByRef Flags As Variant, _
Optional ByVal InitialDir As Variant, _
Optional ByVal Filter As Variant, _
Optional ByVal FilterIndex As Variant, _
Optional ByVal DefaultExt As Variant, _
Optional ByVal FileName As Variant, _
Optional ByVal DialogTitle As Variant, _
Optional ByVal hwnd As Variant, _
Optional ByVal OpenFile As Variant) As Variant

' This is the entry point you'll use to call the common
' file open/save dialog. The parameters are listed
' below, and all are optional.
'
' In:
' Flags: one or more of the ahtOFN_* constants, OR'd together.
' InitialDir: the directory in which to first look
' Filter: a set of file filters, set up by calling
' AddFilterItem. See examples.
' FilterIndex: 1-based integer indicating which filter
' set to use, by default (1 if unspecified)
' DefaultExt: Extension to use if the user doesn't enter one.
' Only useful on file saves.
' FileName: Default value for the file name text box.
' DialogTitle: Title for the dialog.
' hWnd: parent window handle
' OpenFile: Boolean(True=Open File/False=Save As)
' Out:
' Return Value: Either Null or the selected filename
Dim OFN As tagOPENFILENAME
Dim strFileName As String
Dim strFileTitle As String
Dim fResult As Boolean

' Give the dialog a caption title.
If IsMissing(InitialDir) Then InitialDir = CurDir
If IsMissing(Filter) Then Filter = ""
If IsMissing(FilterIndex) Then FilterIndex = 1
If IsMissing(Flags) Then Flags = 0&
If IsMissing(DefaultExt) Then DefaultExt = ""
If IsMissing(FileName) Then FileName = ""
If IsMissing(DialogTitle) Then DialogTitle = ""
If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
If IsMissing(OpenFile) Then OpenFile = True
' Allocate string space for the returned strings.
strFileName = Left(FileName & String(512, 0), 512)
strFileTitle = String(512, 0)
' Set up the data structure before you call the function
With OFN
.lStructSize = Len(OFN)
.hwndOwner = hwnd
.strFilter = Filter
.nFilterIndex = FilterIndex
.strFile = strFileName
.nMaxFile = Len(strFileName)
.strFileTitle = strFileTitle
.nMaxFileTitle = Len(strFileTitle)
.strTitle = DialogTitle
.Flags = Flags
.strDefExt = DefaultExt
.strInitialDir = InitialDir
' Didn't think most people would want to deal with
' these options.
.hInstance = 0
'.strCustomFilter = ""
'.nMaxCustFilter = 0
.lpfnHook = 0
'New for NT 4.0
.strCustomFilter = String(255, 0)
.nMaxCustFilter = 255
End With

' This will pass the desired data structure to the
' Windows API, which will in turn it uses to display
' the Open/Save As Dialog.
If OpenFile Then
fResult = aht_apiGetOpenFileName(OFN)
Else
fResult = aht_apiGetSaveFileName(OFN)
End If

' The function call filled in the strFileTitle member
' of the structure. You'll have to write special code
' to retrieve that if you're interested.
If fResult Then
' You might care to check the Flags member of the
' structure to get information about the chosen file.
' In this example, if you bothered to pass in a
' value for Flags, we'll fill it in with the outgoing
' Flags value.
If Not IsMissing(Flags) Then Flags = OFN.Flags
'ahtCommonFileOpenSave = TrimNull(OFN.strFile)
ahtCommonFileOpenSave = OFN.strFile
Else
ahtCommonFileOpenSave = vbNullString
End If
End Function

Function ahtAddFilterItem(strFilter As String, _
strDescription As String, Optional varItem As Variant) As String

' Tack a new chunk onto the file filter.
' That is, take the old value, stick onto it the description,
' (like "Databases"), a null character, the skeleton
' (like "*.mdb;*.mda") and a final null character.

If IsMissing(varItem) Then varItem = "*.*"
ahtAddFilterItem = strFilter & _
strDescription & vbNullChar & _
varItem & vbNullChar

End Function

Public Function TrimNull(ByVal strItem As String) As String

Dim intPos As Integer

intPos = InStr(strItem & vbNullChar & vbNullChar, vbNullChar & vbNullChar)

If intPos > 0 Then
TrimNull = Left(strItem, intPos - 1)
Else
TrimNull = strItem
End If

End Function

'************** Code End *****************
 
D

Dirk Goldgar

Michael said:
I tried calling GetOpenFileMulti but got an error.

Probably an error from linewrapping forced by the newsreader, or some
other transcription error. The version I posted works for me.
I noticed that
there was only one line of code that was different between
GetOpenFileMulti and GetOpenFile so I modified GetOpenFile to be the
same as GetOpenFileMulti and then called GetOpenFile. I did replace
the old TrimNull with your version of TrimNull.

The problem I'm having is that the Open File Dialog only lets me
select one file despite my efforts to select more than one with
Shift-Click or Control-Click.

Perhaps it'll be easier for us to communicate if you look at my
entire code which follows below.

I copied that, created a new database, pasted the code into a new
module, fixed a couple of line wrapes, compiled it, and called
GetOpenFile from the Immediate Window. It worked perfectly. I was able
to select multiple files, and the returned string contained the folder
path and each file name, separated by the null character, as expected.
Are you sure this isn't working right for you? Are you sure you're
calling the modified version of the procedure?
 
G

Guest

When I call GetOpenFile in the Immediate Window, it works for me too. My
knowledge of VBA is pretty good, but falls short in the API and machine level
areas. I also don't really understand the use or purpose of the Declared
Functions.

If I call ahtCommonFileOpenSave (as I'm doing in the TestIt function), where
is GetOpenFile getting called? It appears that when I call
ahtCommonFileOpenSave, that GetOpenFile isn't getting called. Am I missing
somthing?

When I modify TestIt to just call GetOpenFile directly, then it works. So
why is ahtCommonFileOpenSave getting called? What is the purpose of
ahtCommonFileOpenSave?

Also, when Debug.Print Hex(lngFlags) is run, it only prints the Path and
first filename in the dialog box. Am I correct in presuming that the
returned string consists of: Path Chr(0) Filename1 Chr(0) Filename2 Chr(0)
.... FilenameN Chr(0) Chr(0).

Thanks for all your help. I really appreciate it.

Michael
 
G

Guest

Ok, I've got it working. I'd like to understand how this all works - and my
question really has to do with how does API work. Where can I go to learn
how API works (the structure of the calls, etc.)?

The other question I have is when GetOpenFile is called with MultiSelect
activated, it works fine when more than one file is selected, however, when
only one file is selected, then it puts the Path and Filename together
without a Chr(0) separation. Why does it do this? How can I tell whether
only one file is selected or multiple files are selected? Also, what happens
if the user doesn't select any files and clicks Cancel in the Open File
dialog? Can I tell the difference between when the user cancels the
operation and when only one file is selected?

Thanks again for all your help. Hopefully, this will be it.

Michael
 
D

Dirk Goldgar

Michael said:
Ok, I've got it working. I'd like to understand how this all works -
and my question really has to do with how does API work. Where can I
go to learn how API works (the structure of the calls, etc.)?


Sorry for the long delay in replying. I overlooked the fact that you
had followup questions. I don't know whether you'll see this response
or not.

I don't have a terribly good answer to your question, because I use
rather a cookbook approach myself, making use of code that has been
posted on various sites to accomplish a variety of ends, without ever
having made a comprehensive study of the Windows API. However, one good
site to visit is:

http://www.mentalis.org/agnet/apiguide.shtml

Here's a good site for Access how-to information, with an API section of
its own:

http://www.mvps.org/access/

VBNet has a lot of good Visual Basic code that can often be adapted for
Access VBA with little change:

http://vbnet.mvps.org/
The other question I have is when GetOpenFile is called with
MultiSelect activated, it works fine when more than one file is
selected, however, when only one file is selected, then it puts the
Path and Filename together without a Chr(0) separation. Why does it
do this? How can I tell whether only one file is selected or
multiple files are selected?

It does that because that's the way the Open File API works, and there's
nothing you can do about it. What I usually do is use the Split()
function to convert the returned list into an array, and then check to
see if the upper bound of the array is the same as the lower bound:

Dim strResult As String
Dim astrFiles() As String

strResult = GetOpenFile()

If Len(strResult) = 0 Then
' No files were picked. Do something about that ...
Else
astrFiles = Split(strResult, Chr(0))

If UBound(astrFiles) = LBound(astrFiles) Then
' Only one file was selected, stored (with path)
' in astrFiles(LBound(astrFiles)) ...
Else
' Multiple files were selectes. The folder path is in
' astrFiles(LBound(astrFiles)), and the file names are in
' the remaining elements of the array.
End If

End If
Also, what happens if the user doesn't
select any files and clicks Cancel in the Open File dialog? Can I
tell the difference between when the user cancels the operation and
when only one file is selected?

The example code snippet above should answer those questions, too.
Thanks again for all your help. Hopefully, this will be it.

I apologize again for the belated response.
 
G

Guest

Same problem. Multi select doesn't work. Copied in all the code. How did you
get it to work finally. Please respond. really desparate. Thanks
 
D

Dirk Goldgar

SwissMiss said:
Same problem. Multi select doesn't work. Copied in all the code. How
did you get it to work finally. Please respond. really desparate.
Thanks

Here's a version of the sample "GetOpenFile" function named
"GetOpenFileMulti", modified to do multiselect, along with a modified
version of the TrimNull function that is necessary for this to work, and
a demo function to call it, named "TestMultiselect":

'----- start of code -----
Function GetOpenFileMulti(Optional varDirectory As Variant, _
Optional varTitleForDialog As Variant) As Variant

' Here's an example that gets an Access database name.

Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant

Dim varFileList() As String

' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
lngFlags = _
ahtOFN_FILEMUSTEXIST Or _
ahtOFN_HIDEREADONLY Or _
ahtOFN_NOCHANGEDIR Or _
ahtOFN_ALLOWMULTISELECT Or _
ahtOFN_EXPLORER
If IsMissing(varDirectory) Then
varDirectory = ""
End If
If IsMissing(varTitleForDialog) Then
varTitleForDialog = ""
End If

' Define the filter string and allocate space in the "c"
' string Duplicate this line with changes as necessary for
' more file templates.
strFilter = ahtAddFilterItem(strFilter, _
"Access (*.mdb)", "*.MDB;*.MDA")
' Now actually call to get the file name.
varFileName = ahtCommonFileOpenSave( _
OpenFile:=True, _
InitialDir:=varDirectory, _
Filter:=strFilter, _
flags:=lngFlags, _
DialogTitle:=varTitleForDialog)

GetOpenFileMulti = varFileName

End Function

Public Function TrimNull(ByVal strItem As String) As String
Dim intPos As Integer
intPos = InStr(strItem & vbNullChar & vbNullChar, _
vbNullChar & vbNullChar)
If intPos > 0 Then
TrimNull = Left(strItem, intPos - 1)
Else
TrimNull = strItem
End If
End Function

Public Function TestMultiselect()

Dim strFiles As String
Dim astrFiles() As String
Dim i As Integer

strFiles = GetOpenFileMulti(, "Ctrl-Click for Multi-Select")

astrFiles = Split(strFiles, vbNullChar)

If UBound(astrFiles) < LBound(astrFiles) Then
Debug.Print "No files were selected"
ElseIf UBound(astrFiles) = LBound(astrFiles) Then
Debug.Print "One file was selected. File (with path) is: "; _
astrFiles(LBound(astrFiles))
Else
i = LBound(astrFiles)
Debug.Print UBound(astrFiles) & _
" files were selected in folder "; _
astrFiles(i)
For i = i + 1 To UBound(astrFiles)
Debug.Print , astrFiles(i)
Next i
End If

End Function
'----- end of code -----
 

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