Excel VBAでの文字列処理方法

このQ&Aのポイント
  • Excel VBAを使用して、特定の形式の文字列を処理する方法を教えてください。
  • 与えられた文字列から、特定の部分を抜き出して新しい文字列を作成する方法を教えてください。
  • 指定された条件に基づいて、与えられた文字列を変換するVBAマクロコードの例を示します。
回答を見る
  • ベストアンサー

excel VBA(vbscript) patttern処理

excel VBA(vbscript) (前提)文字列は、FILE20080301_0330system.xlsのように 英字列数字列_数字列英字列.xlsからなる文字列とする。 あるいはFILE200803010330system.xls  のように途中の"_”がなかったりする。 (例) x =FILE20080301_0330system.xls   上記のような文字変数x を処理して変数yを求める。ただし"_”はない場合もある。 y=FILEsystem     (つまり.xlsを除き、先頭の英字を残し、続いて数字や_を取り去り後ろの英字部分を採用した文字列とする) また文字変数x を処理して変数zを求める。 z=20041211_1212.xls   (つまり.、先頭の英字を取り去り残し、続いて数字部分と_を残し後ろの英字部分を除き 、さらにxlsを残した文字列とする) マクロコードについて下記のコードが解決しますが、 Sub test()  Dim x As String  Dim y As String  Dim z As String   x = "FILE20041211_1212system.xls"  With CreateObject("VBScript.RegEXP") .Pattern = "^(\D*)(\d+\_?\d+)(\D*)\.xls"    If .test(x) Then       y = .Replace(x, "$1") & .Replace(x, "$3")       z = .Replace(x, "$2") & ".xls"    End If       MsgBox x & vbLf & y & vbLf & z  End With End Sub (今回の質問) (例)x=FILE20041211_1212system.xlsにおいて データ自身が、.xlsの前に半角あるいは全角のspaceが1つ入っていても結果として求めるy,zを出すにはどのように.patternなど変更すればよいかを教えてほしい。つまり下記例 (例)x=FILE20041211_1212system .xlsでも同じ結果をだしたい。

  • taktta
  • お礼率72% (1031/1430)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 パターンで処理する方法もあるけれども、以下のように、VB側のReplace 関数で処理したほうが確かな気がします。パターンには、テキストコンペア・モードがなかったような気がするので、全角・半角を指定しなければならないと思います。 Sub test2()  Dim x As String  Dim y As String  Dim z As String   x = "FILE20041211_1212system .xls"  With CreateObject("VBScript.RegEXP")  .Pattern = "^(\D*)(\d+\_?\d+)(\D*)\.xls"    If .test(x) Then       y = .Replace(x, "$1") & .Replace(x, "$3")       '以下に一行加えた       y = Replace(y, Space(1), "", , , 1) '1=vbTextCompare       z = .Replace(x, "$2") & ".xls"    End If       MsgBox x & vbLf & y & vbLf & z  End With End Sub

taktta
質問者

お礼

ご回答どうもありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#1の回答者です。 一応、代わりの正規表現パターンも書いておくことにします。 Replace 関数で行うのも、どちらでもよいです。全角空白に関しては、可視化するために、文字コードにしておきました。  .Pattern = "^(\D*)(\d+\_?\d+)([A-z]+)[\s\u3000]*\.xls"

taktta
質問者

お礼

どうもごていねいに、ご回答どうもありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

xをVBAのReplaceで、 x = Replace(x, " ", "") x = Replace(x, " ", "") としておけばいいが、 どうしてもRegEXPを使いたければ、 .Pattern = "^(\D*)(\d+\_?\d+)([a-z]*)((\s*)| *).xls" とでもするのかな。 | *).は全角空白。 半角空白か、全角空白だけなら何個でもいいが、混在はだめだ。 1個なら大丈夫だろう。

taktta
質問者

お礼

 その通り本質をみていませんでした。 ご回答どうもありがとうございました。

