Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : 指定なし)
ファイル使用中のフォルダ名編集不可防止方法
投稿日時: 20/11/08 22:06:48
投稿者: けんでん

初歩的な質問で大変申し訳ありませんがどなたかご教授願います。
VBAにてベースとなるBOOKから他のbookを開き値を入力し閉じた後保存先のフォルダが使用中のため編集できませんとメッセージが出てしまいます。
何らかの構文追加で上記のエラーを防止することはできますでしょうか?
 
ちなみに、ベースとなるbookを閉じると編集可能となります。

回答
投稿日時: 20/11/09 00:51:48
投稿者: simple

それは当然じゃないですか?
フォルダの中のブックを開いている最中に、
そのフォルダ名を変更するなんて無茶する方が悪いです。
ブックは、どのフォルダに保存されていたかという情報を持っていて、
それを勝手に変更されたら困るわけです。
 
そういう使い方をしたら警告が出るのが正しく、
そうしたことはしないようにしてください。
そんな横車を押すようなことをサポートするようなことは考えないことです。
 
既に書かれているように、いったん閉じてから、幾らでも変更すれば済む話です。

回答
投稿日時: 20/11/09 02:55:32
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

ブックA:ベースとなるマクロ有ブック。フォルダ1に存在。
ブックB:ブックAのマクロから開かれるブック。フォルダ2に存在。
 
「ブックAのマクロでブックBをオープン、編集、保存、クローズした後、
ブックBをクローズした後もフォルダ2がつかまれている状態で変更できない」
という問題だと解釈しました。
 
上記を試してみましたが、ブックAのマクロが終わった後は、
ブックAを開いたままでも、フォルダ2の名前を変更できました。
 
解釈が誤っていて、ブックAとブックBが同じフォルダの場合は、
基本的にはフォルダ名変更前にブックAを閉じる必要があります。
しかし、ブックAを最初から読み取り専用で開いたり、
読み取り専用に変更すれば、一応は可能です。
 

Sub Test()

  Dim Path1 As String
  Dim Path2 As String
  Dim WB As Workbook
  Dim WS As Worksheet
  
  'ブックBの編集
  Application.ScreenUpdating = False
  Path1 = "変更前パス\BookB.xlsx"
  Set WB = Workbooks.Open(Path1)
  Set WS = WB.Worksheets(1)
  WS.Cells(1, 1).Value = "Test"
  WB.Close True
  Set WS = Nothing
  Set WB = Nothing
  Application.ScreenUpdating = True
  
  'ブックAの読み取り専用化
  ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
  
  'フォルダ名変更
  Path1 = "変更前パス"
  Path2 = "変更後パス"
  Name Path1 As Path2

End Sub

回答
投稿日時: 20/11/09 12:49:42
投稿者: simple

質問文に明確に書かれていませんが、
フォルダ名の変更などしていないのに、
>「使用中のため編集できません」とメッセージが出てしまいます。
ということなんですか?
それとも、フォルダ名を変更しようとしたところ、ということですか?
 
Excelブックを編集中は、編集情報を一時的にそのフォルダに持っています。
開いただけで、~$で始まるファイルが作られることは、Explorerでも確認できます。
 
それをExcel君が知らないところで、もし勝手に外部からフォルダ名を変えられたら、
Excelはその途中段階の情報にアクセスできなくなり、
今実行している編集作業自体が機能しなくなるはずです。(できないのですが、もしという話)
 
また、これはExcelファイルに限らず、配下にあるどんなファイルでも
開いているファイルが一つでもあるときには、フォルダ名の変更が抑止されます。
これはOSレベルの仕様だと思われます。
 
ですから、フォルダ名を変更するなら、ファイルを閉じてから、ということです。
いったん保存して閉じて、というマクロは、マクロ記録すれば作成できます。

投稿日時: 20/11/09 18:03:41
投稿者: けんでん

けんでん さんの引用:
初歩的な質問で大変申し訳ありませんがどなたかご教授願います。
VBAにてベースとなるBOOKから他のbookを開き値を入力し閉じた後保存先のフォルダが使用中のため編集できませんとメッセージが出てしまいます。
何らかの構文追加で上記のエラーを防止することはできますでしょうか?
 
ちなみに、ベースとなるbookを閉じると編集可能となります。

 
当方の表現があいまいで申し訳ございません。
 
当方が困っている件としては下記のようなケースとなります。
 
