ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Make sure file is in correct folder?? (https://www.excelbanter.com/excel-programming/273681-make-sure-file-correct-folder.html)

Lee Cain

Make sure file is in correct folder??
 
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to put it
nicely.
I know they will probably move the excel file around from it's intended
location.
In the application it creates a new version of itself for each new week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns My
Documents every time, unless I manually do a File/Save As & then it reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My Doc/Inv & if
not, save it there, possibly creating the directory if they screwed it up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com



Tom Ogilvy

Make sure file is in correct folder??
 
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to put it
nicely.
I know they will probably move the excel file around from it's intended
location.
In the application it creates a new version of itself for each new week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns My
Documents every time, unless I manually do a File/Save As & then it

reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My Doc/Inv &

if
not, save it there, possibly creating the directory if they screwed it up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com





Lee Cain

Make sure file is in correct folder??
 
Thanks Tom,

Pretty slick! Try & make the directory, if it fails, or not, the directory
is there! I was thinking too much about it.
Only problem I see is on W2000 & XP where the My Documents folder is
c:\Documents and Setting\current username\My Documents. & this will end up
on 98, 2000, & XP.

thanks,
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to put it
nicely.
I know they will probably move the excel file around from it's intended
location.
In the application it creates a new version of itself for each new week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns My
Documents every time, unless I manually do a File/Save As & then it

reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My Doc/Inv &

if
not, save it there, possibly creating the directory if they screwed it

up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com







Tom Ogilvy

Make sure file is in correct folder??
 
You can use the special folders to get to my documents CSIDL_PERSONAL, not
CSIDL_MYDOCUMENTS

http://support.microsoft.com/default...b;en-us;252652
HOWTO: Use the SHGetFolderPath Function from Visual Basic

http://support.microsoft.com/default...b;EN-US;227051
HOWTO: Determine the Current Location of Files or Folders on Windows 2000

This lists the constants.

http://msdn.microsoft.com/library/de...nums/csidl.asp

This is what you want for a declaration:

Private Const CSIDL_PERSONAL = &H05&


Then you can force the creation of Inventories below that.

Regards,
Tom Ogilvy



"Lee Cain" wrote in message
...
Thanks Tom,

Pretty slick! Try & make the directory, if it fails, or not, the directory
is there! I was thinking too much about it.
Only problem I see is on W2000 & XP where the My Documents folder is
c:\Documents and Setting\current username\My Documents. & this will end up
on 98, 2000, & XP.

thanks,
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to put

it
nicely.
I know they will probably move the excel file around from it's

intended
location.
In the application it creates a new version of itself for each new

week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns My
Documents every time, unless I manually do a File/Save As & then it

reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My Doc/Inv

&
if
not, save it there, possibly creating the directory if they screwed it

up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com









Lee Cain

Make sure file is in correct folder??
 
Thanks again,
I've basicly copied the code from your first link, works fine as a stand
alone object atached to a button.
I've tried to turn it into a function with no joy?
Seems to run, but sPath never returns a value? Even in debug, sPath never
picks up the path?

Private Sub CommandButton2_Click()

SaveWhere sPath
MsgBox sPath 'returns blank

End Sub
--------------------------------
Function SaveWhere(sPath)

Dim sPath As String
Dim RetVal As Long

' Fill our string buffer
sPath = String(MAX_PATH, 0)
RetVal = SHGetFolderPath(0, CSIDL_PERSONAL Or CSIDL_FLAG_CREATE, 0,
SHGFP_TYPE_CURRENT, sPath)

Select Case RetVal
Case S_OK
' We retrieved the folder successfully

' All C strings are null terminated
' So we need to return the string upto the first null character
sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)
MsgBox sPath & " from function"
Case S_FALSE
' The CSIDL in nFolder is valid, but the folder does not exist.
' Use CSIDL_FLAG_CREATE to have it created automatically
MsgBox "The folder does not exist"
Case E_INVALIDARG
' nFolder is invalid
MsgBox "An invalid folder ID was specified"

End Select
End Function

Feeling dumber as the day goes on...
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
You can use the special folders to get to my documents CSIDL_PERSONAL,

not
CSIDL_MYDOCUMENTS

http://support.microsoft.com/default...b;en-us;252652
HOWTO: Use the SHGetFolderPath Function from Visual Basic

http://support.microsoft.com/default...b;EN-US;227051
HOWTO: Determine the Current Location of Files or Folders on Windows 2000

This lists the constants.


http://msdn.microsoft.com/library/de...nums/csidl.asp

This is what you want for a declaration:

Private Const CSIDL_PERSONAL = &H05&


Then you can force the creation of Inventories below that.

Regards,
Tom Ogilvy



"Lee Cain" wrote in message
...
Thanks Tom,

Pretty slick! Try & make the directory, if it fails, or not, the

directory
is there! I was thinking too much about it.
Only problem I see is on W2000 & XP where the My Documents folder is
c:\Documents and Setting\current username\My Documents. & this will end

up
on 98, 2000, & XP.

thanks,
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to

