• ベストアンサー

文字列のなかの最後の文字

宣言した変数にファイルのパスが格納されています。 例: FileName = "C:\My Documents\test\test.txt" この文字列から "test.txt"のみを取り出したいのですが、どうしたら良いのでしょうか? 文字列の一番最後の"\"の位置番号を取得して、次の文字からMIDを使えばいいのかなと思ったのですが、"\"の位置を取得する方法すらわかりません。 もし上記の方法で無理なら代替方法でも構いません。 ちなみにこのパスは毎回違うパスが入ってきます。 よろしくお願いします。

noname#14562
noname#14562

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

一通り、考えられるパターンが出揃っているみたいなので、皆さんの発言ついて補足です。 #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)
回答No.9

>たとえば、ファイルの保存ダイアログを表示するとします。    :    : >汎用性の高い関数を作成するには、この場合は不向きに思います。 汎用性の高い関数というのは、あまり作ったことがなかったので、 思いもよりませんでした。 いろいろ教えていただきありがとうございます。 184434のご回答、拝見しました。 IE4以降だったら、私の場合は大丈夫です。 まあ、この件も汎用性の高い関数云々を言えば、使えないことになりますね。

noname#14562
質問者

お礼

皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.8

>TAGOSAKU7さんのお名前は、何度となくお見受けしたように思います。 ありがとうございます。 _(。ω。)_ >>すでに存在しているファイルでしか使用できないのでは? >まあその前にDir関数でファイルの有無を調べておけばいいわけです。 すでに存在しているファイル"c:\1.txt"を扱うのであれば、たしかにそうですね。 ただ、それではやはり使用状況が限定されてしまいます。 たとえば、ファイルの保存ダイアログを表示するとします。 上書きではなく新規保存であれば、ダイアログから得るファイルフルパスに、まだファイルは存在していません。 その得たファイルフルパスをファイル名とパスに分割するには、FSOが使えなくなってしまうのです。 (ダミーでファイルを作成すると言う手もありますが・・・二度手間になりますよね・・・) 汎用性の高い関数を作成するには、この場合は不向きに思います。 (前にも述べたように、限定であればOKだと思います。) 何となく、僕の発言はFSOを毛嫌いしているようにとらわれると困るのですが、実際にFSOを使用したりもします。 一般ユーザ向けパッケージではなく、納品先がきちんと決まっている商用の開発で、ファイルのコピーなどには、使ったりもします。 ですので、FSOの全てを否定しているのではないので、ご勘弁ください。 >私が質問するのもなんですが、IEのどのバージョンが使えないのでしょうか? このことには以前にお答えしております。そちらをご覧ください。 (結局は忘れたという締めで、申し訳ないですが・・・)

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=184434
noname#14562
質問者

お礼

皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。

  • prome
  • ベストアンサー率32% (64/196)
回答No.7

TAGOSAKU7さんのお名前は、何度となくお見受けしたように思います。 >すでに存在しているファイルでしか使用できないのでは? まあその前にDir関数でファイルの有無を調べておけばいいわけです。 (改行位置を変えました_ _) >いつも述べていますが、インストールされているIEのバージョンによって、 >FSOは使えません。) 私が質問するのもなんですが、IEのどのバージョンが使えないのでしょうか? >FSOを使用すべきではないパターンとしては この部分は知りませんでした。ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

考えたそのままのロジックでやって見ました。 他の例でも小生は良く使います。 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

noname#14562
質問者

お礼

皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

文字列分割コマンド「SPLIT」はいかがですか? Dim strDataArrey() As String Dim intDataCount As Integer strDataArrey()=Split(FineName,"\") intDataCount=UBound(strDataArrey()) これでstrDataArrey(intDataCount)に"test.txt"に入ります。

noname#14562
質問者

お礼

皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。

  • prome
  • ベストアンサー率32% (64/196)
回答No.3

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)
回答No.2

お疲れ様です。 ファイル名の後ろから"\"を探せばいいのではないでしょうか。 その時に「InStrRev」を使うと後ろから文字を探してくれます。 (例   Dim パス As String   Dim ファイル名 As String   Dim 位置 As Long   パス = "C:\My Documents\test\test.txt"   位置 = InStrRev(パス, "\") '// 後ろから文字を検索   ファイル名 = Right$(パス, Len(パス) - 位置) '// ファイル名が入る (結果   ファイル名 = "test.txt" 間違っていたらごめんなさい。

noname#14562
質問者

お礼

皆さんありがとうございました。 プログラム一つ作るにも色々と頭を使うものなのですね。 これからもっと精進したいと思います。

noname#14562
質問者

補足

すみません、VisualBasicのカテゴリに投稿してしまいましたが、実はExcel97のVBAを使っています。 そのためかどうかはわからないのですが、InStrRevを使うと「SubまたはFunctionが定義されていません」とエラー表示されてしまいます・・・。

  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

文字列の後ろから一文字ずつ取得して「\」の場所を検索してみては? dim i as integer for i = 1 to len(FileName) if Mid(FileName,len(FileName) - i,1) = "\" then exit end if Next でiの値が最後の\の位置ですね。 (テスト未なのでコードそのままではエラーかもしれません。ご了承を)

noname#14562
質問者

お礼

ありがとうございます。 うまく動きました。 Mizyuさんの仰るとおり、ループで回す方法が良いのかもしれませんね。 InStrのような関数は存在ものなのでしょうか・・・。

