プロが教える店舗&オフィスのセキュリティ対策術

指定フォルダ名、指定ファイル名は、管理シートに記載し指示する形です。またそのファイルを元のフォルダへ戻す指示も、管理シートを書き直すのではなくできたら嬉しいです。どなたかよろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    GooUserラック様
    早々にお教え頂きありがとうございます。私の質問に足りないところがございました。
    移動元のフォルダの中には、複数ファイルが入っていて、それを複数フォルダへ移動させたいのです。添付ファイルのような管理表を作成し、コントロールできたらいいなぁと思っています。いかがでしょうか?

    「Excel 指定したフォルダから指定した」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2017/01/26 12:43
  • うーん・・・

    移動元フォルダも移動先フォルダも同一フォルダ内にあるものと仮定して結構です。格納されているフォルダも異なる場合は、管理シートでそのフォルダの存するアドレス欄もつくればいいのでしょうか?それによるマクロが大変であれば、同一フォルダ内にあるフォルダ内ファイルの移動が同一フォルダ内の他のフォルダへ移動できれば大丈夫です。よろしくお願いします。

      補足日時:2017/01/26 13:14
  • うーん・・・

    GooUserラック様 ご回答ありがとうございます。ただ、私は詳しくないので教えて頂いた内容がよくわかりません。ごめんなさい、、、。
    「基準になるホルダー」とは、移動元、その移動したいファイルがおいてあるフォルダーのことを言っていますか?下記Excelシートでいうと、A列に記載のフォルダでしょうか?「ホルダーを固定する」もすみません、もう少しその意味を教えて頂ければと思います。
    自動化したいことをもう一度申し上げると、マクロ記載のあるExcelファイルが存するフォルダー内に格納されている指定フォルダ(A列記載)から、同じくマクロ記載のあるExcelファイルが存するフォルダー内に格納されている別指定フォルダ(C列記載)へ指定ファイル(B列記載)のものが移ることを希望します。またその逆、つまり戻すこともA列とC列を書き直すことなしに別のマクロで自動化したいです。
    続きを次質問で記載致します

    「Excel 指定したフォルダから指定した」の補足画像3
    No.4の回答に寄せられた補足コメントです。 補足日時:2017/01/27 10:17
  • 続きです。
    フォルダに同一名のファイルがあった場合は、「上書き」を確認の上、移動、上書きをすることを臨みます。
    本当はA列、C列にフォルダパスを記載すれば、わざわざマクロ記載のあるExcelの存するフォルダ内で作業しなくて良いのかもしれません。そのようなVBAをお願いできるのでしょうか??
    詳しくないのに、要望ばかりで申し訳ないです。どうでしょうか??

      補足日時:2017/01/27 10:19

A 回答 (7件)

No.6 の修正