put
it
nicely.
I know they will probably move the excel file around from it's

intended
location.
In the application it creates a new version of itself for each new

week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns

My
Documents every time, unless I manually do a File/Save As & then it
reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My

Doc/Inv
&
if
not, save it there, possibly creating the directory if they screwed

it
up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com











Tom Ogilvy

Make sure file is in correct folder??
 
This worked for me (although this isn't the normal way you would use a
function):


Option Explicit

Private Const S_OK = &H0 ' Success
Private Const S_FALSE = &H1 ' The Folder is valid, but does not
exist
Private Const E_INVALIDARG = &H80070057 ' Invalid CSIDL Value

Private Const CSIDL_FLAG_CREATE = &H8000&
Private Const CSIDL_PERSONAL = &H5&

Private Const SHGFP_TYPE_CURRENT = 0
Private Const SHGFP_TYPE_DEFAULT = 1
Private Const MAX_PATH = 260

Private Declare Function SHGetFolderPath Lib "shfolder" _
Alias "SHGetFolderPathA" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, _
ByVal hToken As Long, ByVal dwFlags As Long, _
ByVal pszPath As String) As Long



Private Sub CommandButton2_Click()
Dim sPath As String
SaveWhere sPath
MsgBox sPath 'returns blank

End Sub

Function SaveWhere(sPath As String)

Dim RetVal As Long

' Fill our string buffer
sPath = String(MAX_PATH, 0)
RetVal = SHGetFolderPath(0, CSIDL_PERSONAL Or CSIDL_FLAG_CREATE, _
0, SHGFP_TYPE_CURRENT, sPath)

Select Case RetVal
Case S_OK
' We retrieved the folder successfully

' All C strings are null terminated
' So we need to return the string upto the first null character
sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)
MsgBox sPath & " from function"
Case S_FALSE
' The CSIDL in nFolder is valid, but the folder does not exist.
' Use CSIDL_FLAG_CREATE to have it created automatically
MsgBox "The folder does not exist"
Case E_INVALIDARG
' nFolder is invalid
MsgBox "An invalid folder ID was specified"

End Select
End Function

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
Thanks again,
I've basicly copied the code from your first link, works fine as a stand
alone object atached to a button.
I've tried to turn it into a function with no joy?
Seems to run, but sPath never returns a value? Even in debug, sPath never
picks up the path?

Private Sub CommandButton2_Click()

SaveWhere sPath
MsgBox sPath 'returns blank

End Sub
--------------------------------
Function SaveWhere(sPath)

Dim sPath As String
Dim RetVal As Long

' Fill our string buffer
sPath = String(MAX_PATH, 0)
RetVal = SHGetFolderPath(0, CSIDL_PERSONAL Or CSIDL_FLAG_CREATE, 0,
SHGFP_TYPE_CURRENT, sPath)

Select Case RetVal
Case S_OK
' We retrieved the folder successfully

' All C strings are null terminated
' So we need to return the string upto the first null character
sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)
MsgBox sPath & " from function"
Case S_FALSE
' The CSIDL in nFolder is valid, but the folder does not exist.
' Use CSIDL_FLAG_CREATE to have it created automatically
MsgBox "The folder does not exist"
Case E_INVALIDARG
' nFolder is invalid
MsgBox "An invalid folder ID was specified"

End Select
End Function

Feeling dumber as the day goes on...
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
You can use the special folders to get to my documents CSIDL_PERSONAL,

not
CSIDL_MYDOCUMENTS

http://support.microsoft.com/default...b;en-us;252652
HOWTO: Use the SHGetFolderPath Function from Visual Basic

http://support.microsoft.com/default...b;EN-US;227051
HOWTO: Determine the Current Location of Files or Folders on Windows

2000

This lists the constants.



http://msdn.microsoft.com/library/de...nums/csidl.asp

This is what you want for a declaration:

Private Const CSIDL_PERSONAL = &H05&


Then you can force the creation of Inventories below that.

Regards,
Tom Ogilvy



"Lee Cain" wrote in message
...
Thanks Tom,

Pretty slick! Try & make the directory, if it fails, or not, the

directory
is there! I was thinking too much about it.
Only problem I see is on W2000 & XP where the My Documents folder is
c:\Documents and Setting\current username\My Documents. & this will

end
up
on 98, 2000, & XP.

thanks,
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies" to

put
it
nicely.
I know they will probably move the excel file around from it's

intended
location.
In the application it creates a new version of itself for each new

week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it returns

My
Documents every time, unless I manually do a File/Save As & then

it
reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My

Doc/Inv
&
if
not, save it there, possibly creating the directory if they

screwed
it
up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com













Lee Cain

Make sure file is in correct folder??
 
Ah, I was frustrating myself on declaring variables!
I still have some hair left.

Thanks!!
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
This worked for me (although this isn't the normal way you would use a
function):


Option Explicit

Private Const S_OK = &H0 ' Success
Private Const S_FALSE = &H1 ' The Folder is valid, but does

not
exist
Private Const E_INVALIDARG = &H80070057 ' Invalid CSIDL Value

