Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


708 / 13645 ツリー ←次へ | 前へ→

【78852】ファイル移動 ピアニッチ 17/2/11(土) 19:26 質問[未読]
【78853】Re:ファイル移動 マナ 17/2/11(土) 21:34 発言[未読]
【78854】Re:ファイル移動 β 17/2/11(土) 21:51 発言[未読]
【78855】Re:ファイル移動 ピアニッチ 17/2/11(土) 22:38 回答[未読]
【78856】Re:ファイル移動 β 17/2/11(土) 23:00 発言[未読]
【78857】Re:ファイル移動 ピアニッチ 17/2/11(土) 23:16 発言[未読]
【78858】Re:ファイル移動 β 17/2/11(土) 23:43 発言[未読]
【78860】Re:ファイル移動 ピアニッチ 17/2/12(日) 11:37 お礼[未読]

【78852】ファイル移動
質問  ピアニッチ  - 17/2/11(土) 19:26 -

引用なし
パスワード
   ワークシートにパスが入力されています。そのパスの直下にInputBoxで指定した数字名のフォルダに複数のファイルが存在しています。
InputBoxで指定した数字名のパスの中にある"N1.jpg"を指定されたフォルダに移動後、ファイル名の変更をしたいのですが
下記の箇所でファイルが見つかりませんとエラーが出てしまいます。
どのように処理すれば良いでしょうか。よろしくお願いします。
問題箇所:myFso.MoveFile oFilN1, nFilN1


Sub 転送()
Dim myFso As Object
Dim path1 As String
Dim day As String
Dim oFilN1 As String
Dim nFilN1 As String
Dim buffer1 As String

