- ベストアンサー
文字列のなかの最後の文字
宣言した変数にファイルのパスが格納されています。 例: FileName = "C:\My Documents\test\test.txt" この文字列から "test.txt"のみを取り出したいのですが、どうしたら良いのでしょうか? 文字列の一番最後の"\"の位置番号を取得して、次の文字からMIDを使えばいいのかなと思ったのですが、"\"の位置を取得する方法すらわかりません。 もし上記の方法で無理なら代替方法でも構いません。 ちなみにこのパスは毎回違うパスが入ってきます。 よろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
一通り、考えられるパターンが出揃っているみたいなので、皆さんの発言ついて補足です。 #1.Mizyuさんの方法が、昔ながらの処理のです。ぼくもこの方法がよいと思います。 #2.josyo_mさんの方法と#4.bin-chanさんの方法は、VB6もしくはOffice2000以降の製品の関数だと思いますので、使用については環境によります。(質問に環境を書くようにしましょうね。) #3.promeさんの方法は、すでに存在しているファイルでしか使用できないのでは? もし確実にファイルが存在しているのであれば、FileSystemObject(FSO)を使用してもかまわないと思います。 (いつも述べていますが、インストールされているIEのバージョンによって、FSOは使えません。) そのような限定条件のもとであれば、この場合はFSOを使用してもいいと思います。 (さらに追記で、FSOを使用すべきではないパターンとしては、ルートディレクトリをFSOで参照することです。ルートに存在するフォルダ以下のサブフォルダの数などの情報を得たりする場合があり、負荷がかかる恐れがあります。PGの設計次第ですが・・・)
その他の回答 (8)
- prome
- ベストアンサー率32% (64/196)
>たとえば、ファイルの保存ダイアログを表示するとします。 : : >汎用性の高い関数を作成するには、この場合は不向きに思います。 汎用性の高い関数というのは、あまり作ったことがなかったので、 思いもよりませんでした。 いろいろ教えていただきありがとうございます。 184434のご回答、拝見しました。 IE4以降だったら、私の場合は大丈夫です。 まあ、この件も汎用性の高い関数云々を言えば、使えないことになりますね。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
>TAGOSAKU7さんのお名前は、何度となくお見受けしたように思います。 ありがとうございます。 _(。ω。)_ >>すでに存在しているファイルでしか使用できないのでは? >まあその前にDir関数でファイルの有無を調べておけばいいわけです。 すでに存在しているファイル"c:\1.txt"を扱うのであれば、たしかにそうですね。 ただ、それではやはり使用状況が限定されてしまいます。 たとえば、ファイルの保存ダイアログを表示するとします。 上書きではなく新規保存であれば、ダイアログから得るファイルフルパスに、まだファイルは存在していません。 その得たファイルフルパスをファイル名とパスに分割するには、FSOが使えなくなってしまうのです。 (ダミーでファイルを作成すると言う手もありますが・・・二度手間になりますよね・・・) 汎用性の高い関数を作成するには、この場合は不向きに思います。 (前にも述べたように、限定であればOKだと思います。) 何となく、僕の発言はFSOを毛嫌いしているようにとらわれると困るのですが、実際にFSOを使用したりもします。 一般ユーザ向けパッケージではなく、納品先がきちんと決まっている商用の開発で、ファイルのコピーなどには、使ったりもします。 ですので、FSOの全てを否定しているのではないので、ご勘弁ください。 >私が質問するのもなんですが、IEのどのバージョンが使えないのでしょうか? このことには以前にお答えしております。そちらをご覧ください。 (結局は忘れたという締めで、申し訳ないですが・・・)
お礼
皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。
- prome
- ベストアンサー率32% (64/196)
TAGOSAKU7さんのお名前は、何度となくお見受けしたように思います。 >すでに存在しているファイルでしか使用できないのでは? まあその前にDir関数でファイルの有無を調べておけばいいわけです。 (改行位置を変えました_ _) >いつも述べていますが、インストールされているIEのバージョンによって、 >FSOは使えません。) 私が質問するのもなんですが、IEのどのバージョンが使えないのでしょうか? >FSOを使用すべきではないパターンとしては この部分は知りませんでした。ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
考えたそのままのロジックでやって見ました。 他の例でも小生は良く使います。 InstrRevはVBAでは、使えないようですね。 Sub aaa001() pm = 1 s = "c:\aaaa\bbbbb\cccc\dddd.txt" For i = 1 To 7 p = InStr(pm, s, "\") '------ If p = 0 Then l = Len(s) - pm + 1 x = Mid(s, pm, l) Exit For End If '------ MsgBox p pm = p + 1 Next i MsgBox x End Sub
お礼
皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。
- bin-chan
- ベストアンサー率33% (1403/4213)
文字列分割コマンド「SPLIT」はいかがですか? Dim strDataArrey() As String Dim intDataCount As Integer strDataArrey()=Split(FineName,"\") intDataCount=UBound(strDataArrey()) これでstrDataArrey(intDataCount)に"test.txt"に入ります。
お礼
皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。
- prome
- ベストアンサー率32% (64/196)
file system objectを使うともっと簡単です。 以下のように使います。 Dim Fname As String Set fs = CreateObject("Scripting.FileSystemObject") Fname = fs.GetFileName(Filename) Set fs = Nothing するとFnameにtest.txtが入ります。
- josyo_m
- ベストアンサー率63% (28/44)
お疲れ様です。 ファイル名の後ろから"\"を探せばいいのではないでしょうか。 その時に「InStrRev」を使うと後ろから文字を探してくれます。 (例 Dim パス As String Dim ファイル名 As String Dim 位置 As Long パス = "C:\My Documents\test\test.txt" 位置 = InStrRev(パス, "\") '// 後ろから文字を検索 ファイル名 = Right$(パス, Len(パス) - 位置) '// ファイル名が入る (結果 ファイル名 = "test.txt" 間違っていたらごめんなさい。
お礼
皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。
補足
すみません、VisualBasicのカテゴリに投稿してしまいましたが、実はExcel97のVBAを使っています。 そのためかどうかはわからないのですが、InStrRevを使うと「SubまたはFunctionが定義されていません」とエラー表示されてしまいます・・・。
- Mizyu
- ベストアンサー率41% (245/593)
文字列の後ろから一文字ずつ取得して「\」の場所を検索してみては? dim i as integer for i = 1 to len(FileName) if Mid(FileName,len(FileName) - i,1) = "\" then exit end if Next でiの値が最後の\の位置ですね。 (テスト未なのでコードそのままではエラーかもしれません。ご了承を)
お礼
ありがとうございます。 うまく動きました。 Mizyuさんの仰るとおり、ループで回す方法が良いのかもしれませんね。 InStrのような関数は存在ものなのでしょうか・・・。
お礼
皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。