Private Const CSIDL_FLAG_CREATE = &H8000&
Private Const CSIDL_PERSONAL = &H5&

Private Const SHGFP_TYPE_CURRENT = 0
Private Const SHGFP_TYPE_DEFAULT = 1
Private Const MAX_PATH = 260

Private Declare Function SHGetFolderPath Lib "shfolder" _
Alias "SHGetFolderPathA" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, _
ByVal hToken As Long, ByVal dwFlags As Long, _
ByVal pszPath As String) As Long



Private Sub CommandButton2_Click()
Dim sPath As String
SaveWhere sPath
MsgBox sPath 'returns blank

End Sub

Function SaveWhere(sPath As String)

Dim RetVal As Long

' Fill our string buffer
sPath = String(MAX_PATH, 0)
RetVal = SHGetFolderPath(0, CSIDL_PERSONAL Or CSIDL_FLAG_CREATE, _
0, SHGFP_TYPE_CURRENT, sPath)

Select Case RetVal
Case S_OK
' We retrieved the folder successfully

' All C strings are null terminated
' So we need to return the string upto the first null character
sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)
MsgBox sPath & " from function"
Case S_FALSE
' The CSIDL in nFolder is valid, but the folder does not exist.
' Use CSIDL_FLAG_CREATE to have it created automatically
MsgBox "The folder does not exist"
Case E_INVALIDARG
' nFolder is invalid
MsgBox "An invalid folder ID was specified"

End Select
End Function

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
Thanks again,
I've basicly copied the code from your first link, works fine as a stand
alone object atached to a button.
I've tried to turn it into a function with no joy?
Seems to run, but sPath never returns a value? Even in debug, sPath

never
picks up the path?

Private Sub CommandButton2_Click()

SaveWhere sPath
MsgBox sPath 'returns blank

End Sub
--------------------------------
Function SaveWhere(sPath)

Dim sPath As String
Dim RetVal As Long

' Fill our string buffer
sPath = String(MAX_PATH, 0)
RetVal = SHGetFolderPath(0, CSIDL_PERSONAL Or CSIDL_FLAG_CREATE, 0,
SHGFP_TYPE_CURRENT, sPath)

Select Case RetVal
Case S_OK
' We retrieved the folder successfully

' All C strings are null terminated
' So we need to return the string upto the first null character
sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)
MsgBox sPath & " from function"
Case S_FALSE
' The CSIDL in nFolder is valid, but the folder does not exist.
' Use CSIDL_FLAG_CREATE to have it created automatically
MsgBox "The folder does not exist"
Case E_INVALIDARG
' nFolder is invalid
MsgBox "An invalid folder ID was specified"

End Select
End Function

Feeling dumber as the day goes on...
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
You can use the special folders to get to my documents

CSIDL_PERSONAL,
not
CSIDL_MYDOCUMENTS

http://support.microsoft.com/default...b;en-us;252652
HOWTO: Use the SHGetFolderPath Function from Visual Basic

http://support.microsoft.com/default...b;EN-US;227051
HOWTO: Determine the Current Location of Files or Folders on Windows

2000

This lists the constants.




http://msdn.microsoft.com/library/de...nums/csidl.asp

This is what you want for a declaration:

Private Const CSIDL_PERSONAL = &H05&


Then you can force the creation of Inventories below that.

Regards,
Tom Ogilvy



"Lee Cain" wrote in message
...
Thanks Tom,

Pretty slick! Try & make the directory, if it fails, or not, the

directory
is there! I was thinking too much about it.
Only problem I see is on W2000 & XP where the My Documents folder is
c:\Documents and Setting\current username\My Documents. & this will

end
up
on 98, 2000, & XP.

thanks,
--
Lee

www.raising-cain.com
"Tom Ogilvy" wrote in message
...
On Error Resume Next
mkdir "C:\My Documents"
mkdir "C:\My Documents\Inventory"
On Error goto 0
fName = "myfilename.xls"
Application.DisplayAlerts = False
Thisworkbook.SaveAS "C:\My Documents\Inventory\" & fname
Application.DisplayAlerts = True


to set the current directory (not required with the above code)

chdrive "C"
chdir "C:\My Documents\Inventory"

--
Regards,
Tom Ogilvy


"Lee Cain" wrote in message
...
I'm new to this VBA thing, doing OK, but I'm getting lost here.
I'm working on a project that will be distributed to "newbies"

to
put
it
nicely.
I know they will probably move the excel file around from it's
intended
location.
In the application it creates a new version of itself for each

new
week.
I want to guarantee that new version is created in the My
Documents/Inventory folder.

I tried using CurDir to find out the current directory, it

returns
My
Documents every time, unless I manually do a File/Save As & then

it
reports
the proper My Documents/Inventory.

I just need to check the current directory, see if it's the My

Doc/Inv
&
if
not, save it there, possibly creating the directory if they

screwed
it
up!

& to add to the fun, this will be running on W98/2000/XP

Thanks!
--
Lee

www.raising-cain.com
















All times are GMT +1. The time now is 10:23 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com