• ベストアンサー

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

はじめまして。宜しくお願いします。 現在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関数で分割を行っています。 このような処理を行う場合、なにか適した関数があると思い探しているのですが、 なかなか見つからず、行き詰っています。(そのような関数があるのかも分からず・・) もしもなにかお気づきの方が居られましたら、ご教授宜しくお願いします。

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 フルパスを、ファイル名のみとパスのみに分けるということですね。 現状はInStrRev関数を使用しているということでしょうか。 Win32APIにはPath系関数群というのがあり、いろいろなパスの操作を行えます。 ファイル名のみを取り出すのは、 PathFindFileName関数または、PathStripPath関数で、 パスのみを取り出すのは、 PathRemoveFileSpec関数です。 各関数名で検索してみて下さい。 とりあえず、サンプルが載っているHPを1つ紹介しておきます。 http://plaza5.mbn.or.jp/~heropa/vb122.htm#PathFindFileName http://plaza5.mbn.or.jp/~heropa/vb122.htm#PathStripPath http://plaza5.mbn.or.jp/~heropa/vb122.htm#PathRemoveFileSpec 上記3つのおおもとのHP http://plaza5.mbn.or.jp/~heropa/index.html ついでにもう1つ http://homepage1.nifty.com/nishikawa/laboratory/Tips/Win/pathFunctions.html

参考URL:
http://plaza5.mbn.or.jp/~heropa/index.html,http://homepage1.nifty.com/nishikawa/laboratory/Tips/Win/pathFunctions.html
takatoo
質問者

お礼

こんにちは。早速のレスありがとうございます。 みなさんのレスの速さと丁寧さに感動しています。 ちょうど私も、InStrRev関数を発見して「使えるのでは」と思っていたところです。 API関数については知識がなかったので、大変勉強になりました。 本当にありがとうございます!

その他の回答 (2)

  • norakuma
  • ベストアンサー率29% (293/977)
回答No.2

Split関数とJoin関数を使ってみてはどうでしょう。 Split関数は、指定した文字で文字列を分割します。 この例では、\を分割のキーにして、 オリジナルの文字列を複数の文字列の集合にします。 集合の最後の文字列を変数aに代入して、それ以外のものを、Join関数を利用してくっつけます。 Join関数でできた文字列の最後尾に、#をくっつけて 文字列bに代入すればできあがり。 スマートか?といわれると疑問ですが、わかりやすい処理です。 また、例に出された内容であれば、 FileSystemObjectを利用して、フォルダ内のファイル一覧を出すことも可能ですよ~。 では。

takatoo
質問者

お礼

こんにちは。早速のレスありがとうございます。 回答をいただいたのですがmaruru01さんの方法がうまくいきそうなので それを使ってみたいと思います。 しかしFileSystemObjectのこともあわせ、貴重なアイデアをいただき ありがとうございます!

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

私もそうやっています。それが一般的なやり方なのではないでしょうか。

takatoo
質問者

お礼

こんにちは。早速のレスありがとうございます。 他の方からも回答をいただいたので、そちらで試してみようと思います。 レスしていただきありがとうございました!