Set myFso = CreateObject("Scripting.FileSystemObject")
'移動元ファイルの検索と移動先の指定
path1 = Range("C12")
day = InputBox("日付を入力して下さい")
If day <> Empty Then
day = CInt(day)
Else
Exit Sub
End If
oFilN1 = Dir(path1 & "\" & day & "\" & "N1.jpg", vbNormal)
nFilN1 = Workbooks("起動シート.xls").path
If Not myFso.fileExists(filespec:=oFilN1) Then
myFso.MoveFile oFilN1, nFilN1
End If

'フォルダ内の画像ファイル名を変更
buffer1 = Dir(path1 & "\" & "N1.jpg", vbNormal)
If buffer1 <> Empty Then
Name path1 & buffer1 As Replace(path1 & buffer1, "N1.jpg", "N1#1_001.jpg")
Else
MsgBox "N1.jpgがありません"
End If
Set myFso = Nothing
End Sub

【78853】Re:ファイル移動
発言  マナ  - 17/2/11(土) 21:34 -

引用なし
パスワード
   ▼ピアニッチ さん:

こういうときは、ステップ実行で、変数に何がはいっているか確認するとよいです。
ところで、movefileで、名前も変えてしまえばよいと思います。

【78854】Re:ファイル移動
発言  β  - 17/2/11(土) 21:51 -

引用なし
パスワード
   ▼ピアニッチ さん:

ちょっと 危なっかしいコードですね。

oFilN1 = Dir(path1 & "\" & day & "\" & "N1.jpg", vbNormal)

もし、N1.jpg が指定フォルダにない場合、oFilN1 は 空白値("")になります。
存在していたとしても oFilN1 は N1.jpg だけ(ファイル名だけ)になります。

If Not myFso.fileExists(filespec:=oFilN1) Then

ここでファル名しか与えていない(パス文字列がない)のもきわめて気になります。

仮に N1.jpg が指定フォルダにあっても、FSOから見れば、どのフォルダ?
(カレントディレクトリーだと判断?)結果は 存在しないと判定 --> MoveFileは実行される。

N1.jpg がなければ、もちろん ないと判定され MoveFileが実行される。

myFso.MoveFile oFilN1, nFilN1

この時、oFilN1 の値はどうなっているでしょうか?
ちゃんとしたフォルダパス文字列も含んだファイルフルパス文字列になっているでしょうか?

そもそもが、If Not myFso.fileExists(filespec:=oFilN1) Then
ここでは何を判定したかったのですか?

で、

Replace(path1 & buffer1, "N1.jpg", "N1#1_001.jpg")

これは何をしているつもりでしょう。
単に、メモリー内の文字列を変換しているだけですけど?

【78855】Re:ファイル移動
回答  ピアニッチ  - 17/2/11(土) 22:38 -

引用なし
パスワード
   >oFilN1 = Dir(path1 & "\" & day & "\" & "N1.jpg", vbNormal)

>myFso.MoveFile oFilN1, nFilN1

おっしゃる通り、oFilN1 は N1.jpg(ファイル名) と返ってきます。
なぜフォルダパス文字列が返ってこないのか理解できていません。
フォルダパス文字列が返ってこない為、移動ができていない状況です。

>If Not myFso.fileExists(filespec:=oFilN1) Then
判定に関して・・特に強い意味はありません。

> Replace(path1 & buffer1, "N1.jpg", "N1#1_001.jpg")
質問の際、記述を誤って投稿してしまいました。
申し訳ありません。

なにぶん、素人の為意味不明な点が多々あると思いますが、
ご理解いただきたい。

【78856】Re:ファイル移動
発言  β  - 17/2/11(土) 23:00 -

引用なし
パスワード
   ▼ピアニッチ さん:

>質問の際、記述を誤って投稿してしまいました。

掲示板にコードを手打ちされたんですか?
混乱の元です。

実際のコードをコピペでアップしてください。

【78857】Re:ファイル移動
発言  ピアニッチ  - 17/2/11(土) 23:16 -

引用なし
パスワード
   ご教授の程、よろしくお願いします。


Sub 転送()
  Dim myFso As Object
  Dim path1 As String
  Dim path2 As String
  Dim path3 As String
  Dim day As String
  Dim oFilN1 As String
  Dim nFilN1 As String
  Debug.Print
  Set myFso = CreateObject("Scripting.FileSystemObject")
  '移動元ファイルの検索と移動先の指定
  path1 = Range("C12")
  day = InputBox("日付を入力して下さい")
  If day <> Empty Then
    day = CInt(day)
  Else
    Exit Sub
  End If
  oFilN1 = Dir(path1 & "\" & day & "\" & "N1.jpg")
  nFilN1 = Workbooks("起動シート.xls").path
  MsgBox oFilN1

  
  If Not myFso.fileExists(filespec:=oFilN1) Then
    myFso.MoveFile oFilN1, nFilN1
  End If
  Set myFso = Nothing
End Sub
  

【78858】Re:ファイル移動
発言  β  - 17/2/11(土) 23:43 -

引用なし
パスワード
   ▼ピアニッチ さん:

新しいファイル名をどうしたいのかが見えませんので以下では
N1.jpg のままにしてあります。(★ のところ)
ここは、実際のものに変えてください。

移動シート.xls というのは、このマクロブックのことだという前提。

現在の構成は ある親フォルダ配下のサブフォルダを INPUTBOX入力で
指定させ、そのサブフォルダ内の N1.jpg を対象にしていますね。
そうではなく、直接、ファイル選択ダイアログで、N1.jpg を選ばせたほうが
よろしいかとは思いますが、そちらの構成通り、まずフォルダを選ばせます。
ただし、INPUTBOX ではなくフォルダ選択ダイアログを表示して選択させます。

Sub Sample()
  Dim myFso As Object
  Dim path1 As String
  Dim oPath As String
  Dim nPath As String
  Dim oName As String
  Dim nName As String
  Dim oFile As String
  Dim nFile As String
  
  oName = "N1.jpg"
  nName = "N1.jpg"    '★
  
  Set myFso = CreateObject("Scripting.FileSystemObject")
  '元ファイルフォルダの親フォルダ
  path1 = Range("C12").Value
  If Right(path1, 1) <> "\" Then path1 = path1 & "\"
  'フォルダ選択
  With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = path1
    .Title = "フォルダを選んでください"
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub  'キャンセルボタン
    oPath = .SelectedItems(1)
  End With
  
  nPath = ThisWorkbook.Path
  oFile = oPath & "\" & oName
  nFile = nPath & "\" & nName
  
  '転記元 N1.pdf の存在チェック
  If Not myFso.fileexists(oFile) Then
    MsgBox "ファイルが存在しません"
    Exit Sub
  End If
  '転記先ファイルの削除(念のため)
  If myFso.fileexists(nFile) Then myFso.GetFile(nFile).Delete Force:=True
  'ファイル移動
  myFso.MoveFile oFile, nFile
  
  MsgBox "ファイルを移動しました"
  
End Sub

【78860】Re:ファイル移動
お礼  ピアニッチ  - 17/2/12(日) 11:37 -

引用なし
パスワード
   コード内容を検証しながら、動作確認を致しました。
ファイル選択ではダイアログを使用した方がパス取得に効果的なのですね。

'元ファイルフォルダの親フォルダ
  path1 = Range("C12").Value
課題として親フォルダが複数あるケース(Range("C13").Value)で同様にファイルを移動後、ファイル名を変更するという処理があるのですが、まずは自力で行いたいと思います。

ご回答して頂いた方々、お世話になりました。

708 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free