単二電池

Sub フォルダ作成()
Dim UserName As String
UserName = Environ("USERNAME")
MkDir "C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算"
MkDir "C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算\売掛金元帳"
MkDir "C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算\買掛金元帳"
MkDir "C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算\管理表"
End Sub

上記のようなマクロを記述してありますが、
C:ドライブ以外(D:ドライブやZ:ドライブ)で使用する場合が発生しましたので、
どのドライブでも使用出切る記述方法があれば御教示お願い致します。

A 回答 (12件中1~10件)

こんにちは。



少し、見直してみました。

今回は、このようなマクロは経験はありません。私は、決算期のフォルダは年に一度しかないので、マクロでは作りません。手動で行います。他人に作ってもらうならいいけれども、ある程度エラーを出さないマクロにするには、面倒で手数が多いかもしれません。

一応、年度決算ですから、現在の年の数でフォルダ名にします。
このようにしてあります。
Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算"
'-------------------------------------------

''Option Explicit

Sub MacroTest1()
  Dim UserName As String
  Dim myDest As String
  Dim myDrv As Variant
  Dim myFolder As String
  Dim myFolder2 As String
  Dim objFS As Object
  Dim objDrv As Object
  Dim flg As Boolean
  Const M As Integer = "7" '決算月
  
  flg = False
  
  UserName = VBA.Environ("USERNAME")
  myDest = "C:\Documents and Settings\" & UserName & "\My Documents\"
  myFolder = "販売管理"
  
  myDrv = Application.InputBox("ドライブ名を入れてください。" & vbCrLf & "99を入れると自フォルダになります。", "ファルダ作成", Type:=2)
  
  If VarType(myDrv) = vbBoolean Or myDrv = "" Then Exit Sub
  Set objFS = CreateObject("Scripting.FileSystemObject")
  If Not myDrv Like "99" And InStr(1, Left(Application.Path, 3), myDrv, 1) = 0 Then
    
    If InStr(myDrv, ":") = 0 Then myDrv = myDrv & ":"
    If InStr(myDrv, "\") > 0 Then myDrv = Replace(myDrv, "\", "")
    
    If objFS.DriveExists(myDrv) = False Then
      MsgBox myDrv & " :ドライブがありません。"
      Exit Sub
    Else
      Set objDrv = objFS.GetDrive(myDrv)
      If objDrv.IsReady = False Then
        MsgBox myDrv & "ドライブが可能ではありません。"
        Exit Sub
      End If
      If objDrv.freespace < 1000 Then
        MsgBox myDrv & "ドライブが書き込み可能ではありません。"
        Exit Sub
      End If
      ChDrive myDrv
    End If
  Else
    flg = True
  End If
  
  If flg Then
    If objFS.FolderExists(myDest & myFolder & "\") = False Then
      MkDir myDest & myFolder
    End If
  Else
    myDest = myDrv & "\"
    If InStr(1, myDest, "Z", 1) Then 'Zの場合
      myDest = myDest & "\5TM\"
      If objFS.FolderExists(myDest & "\") = False Then
        MkDir myDest
      End If
    End If
    If objFS.FolderExists(myDest & "\" & myFolder & "\") = False Then
      MkDir myDest & "\" & myFolder
    End If
  End If


If objFS.FolderExists(myDest & myFolder & Format$(DateSerial(Year(Date), 1, 1), "yyyy年mm") & "決算") Then
  MsgBox myDest & myFolder & Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算" & vbCrLf & "は既に存在するかと思われます。", vbInformation
  Exit Sub
Else
  '既に決算フォルダがある場合は、無視する
  On Error Resume Next
  MkDir myDest & myFolder & "\" & Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算" & "\"
  On Error GoTo 0
  MkDir myDest & myFolder & "\" & Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算" & "\売掛金元帳"
  MkDir myDest & myFolder & "\" & Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算" & "\買掛金元帳"
  MkDir myDest & myFolder & "\" & Format$(DateSerial(Year(Date), M, 1), "yyyy年mm") & "決算" & "\管理表"
End If
'以下を置かないと、ドライブに、ApplicationのCurDrive が残ることがある。
ChDrive Left(Application.Path, 3)
Set objFS = Nothing
End Sub

この回答への補足

Wendy02様
ご無沙汰いたしております。

久方ぶりの質問をさせていただきました。
お目に留めていただき、ありがとうございます。

>私は、まだ書いています。
ご指導いただけることは、私にとっては大変ありがたい事です。
その他の大勢の方々もそう思っていらしゃることと思います。
どうか、今後もご指導いただけますようお願い申し上げます。

● 私の質問の要領が悪く、枝葉の質問から入ってしまったようで申し訳ございません。
再質問のようになってしまい申し訳ございませんが、宜しくお願い申し上げます。
(1)My Documentsに\販売管理 を保存して、VBAで絶対パス("C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算") で記述した場合、Cドライブでは思い通り作業が出来ます。

(2) そのまま、C:ドライブ以外(例えばD:ドライブやZ:ドライブ)に保存し、作業しますと、エラーが発生します。

(3) VBAの中で、絶対パスを多用しておりますので、修正が大変な作業になります。

(4) どのようなドライブに\販売管理を保存しても、エラーが発生しないように、絶対パス("C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算") で記述した部分を、記述する方法があるのでしょうか?
もし、有るならば御教示下さい。

● 「フォルダ名の記述方法について御教示ください。」と質問(2008/11/30 質問番号:4518725)いたしましたら、
下記のようなご回答、ご指導(回答日時:08/12/04  回答番号:No.4)をいただきました。

>どのパソコンでも使用できるような記述方法があるのでしょうか。

それは、こんな方法です。

Dim myFolder As String
Dim UserName As String
UserName = Environ("USERNAME")
myFolder = "C:\Documents and Settings\" & UserName & "\My Documents\¥販売管理\2009年11月決算\売掛金元帳\"

>Environ("USERNAME")
これは、単に環境変数を読んでいるだけです。
コマンド・プロンプトで、>Set とすれば、出てきます。

● この時の ("USERNAME") のように、どのようなケースでも対処出来る記述方法があるのかを、ご教示いただきたいのです。

☆ 質問者や回答者も自力で答えを見つけようとする人たちが、減ってきた・・・。☆

お叱りを受けるかもしれませんが、宜しくお願い申し上げます。

補足日時:2009/08/27 21:00
    • good
    • 0

こんにちは。



#5のコードは、
>「ドライブ名」を調べましたがわか無いので、数字やアルファベットをを入力したり、試行錯誤がしましたが何を入力すれば良いのか判りませんでした。

ドライブ名というのは、A,C,Z, などの、「C:\.....」のC の部分です。

コードの内容的には、#3さんの考え方を発展したものです。A,C,Z などのドライブ名を入れた後に、それが存在し、なおかつ使える状態かチェックしなければなりません。

でも、実用化するには、その先の部分も必要だと思います。その組み合わせは、それほど難しくはありませんが、あまり、最初の部分でつまずいてしまうと、その先は、難しいかもしれません。
    • good
    • 0
この回答へのお礼

Wendy02様

ありがとうございました。

この質問に関する処理は、とても消化出来そうにもございませんが、色々とご指導いただきました事をふまえ時間をかけて勉強してみます。

取敢えず、締め切らせていただきます。

配慮賜りありがとうございました。

今後とも、宜しくお願い申し上げます。

oguno

お礼日時:2009/09/02 15:40

MsgBox CreateObject("WScript.Shell").SpecialFolders("MyDocuments")


として、ご希望のパスが表示されないのでしょうか?もしそうなら、不思議な環境に思いますが。

まあ、環境変数で「マイドキュメント」を拾うなら
Environ("HomeDrive") & "\ & Environ("Path") & "\My Documents"
とでもなるのでしょうか。「SystemDrive」とは別だと思います。

いずれにしても、いきなり正解を教えてもらう(鵜呑みにする)より、実際にご自分でいろいろ試された方がいいでしょう。
天才でもない限り、試行錯誤を繰り替えて壁にぶつかりながなら前進した方が身に付きますから。
    • good
    • 0
この回答へのお礼

cistronezk様

ご配慮ありがとうございます。

>いずれにしても、いきなり正解を教えてもらう(鵜呑みにする)より、実際にご自分でいろいろ試された方がいいでしょう。
天才でもない限り、試行錯誤を繰り替えて壁にぶつかりながなら前進した方が身に付きますから。

● 先ほども、お礼申し上げましたが、試行錯誤しながら、ご指導いただいた事を参考に、頑張って見ます。

また、質問させていただく事になりますが、名前(oguno)を見かけましたら宜しくお願い申し上げます。

oguno

お礼日時:2009/08/28 18:52

こんにちは。



最初に、
>☆ 質問者や回答者も自力で答えを見つけようとする人たちが、減ってきた・・・。☆

Google 検索すると、真っ先に、ここのサイトがヒットしますが、その割りに、質問者側が質問だけで、そのままになってしまうことが多いです。

さて、#9様と反応は違いますが、#5の補足の内容は良く分からないです。
何か、誤解されているような気がしています。一度、それぞれの方のコードをチェックしていただくしかないと思います。一応、こちらのコードも完成形になっていますから、そのまま動かしていただければよいはずです。

私のコードが、どのドライブでも、物理的に存在するドライブなら可能なはずで作りましたが、それで、こちらのコードでエラーが出ているというなら、その箇所を示してもらう必要がありますが、書いたコードの全面的なダメ出しされるとなるとさっぱり分かりません。

定数を登録したとして、現実に、そういうパスが見当たらなければ、エラーが出て意味がありませんから、フォルダを作成する前に、事前にチェックしていく必要があって、#5のコードを書いたわけです。

>● この時の ("USERNAME") のように、どのようなケースでも対処出来る記述方法があるのかを、ご教示いただきたいのです。

具体的に、環境変数から取り出すような方法はないと思います。そのために予め環境変数を登録するというような、バッチプログラムのような古い書き方をする必要性もありません。私は、VBAが分からない方でも見ただけで分かるようなユーザー本意のコードは書きません。

今回の場合は、「どのドライブ」という条件では、必ず、その前に、ドライブの存在、次に、フォルダの存在のチェックをしてから、新たなフォルダを作る方法をとりました。

#9様の
>「C:\・・・」とハードコードするのはちょっと危険な方法です。

危険ではなく、単にVBA上で、エラーが発生するだけだと思います。
単に、Evniron("SystemDrive") で、システムドライブを取ればよいだけだと思いますが、そこまでは、こちらは考えてはいません。「どのようなドライブにでも」であっても、「どのPCにでも」とは書いていません。

これを組み込みで使っていくので、おそらくは、サブルーチン型などにするのか、いろいろと手を加えなくてはなりませんが、現在の問題が解決しない限りは、二の矢は継げません。
    • good
    • 0
この回答へのお礼

Wendy02様

自分の勉強不足も省みず身分不相応な質問をしてしまい皆様にご迷惑をお掛けし申し訳ございません。
ご容赦ください。

(1) >具体的に、環境変数から取り出すような方法はないと思います。
何かこのような記述方法があるのかと思いご指導をお願いいたしましたが浅はかでした。
一番最初にこのご回答をいただいておればと悔やんでいます・・・・・。

(2) >全面的なダメ出しされるとなるとさっぱり分かりません。
とんでも、ございません(1)の理由に拘ってしまったからです、申し訳ございません。
お腹立ちでしょうがご容赦ください。

(3) >☆ 質問者や回答者も自力で答えを見つけようとする人たちが、減ってきた・・・。☆
プロフィールに書かれておりましたので、今までさんざんご迷惑をお掛けしました私へのご忠告と思っております。

(4) 質問者側が質問だけで、そのままになってしまうことが多いです
意図する所があり、私も締め切らずに残している質問があります。
何時の日か此れを使用する時がくると思っています。

(5) 知識不足
>myDrv = Application.InputBox("ドライブ名を入れてください。" & vbCrLf & "99を入れると自フォルダになります。", "ファルダ作成", Type:=2)
>Inputboxへドライブ名を入れてください。

「ドライブ名」を調べましたがわか無いので、数字やアルファベットをを入力したり、試行錯誤がしましたが何を入力すれば良いのか判りませんでした。

最後に、この記述方法をご教示いただければ幸いです。

お礼日時:2009/08/28 19:03

>4) どのようなドライブに\販売管理を保存しても、エラーが発生しないように、絶対パス("C: \Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算") で記述した部分を、記述する方法があるのでしょうか?



どうもお互いに意思疎通がうまくいなないようですね。おっしゃる意味がピンときません。もしかしたら、以下の作業でご希望に叶うでしょうか?

(1)Publicのモジュール変数を宣言します
例)
Public RootFolder As String

(2)マクロの起動時に、設定値シートから「販売管理パス」値を取得し、RootFolderに設定します。
rootFolder = WorkSheets(<アプリ設定値専用シート>).Range(<販売管理のパスを記述したセル>).Value & "\販売管理\0000年00月決算"

以上を既存のマクロに追加します。

(3)VBEにおいて置換をします。
検索する文字列:"C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算
検索後の文字列:RootFolder & "\販売管理\0000年00月決算" & "
対象:カレントプロジェクト
として「すべて置換」を実行すれば、「 "C:\Documents and Settings\" & ・・・」の呪縛から開放されると思いますが、如何でしょう?


ちなみに、「マイドキュメント」への保存が圧倒的に多いのでしたら、セルに何も記述されていない場合は「マイドキュメント」をデフォルトにします。つまり(2)を以下のようにします。
If WorkSheets(<アプリ設定値専用シート>).Range(<販売管理のパスを記述したセル>).Value = "" Then
rootFolder = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
Else
rootFolder = WorkSheets(<アプリ設定値専用シート>).Range(<販売管理のパスを記述したセル>).Value & "\販売管理\0000年00月決算"
End If

#「"C:\Documents and Settings\" & UserName & "\My Documents"」は、「マイドキュメント」のパスです。これは、システムで決められいる特別なフォルダです。上記の方法でそのパスを取得できます。「マイドキュメント」は、Dドライブなどにも設定可能なので、「C:\・・・」とハードコードするのはちょっと危険な方法です。CreateObject("WScript.Shell").SpecialFolders("MyDocuments")などの方法で取得した方が安全です。
    • good
    • 0
この回答へのお礼

cistronezk様

ご回答 No10で次のようなご回答をいただきました。

>具体的に、環境変数から取り出すような方法はないと思います。

ご親切なご配慮あるご指示ご指導をいただきましたが、この件に関しましては、
現在の私の実力では、とても解決出来そうもございませんので取敢えず締め切らせていただくつもりです。
ただ、皆様方のご指導を無にしないよう、今暫く頑張ってみます。

ありがとうございました。
心より、お詫び御礼申し上げます。

oguno

お礼日時:2009/08/28 16:39

>まだ、テストをさせていただいておりませんが、御指導いただきましたVBAは、作成した、「\0000年00月決算」の自動保存と理解してよろしいでしょうか。



私が示したVBAの上部を実行すると
1.通常の{ファイルを開く」みたいな窓が開いて
2 ユーザーがフォルダを選択し「開く」ボタンをクリックする
3変数fnameにユーザーが選んだフォルダへのパスを示す 文字列 が代入される。

といいうものです。
通常のフォルダもネットワークじょうのドライブでも、マイドキュメントでも何でも選択できます。
例えばユーザーがマイドキュメントを選択すれば
"C:\Docyument and Settings\abc\My Document”
(XPでユーザーがabcのとき)
という文字列がfnameに代入されます。
この文字列を使ってMkdirなりを使ってフォルダを作るコードを書いたらどうでしょうかといってるのです・
上記のコードで取得できるのはユーザーが選んだフォルダへのパスを示す ”文字列” だけであることをご理解ください
    • good
    • 0
この回答へのお礼

rivoisu様

ご回答 No10で次のようなご回答をいただきました。

>具体的に、環境変数から取り出すような方法はないと思います。

ご親切なご配慮あるご指示ご指導をいただきましたが、この件に関しましては、
現在の私の実力では、とても解決出来そうもございませんので取敢えず締め切らせていただくつもりです。
ただ、皆様方のご指導を無にしないよう、今暫く頑張ってみます。

ありがとうございました。
心より、お詫び御礼申し上げます。

oguno

お礼日時:2009/08/28 16:41

>●「\" & UserName &」 のように、プログラム側で他の条件を見て判断 し、「販売管理」の次の階層に「\0000年00月決算」 を作成する事が可能な記述があるのでしょうか



一番気がかりなのはこの点のようですので、参考URLを紹介します。
・存在しないパスのフォルダを一発で作成する
http://officetanaka.net/other/extra/tips07.htm


>●「販売管理」を保存する場所は、ユーザが決めます。  

こちらの聞き方が悪かったですね、私が確認したいことは、変更頻度でした。
頻繁に保存場所?が変更されるのなら、ダイアログを表示させた方がユーザにとって親切です。
一方、一旦保存場所が決まった後は変更することは滅多にないのでしたら、
シートのどこかに保存しおいて、通常はそこから読み込んだほうがいいと思います。
たまーにある変更時には、そのシートの値を変更するという管理方法です。

後者の場合の例です。


Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" ( _
ByVal hwnd As Long, _
ByVal pszPath As String, _
ByVal psa As Long) As Long

Sub フォルダ作成()
Dim rootFolder As String, newFolder As String
rootFolder=WorkSheets(<アプリ設定値専用シート>).Range(<販売管理のあるフォルダ>).Value & "\販売管理\0000年00月決算"

On Error GoTo ERR_MKDIR
newFolder = rootFolder & "\売掛金元帳"
If Dir(newFolder) = "" Then SHCreateDirectoryEx 0&, newFolder, 0&
newFolder = rootFolder & "\買掛金元帳"
If Dir(newFolder) = "" Then SHCreateDirectoryEx 0&, newFolder, 0&
newFolder = rootFolder & "\管理表"
If Dir(newFolder) = "" Then SHCreateDirectoryEx 0&, newFolder, 0&
Exit Sub
ERR_MKDIR:
MsgBox newFolder & "の作成に失敗!", vbCritical
End Sub

#Declare Function SHCreateDirectoryEx Lib "shell32" Alias ・・・は、標準モジュールの先頭に貼り付けてください。

この回答への補足

再三にわたりご回答ご配慮賜り感謝いたします。

私の質問の要領が悪く、枝葉の質問から入ってしまったようで申し訳ございません。

再質問のようになってしまい申し訳ございませんが、宜しくお願い申し上げます。

(1)My Documentsに\販売管理 を保存して、VBAで絶対パス("C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算") で記述した場合、Cドライブでは思い通り作業が出来ます。

(2) そのまま、C:ドライブ以外(例えばD:ドライブやZ:ドライブ)に保存し、作業しますと、エラーが発生します。

(3) VBAの中で、絶対パスを多用しておりますので、修正が大変な作業になります。

(4) どのようなドライブに\販売管理を保存しても、エラーが発生しないように、絶対パス("C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算") で記述した部分を、記述する方法があるのでしょうか?
もし、有るならば御教示下さい。

ご迷惑をお掛けいたしますが、今一度ご教示の程お願い申し上げます。

補足日時:2009/08/27 18:35
    • good
    • 0

作成するフォルダをどこに作るかはユーザーが選ぶということでしたら



fname=""
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = FLDname 'デフォルト
.AllowMultiSelect = False
If .Show = True Then
fname = .SelectedItems(1)
End If
End With

これは組み込みダイヤログでexcelで通常の「ファイルを開く]
処理のようにファイルやフォルダを指定できます。
(上記のコードはフォルダ選択)

ユーザーがキャンセルしたらfname=””となります
選択されていれば
Mkdir=fname & "\販売管理\0000年00月決算"
以下フォルダ作成できると思いますが。

この回答への補足

ご回答ありがとうございます。

>作成するフォルダをどこに作るかはユーザーが選ぶということでしたら

●「販売管理」を保存する場所は、ユーザが決めます。  

但し、作成した、「\0000年00月決算」フォルダーは、再上位フォルダーに自動的(プログラムで)に保存したいと言う事です。

まだ、テストをさせていただいておりませんが、御指導いただきましたVBAは、作成した、「\0000年00月決算」の自動保存と理解してよろしいでしょうか。

補足日時:2009/08/27 15:03
    • good
    • 0

まだ状況が飲み込めないのですが、



"C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算"
Z:\5TM\販売管理\0000年00月決算
D:\販売管理\0000年00月決算

「Sub フォルダ作成()」の中で、3ドライブ全部にフォルダを作成する必要があるのですか?
それとも3ドライブのうちのどれか一つだけですか?もしひとつだけなら、それはユーザが決めるのですか?あるいは、プログラム側で他の条件を見て判断しなといけのでしょうか?

この回答への補足

初心者のためご迷惑をおかけします、再度のご指示ありがとうございます。

MkDir "C:\Documents and Settings\" & UserName & "\MyDocuments
\販売管理\0000年00月決算"

(1) 上記に記述しました 「\" & UserName &」 は通常固有名詞か Administratorとなっていると思いますが、「\" & UserName &」 と記述する事で、どのような名称でもエラーは発生しないと御指導を受けました。

ドライブ名が複数あったり、「販売管理」を保存する階層が異なっても、「販売管理」の次の階層に「\0000年00月決算」を作成する事が可能な記述が出来ればと考えていますが、可能なのでしょうか?

例えば、Zドライブでも Z:\5TM\販売管理\0000年00月決算 や Z:\販売管理\0000年00月決算など。

>(2) それとも3ドライブのうちのどれか一つだけですか?もしひとつだけなら、それはユーザが決めるのですか?あるいは、プログラム側で他の条件を見て判断しなといけのでしょうか?
    
●使用する所、パソコンは一箇所づつです。その状態が複数発生します。
●「販売管理」を保存する場所は、ユーザが決めます。 
●「\" & UserName &」 のように、プログラム側で他の条件を見て判断 し、「販売管理」の次の階層に「\0000年00月決算」 を作成する事が可能な記述があるのでしょうか
    
*myPathを使用すれば可能なのかと考えましたが、手がつけられません。

(3) ご指示にも、的確にご返事出来ませんが宜しくお願い申し上げます。

補足日時:2009/08/27 12:57
    • good
    • 0

dim tgtdrv as string


dim cdrv as string
dim ddrv as string
dim zdrv as string
dim res as string
cdrv=MkDir "C:\Documents and Settings\" & UserName & "\My Documents\販売管理\0000年00月決算\買掛金元帳"
ddrv="D:"
zdrv=Z:\5TM
res=inputbox("ドライブは?”
select case res
case "c"
tgtdrv=cdrv
case "d"
tgtdrv=ddrv
case "z"
tgedrv=zdrv
case else
msgbox("ドライブが違います”)
end select
Mkdir tgtdrv & "販売管理\0000年00月決算\管理表"

ではいかがですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!