関連するQ&A

  • パターン処理(再度) vbscript

    excel VBA(vbscript) 質問1 文字変数Xを処理して変数yを求めるマクロコードのヒントを     (つまり.xlsを除き、続いて文字や_を取り去る) 質問2 文字変数Xを処理して変数zを求めるマクロコードのヒントを     (つまり文字のみを取り去る) (例)x=FILE20041211_1212system.xls    y=FILEsystem    z=20041211_1212.xls   上記に対して次の回答があり、満たします。 ANo.2 Sub test()  Dim x As String  Dim y As String  Dim z As String   x = "FILE20041211_1212system.xls"  With CreateObject("VBScript.RegEXP")       .Pattern = "^(\D*)(\d+\_\d+)(\D*)\b.xls\b$"       If .test(x) Then          y = .Replace(x, "$1") & .Replace(x, "$3")          z = .Replace(x, "$2") & ".xls"       End If       MsgBox x & vbLf & y & vbLf & z  End With End Sub (今回の質問)(例)x=FILE20041211_1212system.xlsにおいて "_"が実ははいらない場合もありまして、そのような例 x=FILE200412111212system.xlsにおいては、どのようにANo.2 Sub test()を変更すべきか。

  • excel VBA

    excel VBA 下記のようなwwwww.xlsの形の文字列xで、 xは英字 数字_数字 英字.klsの形式で_はひとつだけ xの処理で 質問1 文字変数Xを処理して変数yを求めるマクロコードのヒントを     (つまり.xlsを除き、続いて文字や_を取り去る) 質問2 文字変数Xを処理して変数zを求めるマクロコードのヒントを     (つまり文字のみを取り去る) (例)x=FILE20041211_1212system.xls    y=FILEsystem    z=20041211_1212.xls   

  • エクセルVBA/ Formatで文字列が数値に化ける?

    いつもお世話様です。 エクセルVBAでFormatを使うと、文字列中にeが一つ入っていると、「指数」とみなされて勝手に数値に化けてしまうようです。 話を簡単にするため、問題のコートを簡易化したコードが下記のtest1です。 入力されるのは常に3文字以内の英数です。 test1のコードは、ab9と入れればAB9、01とか20とか入れると、予定通り001や020を返してくれます。 ところが、なかには1E1や4E3なども入力する必要があり、これを入れると010や4000に化けてしまいます。 現在は、対処するため、下記test2のように、文字列中に"E"があるかどうかで処理を分岐させていますが、ほかに何か良い方法はないでしょうか? Sub test1() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) z = Format(y, "000") MsgBox z & " Typeだよ。" End Sub Sub test2() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) If InStr(y, "E") > 0 Then z = y Else z = Format(y, "000") End If MsgBox z & " Typeだよ。" End Sub

  • VbscriptによるExcelのコピー&ペースト

    いつもお世話になります。 教えて頂きたいのは、 「VBScript」でExcelのセルの内容をコピー&ペーストしても、 オートシェイプなどがペーストされません。 どうすれば、すべての内容をペーストできるでしょうか? (分かりにくい変数名で申し訳ございません) Option Explicit Dim v, w, x, y, z Set v = CreateObject("Excel.Application") Set w = v.Workbooks.Open("E:\Test\Original.xls") Set x = w.Worksheets(1) Set y = v.Workbooks.Open("E:\Test\Result.xls") Set z = y.Worksheets(1) v.Application.DisplayAlerts = False x.Range("A1:U55").Copy z.Range("A1:U55").PasteSpecial(-4104) x.Range("AB1:AF55").Copy z.Range("V1:Z55").PasteSpecial(-4104) y.SaveAs("E:\Test\ResultPaste.xls") y.Close w.Close v.Quit Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing MsgBox("Finished") 上記のプログラムで、「Original.xls」の内容を 「Result.xls」にコピー&ぺーストしたいのですが、 セル内の文字情報はフォントや文字の大きさ(サイズ)、 セルの表示形式などがちゃんとペーストされたのですが、 「Original.xls」にあるテキストボックスや オートシェイプはペーストされませんでした。 すべての内容をペーストするには、 どうすれば良いでしょうか? よろしくお願い致します。

  • エクセル VBA Call

    VBA初心者です。 callというのを知ったのですが、 ------------------------------- sub aaa() Dim z As Integer For z = 1 To 30 Step 1 Dim y As String y = Cells(2 + z, 3).Value Dim x As String x = Cells(2 + z, 2).Value ・ ・ call m1 call m2 call m3 call m4 ・ ・ next z end sub という記載があって呼び出し元に sub m1 sheet(y).select と書きたいです。この y とか x を先に記載した内容と同じ 認識にするにはどうしたら良いですか。 ど素人に分かるようにお願いします。教えてエクセル大先生。

  • VB.NETの関数プロシージャの書き方を教えてください。

    Public A As String という変数にある文字列データが入っていて、 ボタンを押すとその時に変数X,Y,Zに入っている 文字列を検索してButton1_Clickプロシージャ内に戻って来て KekkaX,KekkaY,KekkaZに数値が入るような関数プロシージャなのですが、 呼び出す部分の書き方と関数のプロシージャ名の書き方を教えて頂きたいです。 検索する部分は自分で出来ると思うので大丈夫です。 Public A As String = "何かの文字列" Button1_Click Dim X,Y,Z As String Dim KekkaX,KekkaY,KekkaZ as Integer '変数Aの中からX,Y,Zを検索したい X="*****" Y="ABCDE" Z="#####" GetKensakuKekka(????????) ←この部分の書き方を教えて下さい。 'KekkaX,KekkaY,KekkaZ 内に検索結果を取得したい Console.WriteLine(KekkaX) Console.WriteLine(KekkaY) Console.WriteLine(KekkaZ) End Sub Function GetKensakuKekka (???????????) ←この部分の書き方を教えて下さい。 ・ ・ ・ End Function よろしくお願い致します。

  • エクセルVBAでの変数

    いつもお世話になります。 今回の『壁』は”変数”です。 変数の中に更に変数を持たせることはできますか? 何をしたいかと言いますと… dim mon1 as string dim mon2 as string dim mon3 as string dim mon4 as string dim mon5 as string dim tue1 as string dim tue2 as string …というように月曜から日曜までの頭3文字プラス1~5の組み合わせの変数を作りたいのですが、 この調子で作っていくと35コになってしまいます。 そこで、曜日の頭3文字より後ろは決まって1~5のため、 dim i as integer for i = 1 to 5 next i …と組み合わせられないかと思ったのです。 どなたか知恵をお貸しください。 よろしくお願いします。

  • EXCEL VBAで変数を使ってファイルを開きたいのですが。

    いつもお世話になります。Win98-EXCEL2000での作業です。 いくつかのファイルで同じ処理をしたいので、変数を使ってファイルを開くことができたらいいなと思って、こんな感じがいいなと作ってみたのですが、 Dim iii As Integer Dim myF As String For iii = 1 To 5 If iii = 1 Then myF = "偏貼_log" ElseIf iii = 2 Then myF = "Cof_log" ・・・と、5つのファイル名を入れて、 Workbooks.Open Filename:="myF.xls" としたいのですが、当然ここで変数が入っても「myF.xls」というファイルを探しに行ってしまいますよね・・・ こういう場合はどうすればよいのでしょうか。 宜しくお願いします。

  • VBAの正規表現について (エクセル)

    正規表現は苦手なもので、すみませんが教えてください。 下のサンプルで、マッチングに "[(|(].*?[)|)]$"を指定すれば、最後から最短の()内を取得できるものと期待していましたが、実行してみると最短の「(c)」ではなく「(a)x(b)y(c)」がマッチしてしまうようです。 $を除いて"[(|(].*?[)|)]"と"[(|(].*[)|)]"で実行してみると、ちゃんと違いがあるのですが… $をつけた場合で最短の表記方法は、どのようにすればよいのでしょうか? Sub sample() Dim RegE, RegMc Dim str1 As String, str2 As String  Set RegE = CreateObject("VBScript.RegExp")  str1 = "test(a)x(b)y(c)"  str2 = ""  RegE.Pattern = "[(|(].*?[)|)]$"  Set RegMc = RegE.Execute(str1)  If RegMc.Count > 0 Then   str2 = RegMc(0).Value   str1 = RegE.Replace(str1, "")  End If  MsgBox (str1 & vbLf & str2) End Sub

  • エクセルVBAでの質問

    お世話になります。 エクセルVBAのプログラムコードをコピーし、 エクセルの通常シートへ貼り付けした際、 「’」で始まる説明分または注釈をプロシージャ画面の 様に色づけしたいと思い下記の様なコードを書きました。 しかし、VBA実行後、元のコードが行によって、空白 から始まって行の途中に「’」がある場合など、 少し手前の文字から着色されたりしていました。 何故なのでしょうか。 どこがおかしいのでしょうか。 空白が半角か全角になっている為にこのような現象に なっているのでしょうか。 しかしその解決方法が分からなく、 どなたかご教授頂きたく宜しくお願い致します。   記 Sub サンプル() Dim x As Integer Dim y As Integer Dim z As Integer Dim myrng As String Dim zz As Integer For y = 1 To 10 For x = 1 To Cells(Rows.Count, y).End(xlUp).Row If InStr(Trim(Cells(x, y).Value), "'") = 1 Then Cells(x, y).Font.ColorIndex = 10 ElseIf InStr(Trim(Cells(x, y).Value), "'") = 0 Then Else z = InStr(Trim(Cells(x, y).Value), "'") myrng = Cells(x, y) zz = Len(myrng) Cells(x, y).Characters(z, zz).Font.ColorIndex = 10 End If Next x Next y End Sub

専門家に質問してみよう