関連するQ&A

  • 結合した文字列をファイル名に使えない

    Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

  • ExcelVBA テキストファイルの文字列置換え

    VBA初心者のものです。 複数のフォルダの中にある同名テキストファイル(INIファイル)の中の特定の文字列 を置換えるマクロを作成していますが、うまくいかずエラーになります。 フォルダは毎回名前が変わるのでこれを変数にしてパスの中に入れて、その下の 階層のINIファイルを文字列置換えするというものです。 文字列置換えはReplace関数を使って、テキストファイルの読み込みと別ファイルとして書き出して、元ファイルを削除、新ファイルの名前を元ファイルの名前に変更するというもので、 置換える文字列はエクセルシートのB2・B3セルを読み取ってます。 テキストを開く際にパスを変数でなくフォルダ名を指定して作ると文字列置換えは出来るので、パスへの変数の組み込み方か条件設定がおかしいのかなと思うんですが、エラーはパスが不明といった内容のものが出ます。 エクセルファイルはデスクトップにあるNew Projectフォルダの中に置いて、同階層にresultフォルダがありその中に複数のフォルダ(このフォルダ名を変数にしようとしています)、それぞれの中の2つ下層に同名テキスト(INI)ファイルがあります。 もしくは違う良い方法があるのか、浅学で稚拙なコードですがどうかご教示をお願いします。 Sub MyMacro1() Dim a As String Dim z As String Dim MyF As String Dim DirName As String Dim MyIniNo As Integer Dim YourIniNo As Integer MyIniNo = FreeFile YourIniNo = FreeFile DirName = "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" MyF = Dir(DirName, 16) If MyF <> "" Then Do Until MyF = "" Open "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" For Input As MyIniNo Open "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP2.INI" For Input As YourIniNo b = Range("B2") c = Range("B3") While Not EOF(1) Line Input #MyIniNo, a z = Replace(a, b, c) Print #YourIniNo, z Wend Close MyIniNo Close YourIniNo Kill "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" Name "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP2.INI" As "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" Loop End If End Sub

  • 特定文字列の抽出

    VB6の質問です。 桁数、データが不定の文字列中から特定文字を抽出したいのでが、方法を教えていただけないでしょうか? 抽出したいデータの桁数が毎回不定でMid, Left, Right関数が使用できません。 Dim Buffer As String Buffer = "A12345...B678910.TRAGET..C" '桁数、データが不定の文字列がBufferに入ります。 例えば、変数Bufferから、桁数を考慮しないで"TARGET"の文字列を抽出したのです。 InStr関数で、位置を特定して、Mid関数などで抽出するれば、良いと思うのですが これをどんな桁数のときも対応できるようにルーチン化にできないでしょうか?

  • VBA での文字列編集

    すみません、VBA初心者であまり調べる時間がないので質問させて頂きます。 Dim strFileName As String Dim strChk1 As String Dim strChk2 As String strFileName には "20070703_TEST001_DATA.csv" の文字列のデータが 格納されているとします。 この strFileName を編集して strChk1 には "20070703" strChk2 には "TEST001" がセットされるようにしたいのですが。。。 どのようにプログラムを書くのが一番いいのでしょうか? よろしくお願いします。

  • 文字列を変数名として扱う方法

    vb6.0 か vb.net で文字列を変数名として扱うにはどうすればいいでしょうか? 例をあげると下記のようなことです。 -------------------- dim abc as string dim x as string abc = "テスト" x = "b" msgbox "a" & x & "c" -------------------- これをそのままvb6.0で実行すると"abc"という文字が表示されますが "abc"ではなく"テスト"と表示させたいのです。 つまり msgbox abc とした場合と同じようにしたいのですが可能でしょうか? ご存知の方教えてください。 よろしくお願いします。

  • ASP.NETの質問なのですが、文字列の引き算は可能でしょうか?

    ASP.NETの質問なのですが、文字列の引き算は可能でしょうか? dim a as string = "abcde" dim b as string = "cde" dim c as string c = a- b このようなコードでcの答えをabとして表示できるでしょうか? ご存知の方がいらっしゃりましたらアドバイスお願いいたします。

  • VBA ファイル名の変更方法

    nameというファイル名を、testという「String型変数」が保持している文字列に変更させたいと思っています。 こういう場合には、どのような記載すればよいのでしょうか? (As以降の書き方がわかりません) Dim test as String Name ("C:\name.txt") As ("C\「test変数が保持している文字列」.txt")

  • 特定の列・行をテキストファイルに保存させたい

    VB6.0とSPREAD6.0で スプレッドシート内のデータをCSVファイル化させるプログラムを組んでいます Private Sub Command1_Click()   Dim blnCHECK As Boolean   Dim strMsg As String   Dim strDate As String   Dim lngResponse As Long   Dim ret As Boolean   strDate = Format(Now(), "yyyymmddhhmmss") 'ファイル名   With spdTarget 'スプレッドシート     .Row = 1     While .Row <= .MaxRows       .Col = LNG_SPD_COL_CHECK 'チェックボックス       If .Value <> 0 Then         blnCHECK = True         strMsg = "選択データをファイル作成しますか?"         lngResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Exit Dialog")         If lngResponse = vbYes Then           ret = spdTarget.ExportToTextFile _           ("C:\Documents and Settings\ファイル作成先\" & strDate & ".csv", "", _           ",", Chr(13), ExportToTextFileColHeaders + _           ExportToTextFileCreateNewFile, _           "C:\Documents and Settings\ファイル作成先\" & strDate & ".log")         Else           Exit Sub         End If       End If     .Row = .Row + 1     Wend   End With   If blnCHECK = False Then     MsgBox "作成対象データを選んで下さい", vbExclamation   End If End Sub 上記のコードだと表内の全てのデータをCSVファイル化させる事はできるのですが 特定の行(1列目のチェックボックスで指定)や特定の列のみを選択してファイル化させる といった動きにさせるには、どうしたら良いのでしょうか?

  • accessVBAで特定の文字列を削除

    以前頼んで作ってもらったVBAを少し改造しようと思っていますが、上手くいきませんので質問します。よろしくお願いします。 csvファイルを分割するVBAを作ってもらいました。 1001,a12345678 1001,b15467863546789 1001,b25463254875698 1001,c23564879 1005,a23456753 1005,b25647565823653 1005,c26546875 1007,a23456789 1007,b23659856325632 1007,b46785215468523 1007,c12546873 というcsvファイルを 1001.csvというファイルで中身は 1001,a12345678 1001,b15467863546789 1001,b25463254875698 1001,c23564879 と 1005.csvというファイルで中身は、 1005,a23456753 1005,b25647565823653 1005,c26546875 と 1007.csvというファイルで中身は、 1007,a23456789 1007,b23659856325632 1007,b46785215468523 1007,c12546873 の3つのcsvファイルに分けます。 今回は仕様変更で、 1001.csvというファイルで中身は a12345678 b15467863546789 b25463254875698 c23564879 と 1005.csvというファイルで中身は、 a23456753 b25647565823653 c26546875 と 1007.csvというファイルで中身は、 a23456789 b23659856325632 b46785215468523 c12546873 の3つに分けなくてはならなくなりました。 今使っているVBAは Private Sub DOQUERY_Click() Dim IN_FNO As Integer Dim OUT_FNO As Integer Dim BREAK_OLD As String Dim BREAK_NEW As String Dim HEADLINE As String Dim TEXTLINE As String Dim ARY() As String Dim OUTNAME As String Dim ARYNAME() As String Dim CNT As Integer Dim MSG As String '============================================ On Error GoTo err If IsNull(InputFile) Or IsNull(OutputFile) Then Exit Sub End If If InputFile = "" Or OutputFile = "" Then MsgBox "ファイル名が正しく指定されていません。", vbCritical Exit Sub End If ラベル5.Visible = True DoEvents '読込みCSV OPEN IN_FNO = FreeFile Open InputFile For Input As #IN_FNO '見出し読込み Line Input #IN_FNO, HEADLINE$ '1レコード目読込み Line Input #IN_FNO, TEXTLINE$ '発注番号 ARY() = Split(TEXTLINE$, ",") BREAK_NEW = Replace(ARY(0), """", "") BREAK_OLD = BREAK_NEW '出力CSVファイル名作成 OUTNAME = OutputFile & BREAK_NEW & ".csv" '出力CSVファイル名保存 CNT = 1 ReDim Preserve ARYNAME(CNT) ARYNAME(CNT) = OUTNAME '出力CSV OPEN OUT_FNO = FreeFile Open OUTNAME For Output As #OUT_FNO '見出し書込み Print #IN_FNO, HEADLINE$ '1レコード目書込み Print #IN_FNO, TEXTLINE$ Do While Not EOF(IN_FNO) '次レコード目読込み Line Input #IN_FNO, TEXTLINE$ '発注番号 ARY() = Split(TEXTLINE$, ",") BREAK_NEW = Replace(ARY(0), """", "") '発注番号が変わったとき新しいCSVを開く If BREAK_OLD <> BREAK_NEW Then CNT = CNT + 1 BREAK_OLD = BREAK_NEW '旧書込みCSVをクローズ Close #OUT_FNO '新出力CSVファイル名作成 OUTNAME = OutputFile & BREAK_NEW & ".csv" '新出力CSVファイル名保存 ReDim Preserve ARYNAME(CNT) ARYNAME(CNT) = OUTNAME '新出力CSV OPEN OUT_FNO = FreeFile Open OUTNAME For Output As #OUT_FNO End If '次レコード書込み Print #OUT_FNO, TEXTLINE$ Loop '出力CSVクローズ Close #OUT_FNO '入力CSVクローズ Close #IN_FNO '出力したCSV名称一覧 Dim I As Integer For I = 1 To UBound(ARYNAME()) MSG = MSG & ARYNAME(I) & vbCrLf Next MsgBox CNT & "個のファイルに分割しました。" & vbCrLf + vbCrLf & MSG, vbInformation, "CSV分割" ラベル5.Visible = False Exit Sub err: MsgBox err.Description, vbCritical, "エラー" ラベル5.Visible = False End Sub です。 ファイル名がBREAK_NEWでそれを消せればいいと思うのですが・・・ 以上長くなりましたが、よろしくお願いします。

  • 文字列の分解・格納

    お世話になります。 文字列の分解についてお聞きします。 環境はVB.NET2008です。 Private Sub Main(ByVal CmdArgs() As String) Dim cmds() As String cmds = System.Environment.GetCommandLineArgs() End Sub コマンドライン引数で以下のように文字列を取得しています。 ("起動exe", "/KEY=○○○/ テーブル名=△△△") この文字列を元に、 変数Aに○○○を変数Bに△△△を代入したいのですが、どうやるのでしょうか? ご教示願います。

専門家に質問してみよう