フォルダAにあるExcelファイルAに記載された値を
フォルダBにあるExcelファイルBをBookOpen等の構文を利用し開き
ExcelファイルBの指定されたセルに値を代入し閉じるといった動作を行った後
フォルダBの名称を変更しようとすると使用中のフォルダというポップアップメッセージが出てしまう。
 
以上のケースの場合何か構文を追加することによって、使用状態を開放することが可能なのかご教授願いたいという趣旨でございます。

回答
投稿日時: 20/11/09 18:57:09
投稿者: simple

どうやら不具合に関連したものである可能性がありますね。
事象が再現できるコードを一式提示してもらえますか?

投稿日時: 20/11/09 19:27:34
投稿者: けんでん

当方素人のためgoogleなどの検索で切り張りの構文で申し訳ございません。
下記に不具合の出ている構文を張り付け致します。
 
 
Private Sub FileOpen_Click()
 
Dim i As Long
Dim sum As Long
Dim percent As Integer
Dim count As Long
count = 2500
 
 
    Dim OpenFileName As Variant, Target As Variant
    OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                               MultiSelect:=True)
    If IsArray(OpenFileName) Then
        For Each Target In OpenFileName
            Workbooks.Open Target
             
             
 
'----------開いたシート保護の解除----------
    ActiveSheet.Unprotect Password:=""
             
             
             
'----------プログレスバーFormを表示----------
    UserForm1.Show vbModeless
'----------プログレスバーの最小値を設定----------
    UserForm1.ProgressBar1.Min = 1
'----------プログレスバーの最大値を設定----------
    UserForm1.ProgressBar1.Max = count
'----------プログレスバーの現在値を設定
    UserForm1.ProgressBar1.Value = 1
 
'DoEventsの度にマウスカーソルがちらつく為アイコンを待機中に固定
    Application.Cursor = xlWait
 
'時間の掛かる処理を行う
    For i = 0 To count
    sum = sum + i
 
'キャンセルボタン処理
    If UserForm1.IsCancel = True Then
'プログレスバーFormを閉じる
    Unload UserForm1
'マウスカーソルをデフォルトに戻す
    Application.Cursor = xlDefault
    MsgBox "処理を中断しました。"
End
'※今回はロールバック処理を考慮せずにバッサリ処理を終了しています。
End If
 
'プログレスバーの値表示を更新
    If UserForm1.ProgressBar1.Min < i And _
    UserForm1.ProgressBar1.Max >= i Then
 
'プログレスバーのLabel表示を更新
    percent = CInt(i / count * 100)
    UserForm1.Label1.Caption = percent & "%完了"
'プログレスバーの値を更新
UserForm1.ProgressBar1.Value = i
'滞留処理を実行
DoEvents
End If
 
Next
             
    Filename = Dir(Target)
             
'----------上書き値代入元先情報----------
    On Error GoTo Err_Msg
     
    Workbooks(Filename).Worksheets("シート名").Range("G3").Value = Range("F7").Value
    Workbooks(Filename).Worksheets("シート名").Range("G4").Value = Range("F8").Value
    Workbooks(Filename).Worksheets("シート名").Range("G8").Value = Range("F12").Value
    Workbooks(Filename).Worksheets("シート名").Range("H8").Value = Range("G12").Value
    Workbooks(Filename).Worksheets("シート名").Range("I8").Value = Range("H12").Value
    Workbooks(Filename).Worksheets("シート名").Range("G9").Value = Range("F13").Value
    Workbooks(Filename).Worksheets("シート名").Range("I9").Value = Range("H13").Value
 
 
'----------上書き保存して閉じる----------
    Application.EnableEvents = False
    Workbooks(Filename).Save
    Application.EnableEvents = True
     
    Workbooks(Filename).Close
             
        Next Target
    Else
        MsgBox "ファイル選択がキャンセルされました", vbOKOnly + vbInformation, "キャンセル"
        ActiveCell.Offset(-1, 0).Activate
        ActiveCell.Value = ""
         
         
         Exit Sub
 
         
    End If
     
     
         MsgBox "点検表項目代入処理完了しました。", vbOKOnly + vbInformation, "処理完了"
    Application.Cursor = xlDefault
     
 Exit Sub
  
