• ベストアンサー

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   

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

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

  • ベストアンサー
  • suz83238
  • ベストアンサー率30% (197/656)
回答No.1

両側から数値で切ると下記でいいんじゃない?もっと良い方法があるような気がするけど。 Sub XYZ() x = "FILE20041211_1212system.xls" x1 = Replace(x, ".xls", "") For i = 1 To Len(x1) a = Asc(Mid(x1, i, 1)) If a >= 48 And a <= 57 Then Exit For Next i y = Left(x1, i) For j = Len(x1) To 1 Step -1 a = Asc(Mid(x1, j, 1)) If a >= 48 And a <= 57 Then Exit For Next j y = y & Right(x1, Len(x1) - j) z = Mid(x1, i, j - i + 1) MsgBox x MsgBox y MsgBox z End Sub

taktta
質問者

お礼

これも正常動作を確認しました。 これから解読してみます。 こちらは、コードを認識してやるということで回答1と2のやり方をマスターすればこの手の問題は解けると思います。 力作とても感謝いたします。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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 こんな感じでしょうか?

taktta
質問者

お礼

いやーこんなふうにしてできるんですね。 びっくりしました。これから解読してみますが、 こういうことなんですね。どうもありがとうございました。 希望通りの動作です。 ーーーーーーーーーーーーーーーーーーーーーー メタ文字とエスケープシーケンス ^ 文字列の先頭 $ 文字列の末尾 \n 改行 . 改行を除く任意の1文字 * 直前のパターンの0回以上の繰り返し + 直前のパターンの1回以上の繰り返し ? 直前のパターンが0回または1回現れる \d 任意の数値 \D 任意の数値以外の文字 \s 任意のスペース文字 \S 任意のスペース以外の文字 () パターンのグループ化 | パターンの論理和 [] キャラクタクラス