上書き時にエラーが発生していました。
「Kill (先パス & "\" & Cells(行, 2).Value)」を次のように追加してください。
-----------------------------------------------------------------------------
Sub 送る()
Call 移動("送り")
End Sub

Sub 戻す()
Call 移動("戻し")
End Sub

Sub 移動(モード As String)
Dim 基本パス As String
Dim 元パス As String
Dim 先パス As String
Dim 行 As Long
Dim 回答 As Integer
基本パス = ThisWorkbook.Path & "\"
Sheets("管理シート").Select
For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If モード = "送り" Then
元パス = 基本パス & Cells(行, 1).Value
先パス = 基本パス & Cells(行, 3).Value
Else
元パス = 基本パス & Cells(行, 3).Value
先パス = 基本パス & Cells(行, 1).Value
End If
If Dir(元パス & "\" & Cells(行, 2).Value) = "" Then
Range(Cells(行, 1), Cells(行, 3)).Select
回答 = MsgBox("元のファイルがありませんでした。" & Chr(13) & _
"飛ばしてして作業を続けますか?" & Chr(13) & Chr(13) & _
"はい : 飛ばして続行" & Chr(13) & Chr(13) & _
"いいえ : 全作業を中止して終了", vbDefaultButton2 + vbYesNo, モード)
If 回答 = vbNo Then Exit Sub
Else
If Dir(先パス & "\" & Cells(行, 2).Value) <> "" Then
Range(Cells(行, 1), Cells(行, 3)).Select
回答 = MsgBox("同名のファイルがありました。" & Chr(13) & _
"上書きしますか?" & Chr(13) & Chr(13) & _
"はい : 上書きして続行" & Chr(13) & Chr(13) & _
"いいえ : 上書きせず、飛ばして続行" & Chr(13) & Chr(13) & _
"キャンセル : 全作業を中止して終了", vbDefaultButton1 + vbYesNoCancel, モード)
If 回答 = vbCancel Then Exit Sub
If 回答 = vbYes Then
Kill (先パス & "\" & Cells(行, 2).Value)
Name 元パス & "\" & Cells(行, 2).Value As 先パス & "\" & Cells(行, 2).Value
End If
Else
Name 元パス & "\" & Cells(行, 2).Value As 先パス & "\" & Cells(行, 2).Value
End If
End If
Next
MsgBox ("終了しました")
End Sub
-----------------------------------------------------------------------------
    • good
    • 1
この回答へのお礼

GooUserラック様 早々にご回答頂いていたのに、お返事が遅れて申し訳ございません。ばたばたしており、まだVBAを実装できていません。申し訳ないです。近日中に対応いたします。またご連絡させて下さい!

お礼日時:2017/02/03 09:13

続いてメッセージを表示する場合


-----------------------------------------------------------------------------
Sub 送る()
Call 移動("送り")
End Sub

Sub 戻す()
Call 移動("戻し")
End Sub

Sub 移動(モード As String)
Dim 基本パス As String
Dim 元パス As String
Dim 先パス As String
Dim 行 As Long
Dim 回答 As Integer
基本パス = ThisWorkbook.Path & "\"
Sheets("管理シート").Select
For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If モード = "送り" Then
元パス = 基本パス & Cells(行, 1).Value
先パス = 基本パス & Cells(行, 3).Value
Else
元パス = 基本パス & Cells(行, 3).Value
先パス = 基本パス & Cells(行, 1).Value
End If
If Dir(元パス & "\" & Cells(行, 2).Value) = "" Then
Range(Cells(行, 1), Cells(行, 3)).Select
回答 = MsgBox("元のファイルがありませんでした。" & Chr(13) & _
"飛ばしてして作業を続けますか?" & Chr(13) & Chr(13) & _
"はい : 飛ばして続行" & Chr(13) & Chr(13) & _
"いいえ : 全作業を中止して終了", vbDefaultButton2 + vbYesNo, モード)
If 回答 = vbNo Then Exit Sub
Else
If Dir(先パス & "\" & Cells(行, 2).Value) <> "" Then
Range(Cells(行, 1), Cells(行, 3)).Select
回答 = MsgBox("同名のファイルがありました。" & Chr(13) & _
"上書きしますか?" & Chr(13) & Chr(13) & _
"はい : 上書きして続行" & Chr(13) & Chr(13) & _
"いいえ : 上書きせず、飛ばして続行" & Chr(13) & Chr(13) & _
"キャンセル : 全作業を中止して終了", vbDefaultButton1 + vbYesNoCancel, モード)
If 回答 = vbCancel Then Exit Sub
If 回答 = vbYes Then
Name 元パス & "\" & Cells(行, 2).Value As 先パス & "\" & Cells(行, 2).Value
End If
Else
Name 元パス & "\" & Cells(行, 2).Value As 先パス & "\" & Cells(行, 2).Value
End If
End If
Next
MsgBox ("終了しました")
End Sub
-----------------------------------------------------------------------------
※ 問題発生時のメッセージボックスのタイトルに「送り」か「戻し」を表示しました。
※ 問題発生箇所が判るようにセルを選択しました。
※ 終了のメッセージを表示しました。
    • good
    • 1

まずフォルダーに関してだけ



A列、C列にドライブ名を含めたフルパスが書かれているならば、
「元パス = 基本パス & Cells(行, 1).Value」は「元パス = Cells(行, 1).Value」
「先パス = 基本パス & Cells(行, 3).Value」は「先パス = Cells(行, 3).Value」
で済んでしまいますが見難くありませんか?
共通な部分を「基本パス」に書き込んでいれば見やすくなります。
「ThisWorkbook.Path」はマクロの書かれたファイルの場所を基準に出来るのでパソコンのドライブ構成などに影響されにくいので簡単に扱えると思うのですが…
    • good
    • 1

No.3 追補



「基準になるホルダーを固定する」ならば、以下のような感じに修正してください。

「基本パス = ThisWorkbook.Path & "\"」
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
「基本パス = "C:\Users\XXXX\Documents\"」
この回答への補足あり
    • good
    • 1

「マクロがあるファイル(管理シート)の有るホルダーを基準のホルダーにする。

」で作成してみました。
-----------------------------------------------------------------------------
Sub 送る()
Call 移動(True)
End Sub

Sub 戻す()
Call 移動(False)
End Sub

Sub 移動(送り As Boolean)
Dim 基本パス As String
Dim 元パス As String
Dim 先パス As String
Dim 行 As Long
基本パス = ThisWorkbook.Path & "\"
Sheets("管理シート").Select
For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If 送り Then
元パス = 基本パス & Cells(行, 1).Value
先パス = 基本パス & Cells(行, 3).Value
Else
元パス = 基本パス & Cells(行, 3).Value
先パス = 基本パス & Cells(行, 1).Value
End If
If Dir(元パス & "\" & Cells(行, 2).Value) = "" Then
MsgBox ("ファイルがありません")
Exit For
End If
If Dir(先パス & "\" & Cells(行, 2).Value) <> "" Then
MsgBox ("同名ファイルがありました")
Exit For
End If
Name 元パス & "\" & Cells(行, 2).Value As 先パス & "\" & Cells(行, 2).Value
Next
End Sub
-----------------------------------------------------------------------------
※ 移動元にファイルが無いと途中で中止します。
※ 移動先に同じファイルがあると途中で中止します。
    • good
    • 1

どちらの方が良いでしょうか?


①マクロがあるファイル(管理シート)の有るホルダーを基準のホルダーにする。
②基準になるホルダーを固定する。(例:C:\Users\XXXX\Documents)
    • good
    • 1

単純に以下のような感じではダメでしょうか?


・A1セルに元のフォルダー名、A2セルにファイル名、A3セルに移動先フォルダー名が、それぞれ入っているものとします。
------------------------------------------------------------------------
Sub 送る()
Name Range("A1").Value & "\" & Range("A2").Value As Range("A3").Value & "\" & Range("A2").Value
End Sub

Sub 戻す()
Name Range("A3").Value & "\" & Range("A2").Value As Range("A1").Value & "\" & Range("A2").Value
End Sub
------------------------------------------------------------------------
この回答への補足あり
    • good
    • 1

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