'結果をセルに表示
'ActiveSheet.Cells(1, 1).Value = sum
'プログレスバーFormを閉じる
Unload UserForm1
'マウスカーソルをデフォルトに戻す
Application.Cursor = xlDefault
  
     
'----------Errer Message----------
Err_Msg:
'----------プログレスバーFormを閉じる----------
Unload UserForm1
'----------マウスカーソルをデフォルトに戻す----------
Application.Cursor = xlDefault
    Workbooks(Filename).Close
'----------Errer Massegeを表示----------
 
    MsgBox "転記先シートにエラーが発生しました。" & vbCrLf & "処理を中止します。", vbOKOnly + vbCritical, "転記先シート名称エラー"
     
Application.Cursor = xlDefault
 
 
End Sub

回答
投稿日時: 20/11/09 19:55:28
投稿者: simple

出先なので確認が出来ませんが、
Curdirがそのフォルダになっていて
Excelがそれを掴んだままにしていると評価されて
いるからでは?
Chdirで変更してみて下さい。

回答
投稿日時: 20/11/09 20:39:54
投稿者: simple

戻りました。
 
これで試してみて下さい。

Sub test()
    Dim OpenFileName As Variant
    Dim Target As Variant
    Dim wb As Workbook
    Dim myPath As String

    myPath = ThisWorkbook.Path
    OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                               MultiSelect:=True)
    If IsArray(OpenFileName) Then
        For Each Target In OpenFileName
            Set wb = Workbooks.Open(Target)
            wb.Close False
        Next
    Else
        ' 省略
    End If
    
    Debug.Print CurDir  ' 検証用
    
    ChDir myPath        '■これを追加すると回避可能
End Sub

GetOpenFilenameで開いたフォルダに、Curdirが移ることが観察できます。
そのままだと、件の警告が出ますから、
    ChDir myPath
で、自身のフォルダに戻してやれば、上記フォルダは自由に編集可能です。

投稿日時: 20/11/09 21:48:05
投稿者: けんでん

simple さんの引用:
戻りました。
 
これで試してみて下さい。
Sub test()
    Dim OpenFileName As Variant
    Dim Target As Variant
    Dim wb As Workbook
    Dim myPath As String

    myPath = ThisWorkbook.Path
    OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                               MultiSelect:=True)
    If IsArray(OpenFileName) Then
        For Each Target In OpenFileName
            Set wb = Workbooks.Open(Target)
            wb.Close False
        Next
    Else
        ' 省略
    End If
    
    Debug.Print CurDir  ' 検証用
    
    ChDir myPath        '■これを追加すると回避可能
End Sub

GetOpenFilenameで開いたフォルダに、Curdirが移ることが観察できます。
そのままだと、件の警告が出ますから、
    ChDir myPath
で、自身のフォルダに戻してやれば、上記フォルダは自由に編集可能です。

 
 
ご教授ありがとうございます。
当方の対応が悪いのエラーが解消できない状態です。

回答
投稿日時: 20/11/09 22:04:05
投稿者: simple

それは、私のコードを動かしてみて、ということですか?
それとも、あなたのコードに適用してみて、ということですか?

投稿日時: 20/11/09 22:21:38
投稿者: けんでん

simple さんの引用:
それは、私のコードを動かしてみて、ということですか?
それとも、あなたのコードに適用してみて、ということですか?

simple殿
数々のご教授いただきお力添えいただいており大変感謝いたします。
当方のVBA知識が少なすぎるためご教授いただいた内容を十分発揮できておりません。
もう少し勉強をし活用させていただければと感じておるところです。

回答
投稿日時: 20/11/10 09:13:49
投稿者: WinArrow
投稿者のウェブサイトに移動

質問者さんの意図は、
THisworkbookを
上書きせずに、別のフォルダに保存したい
ではないかと推測します。
 
で、あるならば、
素直に、名前を付けて保存すればよいのではないでしょうか?

回答
投稿日時: 20/11/10 10:33:22
投稿者: simple

要するに、他のフォルダにあるブックを、パス指定で直接開くのではなく、
Application.GetOpenFilenameを使って開いたために、カレントフォルダが
当該他のフォルダに移っており、その状態で、当該他のフォルダの名前を変更しようとしている
ところに問題があるのです。(Excelがそのフォルダを掴んでいると認識するため)
 
で、その対応策として、
 コードの中で、カレントフォルダを元に戻して、
 当該他のフォルダを開放してあげればよい、
と申し上げています。
 
具体的には、
コードを終える前に、

