エクセルVBAで場所の指定
- エクセルVBAで移動前のフォルダの場所を指定する方法について教えてください。
- 移動前のフォルダの場所をあらかじめフルパスで指定して、移動後のフォルダの場所に移動する方法を教えてください。
- 移動前のフォルダの場所が変わっても対応できるようにするには、どのように記述すれば良いですか?
- ベストアンサー
エクセルVBAで場所の指定
また質問させていただきます。先日Wendy02さんに以下のコードを お教えいただきました。 少し内容を変更したくまた質問をさせていただきます。 移動前のフォルダ名をあらかじめフルパスで指定してある セルがあるのですが、そのセルには C:\Documents and Settings\user\デスクトップ\Test1Fold とあるとして、そのパスを取得して SourceDir = SourceFolder & "Test1Fold\" '末尾に\ は付けなくてよい の部分は移動前のフォルダが変わっても対応できるようにしたいのですが、どのようにするのかわかりません。どのように記述すればいいでしょうか?よろしくお願いします。 Sub MoveDirectries() Dim SourceFolder As String Dim SourceDir As String Dim DestFolder As String Dim DestDir As String Dim ArDirs() As String Dim FOLname As String Dim i As Integer Dim v As Variant Dim ret As Integer 'Win 2000以上 Const MYCMD1 As String = "CMD /C MOVE " '末尾は半角スペースを開ける SourceFolder = ActiveWorkbook.Path & "\" 'ベースのフォルダ(元)\ は必ず付ける DestFolder = ActiveWorkbook.Path & "\" 'ベースのフォルダ(先)\ は必ず付ける SourceDir = SourceFolder & "Test1Fold\" '末尾に\ は付けなくてよい DestDir = DestFolder & "Test1AFold\" '最終フォルダに \ があったら省く If Right(SourceDir, 1) = "\" Then SourceDir = Mid$(SourceDir, 1, Len(SourceDir) - 1) If Right(DestDir, 1) = "\" Then DestDir = Mid$(DestDir, 1, Len(DestDir) - 1) ReDim Preserve ArDirs(i) FOLname = Dir(SourceDir & "\", vbDirectory) Do While FOLname <> "" If FOLname <> "." And FOLname <> ".." Then If (GetAttr(SourceDir & "\" & FOLname) And vbDirectory) = vbDirectory Then ReDim Preserve ArDirs(i) ArDirs(i) = FOLname i = i + 1 End If End If FOLname = Dir Loop 'フォルダの下のフォルダを作るのは一回のみ For Each v In ArDirs() If Dir(DestDir & "\" & v, vbDirectory) = "" Then ret = Shell(MYCMD1 & """" & SourceDir & "\" & v & """" & " " & """" & DestDir & """") ElseIf Dir(DestDir & "\" & v & "\" & v, vbDirectory) = "" Then ret = Shell(MYCMD1 & """" & SourceDir & "\" & v & """" & " " & """" & DestDir & "\" & v & """") End If Next v End Sub
- reprogress
- お礼率45% (40/87)
- オフィス系ソフト
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。Wendy02です。 ソース元のフォルダが変わる場合に対して、フォルダ表示ダイアログを付けてみました。 BrowseForFolder(0, "フォルダを選択してください", 0, 0) この、第4番目の引数、0 を、いつも開く親フォルダを書き込めば、そこから開くことが可能です。 例: BrowseForFolder(0, "フォルダを選択してください", 0, "C:\") また、第4番目の引数の定数には、5 -My Document(User) などがあります。 ------------------------------------------------------ Sub CopyDirectriesR() Dim SourceFolder As String Dim SourceDir As String Dim DestFolder As String Dim DestDir As String Dim ArDirs() As String Dim FOLname As String Dim i As Integer Dim v As Variant Dim ret As Integer Dim shl_Folder As Object ''移動先フォルダここは任意の設定 DestFolder = ActiveWorkbook.Path & "\" 'ベースのフォルダ(先)\ は必ず付ける DestDir = DestFolder & "Test1AFold\" 'Win 2000以上 Const MYCMD1 As String = "CMD /C MOVE " '末尾は半角スペースを開ける ''Win 9X系(未検査) ''Const MYCMD1 As String = "COMMAND.COM /C MOVE " '末尾は半角スペースを開ける ''ソース側のフォルダ表示ダイアログ Set shl_Folder = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0, 0) 'BrowseForFolder(lngHWND, strTitle, lngOptions, [RootFolder]) 'lngHWND は0, strTitle は適当に, lngOptions =0, ルート =0 は、ユーザーデスクトップ If Not shl_Folder Is Nothing Then SourceDir = shl_Folder.Items.Item.Path Else Exit Sub End If '最終フォルダに \ があったら省く If Right(DestDir, 1) = "\" Then DestDir = Mid$(DestDir, 1, Len(DestDir) - 1) ReDim Preserve ArDirs(i) FOLname = Dir(SourceDir & "\", vbDirectory) Do While FOLname <> "" If FOLname <> "." And FOLname <> ".." Then If (GetAttr(SourceDir & "\" & FOLname) And vbDirectory) = vbDirectory Then ReDim Preserve ArDirs(i) ArDirs(i) = FOLname i = i + 1 End If End If FOLname = Dir Loop 'フォルダの下のフォルダを作るのは一回のみ For Each v In ArDirs() If Dir(DestDir & "\" & v, vbDirectory) = "" Then Debug.Print MYCMD1 & """" & SourceDir & "\" & v & """" & " " & """" & DestDir & """" ret = Shell(MYCMD1 & """" & SourceDir & "\" & v & """" & " " & """" & DestDir & """") ElseIf Dir(DestDir & "\" & v & "\" & v, vbDirectory) = "" Then ret = Shell(MYCMD1 & """" & SourceDir & "\" & v & """" & " " & """" & DestDir & "\" & v & """") End If Next v End Sub
関連するQ&A
- エクセルVBAで指定場所にフォルダー作成
エクセルのVBAマクロ機能を使い、 自動フォルダー作成&リンクするマクロを作成したのですが、 現在のマクロですと「A(仮名)」の中にフォルダーに作ってしまいますので 下記の様に階層で指定出来る様にしたいのですが、教えて頂けないでしょうか? 出来れば、そのままマクロ貼り付けで使える様にしたいので、 下記に途中までのマクロを編集して頂ければ助かります。 「A(仮名)」と言うフォルダーの中にエクセルファイルの管理表を入れ 「A」のフォルダーの中に「B(仮名)」と言うフォルダーを作り、 その中に管理台帳で自動作成されるフォルダーがつくられる様にしたい。 現在のマクロ Sub MakeHyLink() Dim wkStr As String If ActiveCell.Column <> 1 Then Exit Sub If ActiveCell.Value = "" Then MsgBox "アクティブセルは未入力、やり直し" Exit Sub End If wkStr = ThisWorkbook.path & "\" & ActiveCell.Value If Dir(wkStr, vbDirectory) = "" Then MsgBox "フォルダー:" & wkStr & vbLf & " を、作成します。" MkDir wkStr Else MsgBox "フォルダー:" & wkStr & vbLf & " は、存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr End Sub
- 締切済み
- オフィス系ソフト
- 複数フォルダに格納されたファイル名取得VBA
お世話になっております。 あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。 ■エラー プロシージャの呼び出し、または引数が不正です 下から3行目、「buf = Dir()」が問題であることはわかるのですが、 何が問題でどのように解決したらいいかわかりません。 どなたかご教授の程よろしくお願い致します(>_<) ------------------------------------------------------------------------ Sub test() Dim buf As String Dim fName As String Dim msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If GetAttr(buf) And vbDirectory Then If buf <> "." And buf <> ".." Then fName = Dir(CurDir & "\" & buf & "\" & "*.jpg") Do While fName <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = fName msg = msg & buf & "\" & fName & vbCrLf fName = Dir() Loop MsgBox msg End If End If buf = Dir() Loop End Sub ------------------------------------------------------------------------ これが実現できないと細かい作業を毎日繰り返す事となり、 かなり業務不可が高いです。。 繰り返しになってしまいますが、どなたかご回答よろしくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBA自動ハイパーリンクフォルダー指定場所
管理台帳を作成したく、下記のVBAを作りました。 マクロ内容は、Aセルに管理番号を入力しマクロ実行ボタンにて、 入力した番号と同じフォルダーを作成しハイパーリンクする自動フォルダー作成&ハイパーリンクマクロです。 現在のフォルダー作成場所はローカルのDドライブ直下に作る様に指定しているのですが、 エクセルVBAがある場所と同じ場所に、上記のマクロで作るフォルダーが出来る様にしたいのですが、 見よう見まねでVBAを何とか作ったのですが、知識がなくこれ以上が解りません。 出来れば、下記のVBAを編集して頂、教えて頂いたVBAをそのままコピペすれば使える状態で教えて頂ければ助かります。 宜しくお願い致します。 Sub MakeHyLink() Const path As String = "D:\" Dim wkStr As String If ActiveCell.Column = 1 Then wkStr = path & ActiveCell.Value If Dir(wkStr, vbDirectory) = vbNullString Then MsgBox wkStr & "フォルダがありません。作成します。" MkDir wkStr Else MsgBox wkStr & "フォルダは存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr End If
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBAでConsolidate
以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?
- ベストアンサー
- オフィス系ソフト
- VBAでファイルを消したい
こんばんわ! VBAでエクセルファイルをバックアップしながら使用しているのですが、10個以上ファイルが溜まったら一番古いものを消したいです。 途中まではできているのですが、古いファイルを選択する方法が分かりませんToT 途中までのソースを乗せますので、アドバイスの程よろしくお願いいたします。 ================== Private Sub backup_bot_Click() Dim Path As String, WSH As Variant Dim fc As Long Dim fn As String 'マイドキュメントにバックアップ Set WSH = CreateObject("WScript.Shell") Path = WSH.SpecialFolders("MyDocuments") & "\test" If Dir(Path, vbDirectory) = "" Then MkDir (Path) End If 'ファイルコピー FileCopy "c:test_date\aaa.xls", Path & "\aaa" & Format(Now, "yyyymmdd") & ".xls" 'ファイル数確認 fn = Dir(Path & "\aaa*.xls") Do While fn <> "" fc = fc + 1 fn = Dir() Loop '10件以上消去 If fc > 10 Then 'ここが分かりません! End If End Sub ================== あ~ちなみにoffice2003エクセルを使用しています。 XP以降のOSで動かしたいです!
- ベストアンサー
- その他MS Office製品
- フォルダのファイル数をvbaで取得したい
vbaなのですが、フォルダにgifファイルがたくさんはいっていますが、 その数を数えるコードを教えてください。 今は、 Sub Macro7() Dim File As String Dim i As Long File = Dir("C:\*.*", vbDirectory) Do While File <> "" File = Dir i = i + 1 Loop MsgBox "ファイル数は" & i & "です" End Sub のように、全てのファイル数をカウントして求めています。
- ベストアンサー
- Visual Basic
- VBA 探しているFileがないときの処理方法
現在、下記のようにしてマクロ実行ブックと同じ階層のフォルダ名を取得してAに、フォルダ内のabc.XLSのC9の値をBに、abc.XLSの更新日時をCに表示させています。 このとき、フォルダ内にabc.XLSが無い場合にファイル名をAに書き出してB及びCは空白というように表示したいのですが、どのようにすればよろしいでしょうか。 macro1は以前質問させて頂いたものがベースになっています。ExecuteExcel4Macroを使っている関係でファイル名が無いときの処理はDirを使ってできるとmougで調べてわかりましたが、自分の知識ではできず、macro2を作成したのですが、指定ファイルがない場合の処理がうまくできずにいます。 macro1はファイルオープンの窓が開きます。macro2はファイルが存在しないという窓が開きます。 どちらの場合でもかまいませんのでお力をお貸し頂けませんでしょうか。 Sub macro1() Dim myPath As String Dim myFolder As String Dim r As Long r = 3 myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" Application.ScreenUpdating = False Range("A3:C60").Clear Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1) = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[" & myBook & "]Sheet1 '!R9C3") On Error Resume Next Cells(r, 3) = FileDateTime(myPath & myFolder & "\" & myBook) On Error GoTo 0 If Cells(r, 3) = "" Then Cells(r, 2) = "myBook" End If Cells(r, 2).NumberFormatLocal = "#,##0_ " Cells(r, 3).NumberFormatLocal = "y""年""m""月""" With Range("A3:C60") .Sort Key1:=Range("C3"), Order1:=xlAscending .Borders.LineStyle = True End With r = r + 1 End If End If myFolder = Dir() Loop Application.ScreenUpdating = True End Sub Sub Macro2() Dim myPath As String Dim myFolder As String Dim myBook As String myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" i = 2 Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Workbooks.Open (myPath & myFolder & "\" & myBook) Range("C9").Activate Selection.Copy ThisWorkbook.Activate Cells(i, 1) = myFolder Cells(i, 2).PasteSpecial xlValues Cells(i, 3) = FileDateTime(myPath & myFolder & "\" & myBook) Workbooks(myBook).Close SaveChanges:=False i = i + 1 End If End If myFolder = Dir() Loop End Sub
- ベストアンサー
- Visual Basic
- エクセルVBAでフォルダの作成-2
先ほどダブルクリックすると、クリックしたその名前にしたフォルダを作成して、ハイパーリンクを設定する、ということで質問させていただき、良い回答を頂き質問を閉じましたが、また質問があります。 A列をクリックするとイベントを発生させるのを、 A4セルから、その下のデータが入っているセルまで をイベントが有効な範囲にしたいと思い、考えています。 「If Target.Column = 1 Then」の部分がそれだと思い、 If Target.Range("A4", Range("A" & Rows.Count).End(xlUp)) Then のように考えて実行しましたが、これはダメでした。 このように限られた範囲に変更すにはどのようにすればいいでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const path As String = "D:\TEMP\倉庫\" Dim wkStr As String If Target.Column = 1 Then wkStr = path & Target.Value If Dir(wkStr, vbDirectory) = vbNullString Then MsgBox wkStr & "フォルダがありません。作成します。" MkDir wkStr Else MsgBox wkStr & "フォルダは存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=Target, Address:=wkStr End If End Sub
- ベストアンサー
- オフィス系ソフト
- VBAマクロ Path名取得について
msoFileDialogFilePickerで選択したファイルのフォルダ名を取得したいのですが、エラーが出てしまいます。 初歩的な話かと思いますが、解決できず困っています。 よろしくお願い致します。 --------------------------------------- Dim Pfile as String Dim fName as String, fPath as String Set objDialog = Application.FileDialog(msoFileDialogFilePicker) If objDialog.Show Then Pfile = objDialog.SelectedItems(1) End If Set objDialog = Nothing fName = Dir(Pfile) fPath = Workbooks(fName).Path ↑ここで、「インデックスが有効範囲にありません」
- ベストアンサー
- Visual Basic
- エクセルVBAでBOOKを開く際の処理
エクセルVBAでBOOKを開く際の処理 エクセル2000です。 VBAで特定のフォルダー内のBOOKを開き、1枚目のシートSheets(1)のデータを読み込んで別BOOK(マクロを記載したBOOK)にコピペしたら保存せず閉じるコードを下記のように書きました。(かなり簡略化しましたが) これで作動するのですが、万一、そのフォルダー内のBOOKが開いていても1枚目のシートのデータを読み込み後、閉じられてしまいます。 BOOKが開いていれば、その開いていたBOOKは閉じず、先に進むようにするにはどのように直せばいいでしょうか? Sub TEST01() Dim mb As Workbook, wb As Workbook Dim myfd As String, fnme As String, ans As Byte, i As Long ans = MsgBox("集計用フォルダーには回収したアンケートファイルとこの集計用ファイルしかないですね?", vbYesNo + vbQuestion, "( ̄∇ ̄) ? ") If ans = vbNo Then MsgBox "それじゃだめです。", vbCritical, "Σ( ̄ロ ̄lll)" Exit Sub End If Set mb = ThisWorkbook myfd = mb.Path fnme = Dir(myfd & "\*.xls") Do Until fnme = Empty If fnme <> mb.Name Then Set wb = Workbooks.Open(myfd & "\" & fnme) i = i + 1 mb.Sheets(1).Cells(i, 1) = wb.Sheets(1).Range("S10") wb.Close (False) '保存せずに閉じる End If fnme = Dir Loop Set mb = Nothing Set wb = Nothing MsgBox i End Sub
- ベストアンサー
- その他MS Office製品
お礼
Wendy02さんありがとうございます。今回もすごいアイデアで 感激しています。指定の仕方覚えました。応用してできるまで は時間がかかるかもしれませんが、大変勉強になりました。 ありがとうございました。