任意の文字列String型からある条件を満たした一部分のみ切り出したい

.jspの拡張子がついたファイル名のみ取り出す
ディレクトリが書いてある場合と、コメントが書いてある場合の2パターン存在する
例外としてファイル名のみ記載されている部分がある(当然ここは問題なし。)

条件
.jspは文字列のどこにあるかは不明
一つの文字列に.jspは複数存在しない
ファイル名は統一されていない(パターンなど統一性はない)
ファイル名の前は・,/,",日本語がついている場合がある
.jspの後は;,);,日本語がついている場合がある

これをクリアして
xxxxxx.jspを抽出したいのですが、
どんなやりかたがあるのでしょうか?
抽象的ですいませんが宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.#3の修正です。


投稿したら、半角の中点が全角になってしまいました。1行追加して下さい。

  strBad = "/\<>*?|:;,・" & Chr(&H22)
  strBad = StrConv(strBad, vbNarrow)  '追加します

最初のstrBad =・・・ の『・』を半角にしてもらえれば、追加の1行は不要です。注意力が足りませんでした。
    • good
    • 0

素直に、質問通りの答えを出すようにしてみましたが、望むものでしょうか。


質問だと、全角文字はファイル名になり得ないと解釈しました。日本語文章の中から、条件に見合った半角のファイル名を切り出すことができるはずです。

ユーザー定義関数です。任意の文字列を引数にします。
MyFileName = fncCutFileName(任意の文字列) とします。
条件に合うファイル名が切り出せない場合は『なし』が帰ってきます。
VB6がないため、Excel2000VBAで作成しています。多分同じでしょう。

Public Function fncCutFileName(Moji As String)
  Const strSch = ".jsp" '検索する拡張子
  Dim strBad As String 'ファイル名に使えない文字と質問にある文字
  Dim iniMoji As String '検索対象文字の初期値
  Dim pot As Integer '.jspの検索位置
  Dim L As Integer 'カウンタ

  strBad = "/\<>*?|:;,・" & Chr(&H22)

  iniMoji = Moji
  Moji = StrConv(iniMoji, vbLowerCase) '小文字にしてしまう

  pot = InStr(Moji, strSch) '.jspを探す
  If pot > 0 Then
    Moji = Left(iniMoji, pot + 3) '.jspより後ろをカット
    'ファイル名に使えない文字と質問にある文字を探して分離する
    For L = pot - 1 To 1 Step -1
      If InStr(strBad, Mid(Moji, L, 1)) > 0 Then
        Moji = Mid(Moji, L + 1): Exit For
      End If
    Next
    '日本語(全角文字)があればファイル名としない
    For L = Len(Moji) - 5 To 1 Step -1
      If Not (Abs(Asc(Mid(Moji, L, 1))) < 256) Then
        Moji = Mid(Moji, L + 1): Exit For
      End If
    Next

    fncCutFileName = Moji
  Else
    fncCutFileName = "なし"
  End If
End Function
    • good
    • 0

下記のようなフルパスのストリングの中からファイル名を取り出す