ChDir ThisWorkbook.Path
の一文を入れればよいのです。
もし、ドライブも跨っているなら、
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
の二つを実行します。
(ChDrive ThisWorkbook.Pathはおかしいように思うかも知れないが、
 ドライブレターを見るので、それでOKです。)
 
なお、他のフォルダが、ネットワーク上のものなら、Chdirでは対応できないので、
また別の手当が必要とだけ申し上げておきまししょう。
そうなら、その旨を告げてください。
 
# 私が提示したコードで実験してみれば、少なくとも、そのことが原因(のひとつ)であることが
# 理解してもらえるはずです。
# なお、提示いただいたコードは、お願いしていた「事象を再現できる」という要件を満たしません。
# UserFormに関するコードが無いようですし、未宣言の変数もあります。
あと考えられるのは、別のアプリケーションがそのフォルダを掴んでいる可能性です。

回答
投稿日時: 20/11/10 10:55:34
投稿者: simple

>ベースとなるbookを閉じると編集可能となります。
Excel自体を閉じれば、その状態は解消されるからでしょう。
ですから、他のアプリケーションが掴んでいる可能性はなかったです。
(前発言の最後の一文はなかったことにしてください。)
 
フォルダ名を変更するなどということは、特別なことなので、
Excelを閉じてから実行するのも、十分にあると思いますよ。

回答
投稿日時: 20/11/11 09:38:01
投稿者: simple

伝わっていると思っていたのですが、おかしいですね。
改めて纏めると議論は以下のとおりだと思っています。
 
【フォルダの構成図】
FolderA
    ---- Book1(ThisWorkbook)
FolderB
    ---- Book2
    ---- Book3
 
【問題の所在】
Book1にあるマクロから、
GetOpenFilenameを使って、FolderBにある複数のブックを指定し、
それらを順次、開いて、作業して、保存して、閉じた。
 
その後、FolderBの名前をFolderCに変更しようとしたら、
"MicrosoftExcelによってフォルダーは開かれているため、操作を完了できません。
フォルダを閉じてから再実行してください"(*)
と警告が出る。
保存してからきちんとファイルを閉じているのに、どういうことか、
というのが質問と理解した。
 
【原因と思われること】
GetOpenFilenameでファイルを指定する際に、
FolderBをカレントフォルダに設定することになる。
Excelがカレントフォルダとしているフォルダは、
それをある意味で拘束しており("掴んでいる"と表現した)、
このために、フォルダ名の変更ができないものと思われる。
 
【実証】
20/11/09 20:39:54に提示した簡単なコードで上記が確認ができる。
 
【対応策】
20/11/10 10:33:22に書いたとおり。
 
(*注)
これが正確なエラー表示だと想像する。
このように正確に書いてもらうと、よかったのではないですか?

回答
投稿日時: 20/11/11 19:23:32
投稿者: mattuwan44

引用:
フォルダAにあるExcelファイルAに記載された値を
フォルダBにあるExcelファイルBをBookOpen等の構文を利用し開き
ExcelファイルBの指定されたセルに値を代入し閉じるといった動作を行った後
フォルダBの名称を変更しようとすると使用中のフォルダというポップアップメッセージが出てしまう。
  
以上のケースの場合何か構文を追加することによって、使用状態を開放することが可能なのかご教授願いたいという趣旨でございます。

 
<やりたいこと>
0)プログラム始め
1)ファイルを選択する(複数)
2)選択したファイル分繰り返す
3)各ファイルを開く
4)マクロのあるブックの値を開いたブックに転記
5)上書き保存して閉じる
6)2へ戻る
7)上書きしたファイルがあるフォルダー名を変更 ※ここで「編集中のため変更できない的なメッセージ」
8)プログラム終わり

 
こういうことかな?違ったら訂正を。
まずは、やりたいことを順を追って整理して説明してください。
次にエラー番号とエラーメッセージは正確に書いてください。
そのうえで、
提示のコードで「フォルダー名を変更」はどの行ですか?
エラーが再現できるように本物のコードを提示してください。
 
============================================
返事を待つ時間が惜しいので、こちらの想像通りとして、
 
エラーの原因は、
編集中のファイルがあるので、フォルダーの名前が変更できない。
つまり、
 
Workbooks(Filename).Close
 
と命令しても、実際にエクセル君が閉じる作業が終わっているわけではない。
ということを理解しておくべきです。
エクセル君に「閉じて」と、命令しただけですよね?
その後はエクセル君任せです。
で、フォルダーの管理はWindows君ですね?
 