関連するQ&A

  • 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でも同じ結果をだしたい。

  • パターン処理(再度) 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の置換 方法

    前回も似たような質問をさせていただいたのですが、 また似たような処理が出てきてしまったので質問させてください!! もしお分かりになる方がいらっしゃいましたらアドバイスいただけると嬉しいです。 よろしくお願いします!! コード番号の一括置換えをするにはどうすれば良いのか教えてください。!! <例> 00000X0-0 00111T0-1 00200S0-0 00003K0-0    ・    ・    ・    ・ 上記のような数字5桁/英字1文字/数字1桁/ハイフン/数字1桁 で表記されるコード番号があります。 このコード番号を数字3桁/英字1文字/数字2桁/ハイフン/数字2桁 で一括置換えしたいのですが、それは可能でしょうか? <例> 000X00-00 111T00-01 200S00-00 003K00-00 *英字の次の数字とハイフンの次の数字は“0”が挿入されます。 (下線の箇所です。) コード番号の数が600件程あるので、一括置換えができると とても時間短縮になるのですが、、、。 置換えでなく、他の方法で変換が出来るのでしたらそちらも 教えて頂ければと思います。 (難しいマクロとかはやったことがないのでできましたら関数の応用などで 出来るやり方を教えて頂ければ有難いです。) 宜しくご指導お願いします。!!

  • excelでマトリックスを作成したいのですが…

    仕事でexcelを使用したマトリックスを作成を要しており、 通常の関数では対応できないようで(私の不勉強かもしれませんが…^^;) 、ご存知の方がいらっしゃいましたら、お応え頂けましたら幸甚です^^ 【質問内容】 2変数を擁する算式に基づき、得られる解(以下、「Z」とします。)をマトリックス(二次元)上に配置したいと考えています。 (算式) 2X+Y=Z (マトリックス) マトリックスのタテ・ヨコを、それぞれ変数(以下、タテの変数を「X」、ヨコの変数を「Y」とします。)とし、上記算式に基づき得られる解Zをそれぞれマトリックス上に配置します。    Y1  Y2  Y3  Y4  Y5 X1 Z11 Z12 Z13 Z14 Z15 X2 Z21 Z22 Z23 Z24 Z25 X3 Z31 Z32 Z33 Z34 Z35 X4 Z41 Z42 Z43 Z44 Z45 X5 Z51 Z52 Z53 Z54 Z55 (留意事項) ・XとYは自由に変更できる(もしできれば・・・) ・変数・解ともに数字が入ります。 ・変数の入力後、一度でマトリックスが埋まるような式(マクロ?)が理想です。 もし、ご不明な点などありましたら、質問お願いします。 不勉強なままお伺いして厚かましい限りですが^^; 宜しくお願い致します^^

  • VBAでピボットテーブルは作れるものでしょうか

    2つ連続して質問してしまい申し訳ありません。 以下のようなExcelデータがあります。 このデータを用いて、ピボットテーブルを作りたいと考えています。 縦項目に変数A(氏名)、横項目に変数B(科目) クロス表に示される値を変数C(得点) としたいと考えています。 変数Dは過去の試験結果で今回は用いません。 手操作でのピボットテーブルは自分で作成できるのですが、今後のために 自動的に処理させる一環として、VBAのプログラムでピボットテーブルを 作成したいと考えています。 そのようなことは可能でしょうか? もし可能でしたらどのようなコードになるのでしょうか。 お手数ですが、教えていただけると幸いです。 よろしくお願いいたします。 A    B C  D Xさん 国 60 65 Xさん 社 90 85 Xさん 数 70 55 Xさん 理 80 75 Xさん 英 65 70 Yさん 国 85 85 Yさん 社 95 90 Yさん 数 95 100 Yさん 理 90 90 Yさん 英 85 90 Zさん 国 55 60 Zさん 社 40 35 Zさん 数 40 50 Zさん 理 60 65 Zさん 英 35 30

  • エクセル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

  • エクセルVBA 変数の値を別の変数に格納するには?

    Xという変数に格納した値を Y1,Y2,Y3という変数にいれて Y値を操作するという作業をすることが目的です。 最初は Y1 = X としてみましたがうまくいかず、苦し紛れに Worksheets(1).Cells(1, 1) = X Y1 = Worksheets(1).Cells(1, 1) Y2 = Worksheets(1).Cells(1, 1) Y3 = Worksheets(1).Cells(1, 1) X値をいったんセルにいれて そこからY値をとるという われながらなかなかセンスのない処理をしています。 だれか美しいコードを教えてください。

  • エクセルマクロで、他ブックのプログラムを実行する方法

    よろしくお願いします。 A.xlsとB.xlsがあるとします。 A.xlsの中にaというマクロプログラムがあるとしまして、 この中で色々と処理をするとします。そしてその処理結果(例えばxという変数)をB.xlsの中にあるbというマクロプログラムに渡してbを実行させたいのです。 aの中で、   Application.Run "B.xls!b" と書けば、bは走ってくれるのですが、xをbに渡す方法がわかりません。   Call b(x) のような感じでできないものでしょうか? 何卒よろしくお願いします。

  • VBAにおいて、""内で変数を使用したい

    VBAにおいて、""内で変数を使用したい 0864_001.xls 0864_002.xls … 0864_009.xls というファイルがあるとき、0864_001.xlsを開く→処理→閉じる→0864_002.xlsを開く→… というように処理をしたいと思い、以下のようなマクロを作成しました。 Sub Test() Dim i As Integer For i = 1 To 9 Workbooks.Open ThisWorkbook.Path & "\0864_00i.xls" 処理 閉じる Next i End Sub 実行しようとしてもファイルを開くことが出来ずに困っています。 ""内で変数を使うことは出来ないのでしょうか? また、どのようにすれば実行できるようになるのか教えてください。

  • excel vba

    マクロ中次のコードを入力したとき、コンパイルエラー 修正候補:区切り記号または) というメッセージがでて赤文字でコードが表示され カーソルが"A1".valueの.のところになりますが、原因がよくわかりません。 何か間違っていますか。 Workbooks("LOG-analysis-tool1.xls").xfile_Name1.Range("A1".value)=1+Workbooks("LOG-analysis-tool1.xls").xfile_Name1.Range("A1".value)

専門家に質問してみよう