事ではないのですか。(フォームモジュールに記述しました。)
'のついたコメントのあり方、セパレーターが¥以外に/や中点
やコンマが有る状態(混在している?)が良く理解できません
ので、解の一部分の参考になればと記します。
Private Sub Form_DblClick()
a = "c:\ccc\aaaa\bbbbb\cccc.jsp"
s = 1
For i = 1 To 20 '深さを20までと仮定
p = InStr(s, a, "\")
MsgBox p
If p = 0 Then GoTo p01
q = p '1回前として保存
s = p + 1 '次ぎの文字から探索
Next i
'------
p01:
l = Len(a) - q
MsgBox l
FileName = Mid(a, q + 1, l)
MsgBox FileName 'cccc.jpgを取り出した確認
End Sub
セパレーター記号を探索するのと並行して、上記ではlen(a)とした部分をjspの位置を探索しそれで置きかえれば、質問の題意に沿うようになると思う。
jspから次ぎのjspまでをaに切り出して上記を
考える。
    • good
    • 0

こんにちは。

maruru01です。
ファイル名が文字列のどこにあるかによります。
もし文字列の真ん中にあるなら、ファイル名の先頭がどこかが分からないと取り出しようがありません。
もし、必ず先頭にファイル名(ディレクトリ名込みでも可)があるなら、

1.先頭から4文字ずつ".jsp"と比較する
2.見つかったら、先頭から".jsp"までを切り出す(後ろを捨てる)
3.ディレクトリがある場合は、一番後ろの"\"を探して、それより後ろを切り出す

という手順でしょうか。
ちなみにファイル名に"\"が入っていたらダメですが。
では。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

VB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

Aベストアンサー

&amp;="&"
&amp;="""
=Right([nendo],2) &amp; &quot;/06&quot  -> =Right([nendo],2) & "/06"
[nendo]はアクセスのフィールド名か(アクセスのVBA?)。[]で囲むから。
中身は、#2でご指摘の年度で2007とかは行っているのでしょう。
Right関数は文字列の右側、最後から文字数を指定して切り出す。
&は文字列を結合する演算子。
/06をこの順序で結合するもの。

Q特定のパターンの文字列の間に何もない場合にダミー文字列を挿入

特定のパターンの文字列の間に何もない場合にダミー文字列を挿入

こんにちは、VBA初心者です。

以下のような処理をVBAで行いたいのですが、かなり基本的なところでつまずいています。
(この場合、テキストファイルを開くのにOpenステートメント使うべきかFSOでいくべきか、というあたりで既につまずいています)どのような手法で進めていったらいいのかアドバイスをいただけないでしょうか。

1. 下に示す「テキストサンプル」のような内容のテキストファイルがあるとします。

2. このファイル内の「:SAMPLE_TEXT_ID_」で始まる行と行の間に何もなかった場合は、任意のダミー文字(「Dummy」など)を挿入します。

2.2. 「//」で始まる行はコメントなので無視します(空行と同じとみなす)。あるいは、ダミー文字を挿入する処理を実行する前に削除してしまいます。

※以下の「テキストサンプル」では「:SAMPLE_TEXT_ID_ABC_002」と「:SAMPLE_TEXT_ID_AAA_001」の間に「Dummy」が挿入されれば成功です。

3. 上記の処理をフォルダ内のすべてのテキストファイルに対して実行します(100ファイル以上あります)。

【テキストサンプル】
:SAMPLE_TEXT_ID_ABC_001
Sample text

:SAMPLE_TEXT_ID_AABBCC_001
//Sample comment
Test string

:SAMPLE_TEXT_ID_ABC_002

:SAMPLE_TEXT_ID_AAA_001
Temp text: any text in the file

とりあえず、1つのファイルを開く所だけ自分で書いてみましたが、なぜかファイルの最終行のみが連続して書き出されてしまいました。(フォルダ内のある100以上のファイルをすべて処理することを考えると、やっぱりワークシートに書き出さないほうがいいような気がするのですが、それではどうすればいいのか言われると???です)

Sub ダミー文字挿入()
Dim myImput As String
Dim i As Integer

Open "D:\VBA\sample_01.txt" For Input As #1
i = 1

Do Until EOF(1)
Input #1, myImput

For i = 1 To 3
Cells(i, 1).Value = myImput
Next i
Loop
End Sub
【サンプルコード】

特定のパターンの文字列の間に何もない場合にダミー文字列を挿入

こんにちは、VBA初心者です。

以下のような処理をVBAで行いたいのですが、かなり基本的なところでつまずいています。
(この場合、テキストファイルを開くのにOpenステートメント使うべきかFSOでいくべきか、というあたりで既につまずいています)どのような手法で進めていったらいいのかアドバイスをいただけないでしょうか。

1. 下に示す「テキストサンプル」のような内容のテキストファイルがあるとします。

2. このファイル内の「:SAMPLE_T...続きを読む

Aベストアンサー

3要素しかないのだから、億劫がらずに理論展開しましょうよ。

(1)
最初の有効数の値は-1なので、If 有効数 > 1 にはかからず、
Else節が実行されます。有効数は1が加えられ0になります。
次のLine Input #1, バッファ(有効数)はバッファ(0)ですね。
(2)
2回目は有効数が0なので、やはりIf文のElse節に入り、
有効数は1になります。次の読み込みはバッファ(1)に読み込まれ
ます。
(3)
3回目は有効数が1なので、やはりIf文のElse節に入り、
有効数は2になります。次の読み込みはバッファ(2)に読み込まれ
ます。
(4)
つまり有効数>1とは3行読み込んでいるという状態を示すのです。
よって、Line Input 後のIfで、3行を比較し、各行の条件を
調べているのです。
(5)
ループの4回目は最初のIf文では初めてThen節に入ります。
そこで、一番古いバッファ(0)を出力し、バッファの要素を
前方に移動します。つまり、(0)←(1)、(1)←(2)という具合です。
Then節では有効数が+1されないので、有効数は2のままです。
(6)
ということで、3行目以降は常にバッファ(2)に読み込まれます。
勿論、ループ1回に1行ずつしか読み込んでいません。

初心のうちから横着すると、論理的思考能力が鍛錬されませんよ。
もし、怪しいなら、デバッグ実行で、1ステップずつ実行して動作を
確認するぐらいのことはやらないといけません。
尚、掲題のコードは実際に実行させていますので、実行時エラーが
出るとすると、コピーミス(&の前の空白をぬいてしまうとか)では
ないかと思います。

3要素しかないのだから、億劫がらずに理論展開しましょうよ。

(1)
最初の有効数の値は-1なので、If 有効数 > 1 にはかからず、
Else節が実行されます。有効数は1が加えられ0になります。
次のLine Input #1, バッファ(有効数)はバッファ(0)ですね。
(2)
2回目は有効数が0なので、やはりIf文のElse節に入り、
有効数は1になります。次の読み込みはバッファ(1)に読み込まれ
ます。
(3)
3回目は有効数が1なので、やはりIf文のElse節に入り、
有効数は2になります。次の読み込みはバッファ(2)に読み込まれ
ます。...続きを読む

Q【excel vba】エクセルファイル内にある数式の内「関数名(IF,SUM等)」のみを、同ファイル内の新しいシートに一覧化したいです。

vba初心者です。(ネットからコードを拾ってきてちょっと改造できる程度)
excel 2003を使用しています。

【前提】
・「数式」「数値」「文字列」等がセルに入力されたエクセルファイルを使用する
 ⇒「関数名」のみを表示する。(文字列や数値が入力されたセルは無視)
・「数式」セルには「関数」が使われているものと、そうでないものがある
・1セル内に複数の関数が使用されている場合あり(新出の関数名であればすべて抽出したい)
・検索対象シート:ブック内のすべてのシート


【質問】
findメソッドで「IF」や「SUM」というように直接関数名を指定して検索するのではなく、「関数」というククリで検索はできるのでしょうか?

その検索結果を同ファイル内に新しいシート(Sheet1)を作成し、「関数名」を一覧表示するという流れ(以下にまとめました)にしたいです。

【手順】
(1)Book1内で「関数」検索をする
(2)「関数」が見つかった場合は「Sheet1」シートを作成(関数が見つからない場合は,msgbox "該当なし")
(3)検索した「関数名」をSheet1のA1セルに入力する
(4)Book1内すべて(複数シート有り)の関数名を抽出するまで連続検索をする
 ⇒A1→A2→A3→…の様に、A列の上から順に入力していく
※関数名の重複がないように一覧化できれば最高です。
※シート毎に、抽出した関数名を分けなくて大丈夫です。(あくまでファイル全体で使用されている関数名の一覧)
(5)msgbox "終了"


解決方法をご存知の方、ご教示願えませんでしょうか。

宜しくお願いいたします。

vba初心者です。(ネットからコードを拾ってきてちょっと改造できる程度)
excel 2003を使用しています。

【前提】
・「数式」「数値」「文字列」等がセルに入力されたエクセルファイルを使用する
 ⇒「関数名」のみを表示する。(文字列や数値が入力されたセルは無視)
・「数式」セルには「関数」が使われているものと、そうでないものがある
・1セル内に複数の関数が使用されている場合あり(新出の関数名であればすべて抽出したい)
・検索対象シート:ブック内のすべてのシート


【質問】
findメソ...続きを読む

Aベストアンサー

#1 です。

なんか質問の形式をとった作成依頼っぽい気がしなくもない。一応
突っ込み入れときます。

こんな感じでできる気がする。適当に参照設定をして試してみて下さい。
ユーザー定義関数(日本語名を含む)があっても大丈夫かと。

余談:

vArray = Range("A1:C1").Formula

で Value 同様数式の2次元配列が得られますから、速度面が問題になる
ようなら配列処理に改造してみて。


Sub sample()

  Dim dic     As Dictionary
  Dim reg     As RegExp
  Dim regMatch  As Match
  Dim s      As String
  Dim rHasFormula As Range
  Dim r      As Range
  Dim sh     As Worksheet
    
  Set reg = New RegExp
  Set dic = New Dictionary
  
  reg.Global = True
  reg.Pattern = "([^!-@\[\]]+)"

  For Each sh In ActiveWorkbook.Worksheets
  Do
    On Error Resume Next
    ' 23: xlErrors or xlLogical or xlNumbers or xlTextValues
    Set rHasFormula = sh.Cells. _
             SpecialCells(xlCellTypeFormulas, 23)
    On Error GoTo 0
    If rHasFormula Is Nothing Then Exit Do
    
    For Each r In rHasFormula.Cells
      ' // 数式のセル参照文字をR1C1相対参照に固定する
      s = Application.ConvertFormula(r.Formula, _
                      xlA1, _
                      xlR1C1, _
                      xlRelative)
      For Each regMatch In reg.Execute(s)
        Select Case UCase$(regMatch.Value)
        ' // セル参照文字やブール値を除外
        Case "R", "C", "RC", "TRUE", "FALSE"
        Case Else
          ' // Dictionary でカウントしつつ重複のないリストにする
           dic(regMatch.Value) = dic(regMatch.Value) + 1
        End Select
      Next
    Next
    
    Exit Do
  Loop
  Next sh
  
  ' // 出力(面倒なので適当)
  With ThisWorkbook.Worksheets("Result")
    .Activate
    .Cells.Delete
    With .Range("A1:B1")
      .Font.Bold = True
      .Value = Array("Function", "Count")
    End With
    .Range("A2").Resize(dic.Count).Value = Application.Transpose(dic.Keys)
    .Range("B2").Resize(dic.Count).Value = Application.Transpose(dic.Items)
    .Columns("A:B").AutoFit
  End With

  Set reg = Nothing
  Set dic = Nothing
  
End Sub

#1 です。

なんか質問の形式をとった作成依頼っぽい気がしなくもない。一応
突っ込み入れときます。

こんな感じでできる気がする。適当に参照設定をして試してみて下さい。
ユーザー定義関数(日本語名を含む)があっても大丈夫かと。

余談:

vArray = Range("A1:C1").Formula

で Value 同様数式の2次元配列が得られますから、速度面が問題になる
ようなら配列処理に改造してみて。


Sub sample()

  Dim dic     As Dictionary
  Dim reg     As RegExp
  Dim regMatch...続きを読む

Q(;゜д゜)ユーザーフォームでプログレスバーを使いたいが・・・存在していない!!(;゜д゜)

お世話になっております。
プログレスバーについて教えて下さい。
ユーザーフォームを使いそこにプログレスバーが配置できるとネット上で調べたので使おうと思いました。
ところが・・・ツールボックスにプログレスバーがありません(;゜д゜)ァ....
探してみたのですがどこにも見つかりません。エクセルが壊れているのでしょうか?

また、プログレスバーについてどういう風にやったらできるのかというのを見ていたのですがどう動いているのか理解力が無いため理解が出来ません・・・
下記のようなコードがあり作動している間はバーを動かしたいのですがどうしたらいいでしょうか・・・

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim r As Range
For Each r In Target
MyProc r
Next
End Sub

Sub MyProc(Target As Range)





End Sub

お世話になっております。
プログレスバーについて教えて下さい。
ユーザーフォームを使いそこにプログレスバーが配置できるとネット上で調べたので使おうと思いました。
ところが・・・ツールボックスにプログレスバーがありません(;゜д゜)ァ....
探してみたのですがどこにも見つかりません。エクセルが壊れているのでしょうか?

また、プログレスバーについてどういう風にやったらできるのかというのを見ていたのですがどう動いているのか理解力が無いため理解が出来ません・・・
下記のようなコ...続きを読む

Aベストアンサー

回答にある
>プログレスバーはEXCELで提供されていたのですね。
は、少し表現について補足したいと思います。
今、私のツールバーでは、プログレスバーのアイコンが出ていますが、過去に下記下記A-2かB-1をやったためと思います。
http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9g1810.html
のA-2の操作、B-1の操作。
2001,2003で、今まで使ってなければ、出てこないのだと思います(「上記WEBで標準では」という意味)。
マイクロソフトでも他社でも(現実には余りないが)よいが、プログレスバーのコントロールとしてのオブジェクトを提供してくれて、ユーザーが参照設定して(使うという宣言)しまえば、ツールボックスにアイコンが現れるようになります。それをユーザーフォーム上にD&Dすれば(ラベルなどで類似物を自作しないで)使えます。
後はプロパティを設定すればよい。プログラムか操作かどちらかで。
ーー
もうひとつの問題は
ただし上記WEBにある、処理件数 / 総件数 * 100 に当たるものが、質問者の場合何なのかが難しい問題で、分子・分母に来る計数を
何をどう捉えるかがあります。
ーー
さらにもうひとつの問題は
時間が進行し、状況が変化して、表示するタイミングをどう捕まえるかは、そう易しい問題では無いと思うのですが。
ーー
多数のディスク読み込みや、書き込みなどの多件数処理などが時間のほとんどを占めるものは上記WEB上の例のように、考えやすいですが。それでも毎レコード処理するごとに余分な、表示のための処理をしている。
格好よいものですが、難しい点が有ると思う。。

回答にある
>プログレスバーはEXCELで提供されていたのですね。
は、少し表現について補足したいと思います。
今、私のツールバーでは、プログレスバーのアイコンが出ていますが、過去に下記下記A-2かB-1をやったためと思います。
http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9g1810.html
のA-2の操作、B-1の操作。
2001,2003で、今まで使ってなければ、出てこないのだと思います(「上記WEBで標準では」という意味)。
マイクロソフトでも他社でも(現実には余りないが)よいが、プログレスバー...続きを読む

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

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については、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

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...続きを読む

Aベストアンサー

結論を先に述べれば、chr(34) 付加しているのが実行されない原因です。

例えば、

Workbooks.Open Filename:="C:\temp\book1.xls"

は実行されますが、

Workbooks.Open Filename:="""C:\temp\book1.xls"""

は '"C:\temp\book1.xls"' は見つからないとのエラーが出ます。
つまり、この場合、<">がパスとファイル名の一部として認識されています。

ところで、""" は chr(34) の表記の別形式です。
このことは、イミディエイトウィンドウで確認することができます。

[イミディエイトウィンドウ]
strA = Chr(34)
? strA
"
strA = """
? strA
"
|C:\temp\book11.xls|
+---------+

|"C:\temp\book11.xls"|
+----------+

変数は、C:\temp\book11.xls のみを格納しています。
けっして、"C:\temp\book11.xls" とダブルクーテーションも格納している訳ではないです。
コンピュータは、値を格納する際に<どこにどのように>が判らないと処理できないのです。
ダブルクーテーションは、単に、値を格納する箱のタイプを指示しているだけです。
一旦、格納した値を取り出す時は、中味だけでよいのでダブルクーテーションは不要です。

多分、この辺りの誤解が原因でしょう。

結論を先に述べれば、chr(34) 付加しているのが実行されない原因です。

例えば、

Workbooks.Open Filename:="C:\temp\book1.xls"

は実行されますが、

Workbooks.Open Filename:="""C:\temp\book1.xls"""

は '"C:\temp\book1.xls"' は見つからないとのエラーが出ます。
つまり、この場合、<">がパスとファイル名の一部として認識されています。

ところで、""" は chr(34) の表記の別形式です。
このことは、イミディエイトウィンドウで確認することができます。

[イミディエイトウィンド...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報