回避方法
1)完全に閉じるまで待つ
2)先にフォルダーを作り、名前を付けて保存する(元のフォルダーは後で削除?)
3)先にフォルダーをコピーしておきそちらのブックを編集(元のフォルダーは後で削除?)
 
コードだけを追い求めるのではなく、
1)原因を把握する
2)論理的に回避方法を考える
3)回避方法をVBA語で表現する
 
というような感じだと思いましたが、どう思います?
 
あと、
 
>数々のご教授いただきお力添えいただいており大変感謝いたします。
>当方のVBA知識が少なすぎるためご教授いただいた内容を十分発揮できておりません。
>もう少し勉強をし活用させていただければと感じておるところです。

 
まどろっこしくて要点がわかりません。(質問全体がそうですが)
 
何をやって(どんなコードを実行して)どうなったかを説明してください。
または、
提示いただいたコードは読んで理解できないので実行してみるところまで行ってないとか。
実際の環境に適応できてないとか。
聞かれたことに答えましょうよ。

回答
投稿日時: 20/11/11 21:35:05
投稿者: WinArrow
投稿者のウェブサイトに移動

私は、何か勘違いしていたようです。
 
以下は、参考コードです。
 
Sub test()
Dim cnt As Long
Const フォルダ1 As String = "D:\TEST"
Const フォルダ2 As String = "D:\TEST2"
Dim filename, F
 
    For cnt = 1 To 2
        If cnt = 1 Then
            ChDrive フォルダ1
            ChDir フォルダ1
        Else
            ChDrive フォルダ2
            ChDir フォルダ2
        End If
     
        filename = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                                MultiSelect:=True)
        For Each F In filename
            With Workbooks.Open(F)
                .Close False
            End With
        Next
    Next
     
End Sub
 

回答
投稿日時: 20/11/11 22:13:42
投稿者: simple

mattuwan44さん
投稿頂くのは有り難いのですが、
この質問については、私は何度か投稿し、
実験で確かめながら、かなり確度の高い原因を推定しています。
 
また、
投稿日時: 20/11/11 09:38:01で
全体を纏めて、質問者さんに問題の概要とその対応策を改めて説明しています。
 
質問者さんに問題をもう一度説明せよ、とおっしゃるのも分かりますが、
ある程度、他の回答者の回答などにも配慮いただけませんか?
 
回答がまったく付いていない訳じゃないんですよ。
まったくの最初に戻すような発言はいかがかと思います。
 
問題は、.Closeが実行されていないことではなく、
閉じられてはいるんです。
ただ、Excelがフォルダを掴んでいるんですよ。
 
質問者さんも
当方が困っている件としては下記のようなケースとなります。
フォルダAにあるExcelファイルAに記載された値を
フォルダBにあるExcelファイルBをBookOpen等の構文を利用し開き
ExcelファイルBの指定されたセルに値を代入し閉じるといった動作を行った後
フォルダBの名称を変更しようとすると使用中のフォルダというポップアップメッセージが出てしまう。

と書かれています。
 
再掲ですが、以下を実行してみてください。

Sub test()
    Dim OpenFileName As Variant
    Dim Target As Variant
    Dim wb As Workbook
    Dim myPath As String

    myPath = ThisWorkbook.Path
    OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                               MultiSelect:=True)
    If IsArray(OpenFileName) Then
        For Each Target In OpenFileName
            Set wb = Workbooks.Open(Target)
            wb.Close False
        Next
    Else
        ' 省略
    End If
    
    Debug.Print CurDir  ' 検証用
    
    ChDir myPath        '■これを追加すると回避可能
End Sub

最後の ChDir myPath '■これを追加すると回避可能
をコメントアウトしたままだと、
Application.GetOpenFilenameで指定したファイルは、ファイルは閉じられていても、
その属するフォルダがCurDirになっているので、
フォルダ名を手で修正しようとしてもエラーになるんですよ。
 
しかし、
最後に ChDir myPath '■これを追加すると回避可能
を実行するとエラーにならないんですよ。
 
質問者さんの記載、コードを拝見する限り、これが原因であり、
対応策なのはかなり確実な筈です。

回答
投稿日時: 20/11/12 08:24:28
投稿者: Suzu

