作成日 2004/10/19
最終更新日 2005/10/20

ファイルパスのフォルダの区切り記号が違う。

 エクセルVBAでファイル関連の操作をする場合、 フォルダの区切り記号は、Windowsでは"\"だけど、Macでは":"だ。(※1)
これが原因で、ファイルの読み書きが出来なくなることがある。

※1:Macでのフォルダの区切り文字を"/"だと思ってたんですけど、だるまの間違いでした。
 って待てよ。
 だるまはMac OS X バージョン10.3.9を使っているんだけど、Finderの[移動]メニューの[フォルダへ移動...]で表示されるダイアログ
のテキストボックスに"/usr"と入力して[移動]ボタンを押すとちゃんと、usrフォルダが開くのに、":usr"だとフォルダが開かない。
 ということは、Macでのフォルダの区切り文字は"/"なのかというと、どうも違う。
適当なファイルを選択してFinderの[ファイル]-[情報を見る]をやってみてほしい。表示されるダイアログの[一般情報]の[場所]を見ると
フォルダの区切り文字は":"としてファイルの場所を表示している。
 結局よくわからなかったけど、MacではエクセルVBAからファイルを開いたりする時のフォルダの区切り文字は":"。


1.区切り文字の詳細
2.結局どうすればいいの?
3.参考文献

1.区切り文字の詳細

 Mac版エクセルVBAの場合のフォルダの区切り文字は":"です。
 以下の方法で確認してみました。
  1. イミディエイトウインドウにPrint(Application.GetOpenFileName)と入力する。
  2. [return]キーを押して[開く]ダイアログが出たら、適当なファイルを選択して[開く]ボタンを押下。
  3. イミディエイトウインドウに結果が表示される。
 結果です。
Mac版エクセルVBAでのフォルダの区切り文字は":"
Mac版エクセルVBAではフォルダの区切り文字は":"(コロン)みたい。


 とらおさんより掲示板に以下の書き込みをいただきました。
お久しぶりです。
Application.PathSeparator
を使うと、Win/Mac共通コードを書くとき、
便利ですよ。

ということで、Application.PathSeparatorをヘルプで調べました。
で、ヘルプには

パス セパレータ (Windows では "\"、Macintosh では ":") を返します。


と書いてありました。オブジェクトブラウザで"Path"で検索すれば出てくる、、、。なんでやらなかったんだろう。調べが足りなかった。
とらおさんへ:本当にありがとうございます。

このページのトップへ

2.結局どうすればいいの?

 例えば、ファイル構成が下記のようになっている場合で
ファイル構成
フォルダやファイルの説明
とあるフォルダ
├Book1.xls
└dir1
 └aaa.ini

マクロが入ったエクセルブック

開きたいファイル
 
Book1.xlsからaaa.iniを開くだけの、適当に作ったサンプルを2つ載っけておきます。

Module1(標準モジュール)ー Application.PathSeparatorプロパティを使う 方法
Option Explicit

Private Const m_dir1Name As String = "dir1"
Private Const m_ini1Name As String = "aaa.ini"

'aaa.iniの絶対パスを返す
Private Function iniFilePath() As String
    Dim sp As String 'フォルダの区切り文字
   
    sp = Application.PathSeparator
    iniFilePath = ThisWorkbook.Path & sp & "dir1" & sp & "aaa.ini"
   
End Function

'ファイルを開くだけのサンプル
Sub openFile()
    '宣言
    Dim lngFileNo As Long 'ファイル番号(1から511の数 字)
    Dim strFileFullName As String 'ファイルのフルパス
   
    'いろいろ初期化
    lngFileNo = 0
   
    'ファイルを開く
    On Error GoTo ErrorHandler
    strFileFullName = iniFilePath
    lngFileNo = FreeFile
    Open strFileFullName For Input As #lngFileNo
   
    GoSub CloseFile
   
    Debug.Print strFileFullName & "を開く事に成功しました"
   
    Exit Sub
   
'すべてのファイルを閉じる(GoSub文で呼び出して下さい)
CloseFile:
    Close
    lngFileNo = 0
Return
   
'エラー処理
ErrorHandler:
    GoSub CloseFile
    Debug.Print strFileFullName & "を開く事が出来ませんでした。" & vbNewLine _
                & "エラー番号:" & Err.Number & vbNewLine _
                & "エラー詳細:" & Err.Description
End Sub



Module2(標準モジュール)ー 条件付きコンパイルを使う方法
Option Explicit

#If Mac Then
    Private Const m_strIniFile As String = ":dir1:aaa.ini"
#Else
    Private Const m_strIniFile As String = "\dir1\aaa.ini"
#End If

'ファイルを開くだけのサンプル
Sub openFile()
    '宣言
    Dim lngFileNo As Long 'ファイル番号(1から511の数 字)
    Dim strFileFullName As String 'ファイルのフルパス
   
    'いろいろ初期化
    lngFileNo = 0
   
    'ファイルを開く
    On Error GoTo ErrorHandler
    strFileFullName = ThisWorkbook.Path & m_strIniFile
    lngFileNo = FreeFile
    Open strFileFullName For Input As #lngFileNo
   
    GoSub CloseFile
   
    Debug.Print strFileFullName & "を開く事に成功しました"
   
    Exit Sub
   
'すべてのファイルを閉じる(GoSub文で呼び出して下さい)
CloseFile:
    Close
    lngFileNo = 0
Return
   
'エラー処理
ErrorHandler:
    GoSub CloseFile
    Debug.Print strFileFullName & "を開く事が出来ませんでした。" & vbNewLine _
                & "エラー番号:" & Err.Number & vbNewLine _
                & "エラー詳細:" & Err.Description
End Sub


このページのトップへ

3.参考文献

エクセルVBAの以下のヘルプにフォルダの区切り文字のことが書いてある。
 Application.PathSeparatorプロパティ
 ChDirステートメント

Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。