関連するQ&A

  • 変数内の文字列にある最後の「"」位置を調べたい。

    変数myStrに格納されている文字列に幾つか含まれる文字「"」のうち、最後の「"」が文字列の何文字目に有るか出したいです。 InStr(1,myStr,""") 普通にInstrを使うと最初の文字位置を返してきます。 また「"」は"""になってしまいます。

  • 文字列取得

    '/path1/path2/file1.txt' '/path1/path2/path3/file2.txt' 上記のようなpathがあった場合にファイル名(拡張子なし)の 文字列を取得したいのですがどのように良いでしょうか? 宜しくお願い致します。 awkで$4と指定すれば「file1.txt」の文字列を取得できるのですが パスの長さが定まっていないため$4ではなく最後の文字と指定する 記号はないでしょうか? echo /path1/path2/file1.txt |awk '{FS="/"; print $4}'

  • 秀丸マクロで、一部文字列を変換後クリップボードコピーしたい

    秀丸マクロで、一部文字列を変換後クリップボードコピーしたい 秀丸マクロで、setclipboard filename;とすると、 現在開いているファイルのフルパスを取得してクリップボードにコピーすることができますが、 この際に\を/に変換して、クリップボードコピーしたいと思いますがうまくいきません。 どうすればよいのでしょうか。。 例) filenameで取得した c:\documents and settings\user\my documents\sample.txt というパスを c:/documents and settings/user/my documents/sample.txt のようにしてから、クリップボードコピーしたい。 意味不明でしたら加筆修正しますのでよろしくお願いします。

  • 特定の文字列が一致する行から、文字列を抽出する方法

    ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか? 処理: test.txt中に以下の文字列が記載されています。 ----- TEST011:FILE00 TEST01:FILE01 TEST02:FILE02 XTEST01:FILE01 XTEST02:FILE02 ----- test.txtから、TEST01に対応する文字列FILE01を取得したいです。 当初、strchrを利用すれば良いかと考えていたのですが、 TEST011の行が先に抽出されてしまい、うまくいきません。 どなたか解決方法を教えていただけないでしょうか。

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • String変数の文字列の検索方法

    お世話になっております。 String test = AnsiString(dlgOpen->FileName).c_str(); test = ExtractFileName(test); この方法でtestに文字列”test.bin”を取得できました。このときに変数testが”test.bin”かどうかをif文などで判定したいのですが、例えばtestの中で”test.bin”という文字列を検索して合致していたらTRUEを返すような方法を教えて頂けないでしょうか。 どうぞ、よろしくお願い致します。

  • 文字列を特定文字で分割したい

    はじめまして。宜しくお願いします。 現在Access2002のVBAをつかってタイトルのようなことを実現したいと思っています。 Dim a As String Dim b As String という二つの変数を用意して 「C:\Documents and Settings\デスクトップ\test.csv」という文字列が与えられているとき 変数aには「test.csv」を、変数bには「C:\Documents and Settings\デスクトップ\」を 格納しようとしています。 スマートなやり方がわからず、 文字列の右から一文字ずつ比較して行き、何文字目に「¥」が出てくるかをカウントして、right関数とleft関数で分割を行っています。 このような処理を行う場合、なにか適した関数があると思い探しているのですが、 なかなか見つからず、行き詰っています。(そのような関数があるのかも分からず・・) もしもなにかお気づきの方が居られましたら、ご教授宜しくお願いします。

  • 文字列中からファイルパスのみを取得する方法

    テキストファイルからデータを1行ずつ読み取り、 その中にファイルパスがあれば他のファイルに書き出すというロジックを考えています。 文字列は 例えば  include ROOT_PATH."/class/test.txt"; という文字列で、この中から  /class/test.txt という文字列だけを取得したいのです。 現在、拡張子から1文字ずつ前の文字列をチェックしていって、「”」が見つかったらその間の文字列を ファイルパスとしようとしています。 これを1発で行ってくれるような関数等ははないでしょうか?   良いお知恵がありましたらご教授お願いします。

  • 文字列の並び替え

    お世話になっております。 以下、ご指導いただければ幸いです。 カンマで区切られた以下のような文字列があります。 $txt = "佐藤,武田,斉藤,鈴木,内田"; この変数txt内にある文字列を、「武田」と「斉藤」を入れ替えたい(並び替え)と思うのですが、どのようにすれば宜しいでしょうか? (隣り合わせのデータのみの並び替えです) ※並び返したい命令?は、順番の番号にて取得出来る状態です。 (この例の場合で言ったら、「1と2」という感じです) 現在、 $txt_array = explode(",", $txt); などとして、一旦配列にして、for文で繰り返し処理を行いながら、武田と斉藤をそれぞれ別の変数に格納し・・・などと考えていますが、とても非効率のような気がするものの、他の策が見えて来ずに困っています。 以上、お恥ずかしい質問かと思いますが、アドバイスなど頂戴出来れば幸いです。 お忙しいなか恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • ファイルのフルパス splite?InstrRev?

    お世話になります。 エクセル2003のVBAについての質問なのですが、 ファイルパスを分割して、変数に格納したいと考えております。 具体的には、現在のワークブックのパスである C:\○○○\○○○\ABC\test1\test2.xls というフルパスを「C:\○○○\○○○\ABC\」と「\test1\test2.xls」 に分割して、「\test1\test2.xls」だけを変数に格納して他の箇所に 利用したいのです。 下記を試してみたのですが、これでは、「test2.xls」のみしか取得することができません…。 Sub Sample1() Dim PathName As String, FileName As String, pos As Long pos = InStrRev(ThisWorkbook.Path, "\") FileName = Mid(ThisWorkbook.Path, pos + 1) End Sub 一つ上のフォルダ名を含む「\test1\test2.xls」を取得するにはどうすればいいでしょうか。