コードにて、フォルダ名を変更しているのではなく、
コード終了後に、「手動」にてフォルダ名を変更しようとすると
 
という事ですね。

回答
投稿日時: 20/11/12 10:26:46
投稿者: simple

提示されたコードから、そのように読み取りました。
フォルダ名を変更するコードは一切出てきていませんので。
そのように日本語で説明いただくと、さらに明確ですね。
 
これはWindowsのバージョンに依らない仕様のようです。Windows7,Windows10で確認しています。
 
ポイントはGetOpenFilenameでファイルを指定すると、
そのフォルダにカレントフォルダが変わってしまうことですね。
 
ちなみに、手動ではなく、
FSOのMoveFolderなどを使ってフォルダ名を変更しようとしても、
実行時エラー'70' : 書き込みできません。
とエラーになります。
移動する前のものにCurDirを戻すと、エラー無く実行できます。
事象は手動、自動によらないようですね。

回答
投稿日時: 20/11/12 22:47:10
投稿者: WinArrow
投稿者のウェブサイトに移動

simple さんの引用:
提示されたコードから、そのように読み取りました。
フォルダ名を変更するコードは一切出てきていませんので。
そのように日本語で説明いただくと、さらに明確ですね。
 
これはWindowsのバージョンに依らない仕様のようです。Windows7,Windows10で確認しています。
 
ポイントはGetOpenFilenameでファイルを指定すると、
そのフォルダにカレントフォルダが変わってしまうことですね。
 
ちなみに、手動ではなく、
FSOのMoveFolderなどを使ってフォルダ名を変更しようとしても、
実行時エラー'70' : 書き込みできません。
とエラーになります。
移動する前のものにCurDirを戻すと、エラー無く実行できます。
事象は手動、自動によらないようですね。

 
なるほど
いままで気にしたことはありませんでした。
 
>移動する前のものにCurDirを戻すと、エラー無く実行できます。
このところに落とし穴があるようです。
 
試したコードと結果です。
 
Sub test()
Dim FN, Path As String

    Debug.Print CurDir & "---@:Excel移動時"
    Path = ThisWorkbook.Path
    Debug.Print Path & "---A:Thisworkbook.Path"
    FN = Application.GetOpenFilename
    Debug.Print CurDir & "---B:GetOpenFilenameメソッド取得時"
    ChDir Path
    Debug.Print CurDir; "---C:Thisworkbook.Pathに戻す"
    ChDrive Application.DefaultFilePath
    ChDir Application.DefaultFilePath
    Debug.Print CurDir & "---D:Application.DefaultFilePathに戻す"
End Sub

 
結果
C:\Users\○○○\OneDrive\ドキュメント---@:Excel移動時
C:\Users\○○○\OneDrive\Desktop---A:Thisworkbook.Path
D:\TEST---B:GetOpenFilenameメソッド取得時
D:\TEST---C:Thisworkbook.Pathに戻す
C:\Users\○○○\OneDrive\ドキュメント---D:Application.DefaultFilePathに戻す
 
Cの前の
> ChDir Path
が、自ブックのパスに戻すとこrですが、
結果、Cでは、自ブックのパスには戻手いません。
 
Dのように
ChDrive
を入れた方が得策です。
Dは、@と同じ
つまり、Excel起動時のパスに戻すことをお勧めします。
 
 
 
 

回答
投稿日時: 20/11/12 23:39:10
投稿者: simple

コメントありがとうございました。
 
読んで頂いたところは、標語的に書いています。
対応策の本文とも言うべき、
20/11/10 10:33:22 では、その点にも触れています。

引用:
具体的には、
コードを終える前に、
ChDir ThisWorkbook.Path
の一文を入れればよいのです。
もし、ドライブも跨っているなら、
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
の二つを実行します。
(ChDrive ThisWorkbook.Pathはおかしいように思うかも知れないが、
 ドライブレターを見るので、それでOKです。)

なお、
引用:
なお、他のフォルダが、ネットワーク上のものなら、Chdirでは対応できないので、
また別の手当が必要とだけ申し上げておきまししょう。
と書きましたが、これは勘違いで、ネットワークドライブから戻る時は、
普通にChDrive,Chdirが使えるんですかね。
 
ネットワークドライブが障害になるようでしたら、
「ネットワークドライブにChDriveする」
http://officetanaka.net/other/extra/tips15.htm
を紹介するつもりでしたが、たぶん不要でしょう。

トピックに返信