VBA数字と文字の判断方法について

このQ&Aのポイント
  • Excel2000を使用し、ユーザーフォームのテキストボックスに「A00B0.5C-3.0」と入力してコマンドボタンを押すと、セルのA1に「00」、B1に「0.5」、C1に「-3.0」と表示したいが、マクロを使用すると「-」と「.」も文字と認識してしまい、分かれて表示されてしまう。
  • 連続して「00」「0.5」「-3.0」と表示させるために、どのようにすれば良いか教えてください。
  • VBAにおいて、数字と文字の判断方法について知りたい。
回答を見る
  • ベストアンサー

VBA 数字と文字の判断について

VBA 数字と文字の判断について Excel2000を使用しています。 ユーザーフォームのテキストボックスに A00B0.5C-3.0 というように入力してコマンドボタンのOKなどを押すとセルのA1に00 B1に0.5 C1に-3.0 と表示させたいのですが、下記のマクロを使用すると、 A1に00 B1に0 C1に5 D1に3 E1に0 というように、「-」と「.」も文字と認識してしまい分かれて表示されてしまいます。 セルの位置にはこだわりませんが、連続で 00 0.5 -3.0 と表示させるにはどうしたらよろしいでしょうか? Dim re As Object Dim d() As String Set re = CreateObject("VBScript.RegExp") re.Pattern = "¥D+(¥d+)" re.Global = True d = Split(Trim(re.Replace(tx1.Text, "$1 ")), " ") If UBound(d) > 10 Then Selection.Resize(1, UBound(d) + 1) = d Set re = Nothing   よろしくお願いします。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

数字を取り出すのではなく、 アルファベットを省くのは如何でしょう。 Sub try() Dim re As Object Dim d() As String Dim st As String Set re = CreateObject("VBScript.RegExp") re.Pattern = "[A-Z]+" re.Global = True st = "A00B0.5C-3.0" d = Split(Trim(re.Replace(st, " ")), " ") Range("A1").Resize(, UBound(d) + 1).Value = d Set re = Nothing End Sub 一例になれば。

yasu7r
質問者

お礼

返答ありがとうございます。 このやり方でうまくいきました!文字ではなくアルファベットを省けばよかったんですね。 勉強になりました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

区切り文字として以下の定義になると思います。 「数字、.(ピリオド)、-(ハイフン)でない連続した文字」 正規表現は"[^\d\.\-]+"となります。 以下の部分を修正してください。 ★ re.Pattern = "¥D+(¥d+)"       ↓ re.Pattern = "[^\d\.\-]" ★ d = Split(Trim(re.Replace(tx1.Text, "$1 ")), " ")       ↓ d = Split(Trim(re.Replace(tx1.Text, " ")), " ")

yasu7r
質問者

お礼

返答ありがとうございます。 この方法でもうまくいきました!正規表現の部分がまだちょっと勉強不足でした。 これからもっと勉強していきたいと思います。 ありがとうございました。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.1

こんにちは  入力データのフォーマットは12桁固定ですか?  AとBと-の符号は、固定ですか?

yasu7r
質問者

補足

返答ありがとうございます。 入力データのフォーマットは12桁固定ではなく変動します。 アルファベットは変動しますが、-と.の符号は固定です。

関連するQ&A

  • EXCEL VBA 文字列 

    下記のソースの場合、一つのセル(例えばA1)に【鈴木 太郎】とあれば、隣のセル(B1)に"鈴木 太郎"と表示されます。 (これを一つのセルに【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合は、"鈴木 太郎】【佐藤 太郎】【伊藤 太郎"と表示されます。) 例えば、C1には【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合には、C2には"鈴木 太郎"、D2に"佐藤 太郎"、E2に"伊藤 太郎"とすることは可能でしょうか? ※行によって異なり、【○○ ○○】はいくつあるとは限らないとします。 よろしくお願いいたします。 Sub PickupWords()  Dim Matches As Object  Dim Match As Object  Dim buf As String  Dim c As Variant  With CreateObject("VBScript.RegExp")   .Pattern = "【(.+)】"   .Global = False   Application.ScreenUpdating = False   For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))    If .Test(c.Value) Then     buf = c.Value     Set Matches = .Execute(buf)    c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す    End If   Next c   Application.ScreenUpdating = True  End With End Sub

  • VBA初心者です.文字を抽出しファイルを移動したい

    セルA1に表示された文字(例,CK001など)の右から3番目までの文字を拾って,その文字を含むファイルをAからBに移動したいのですが,上手く作動しませんでした.パス内に変数は使用できないのか(ここではZ)「ファイルが見つかりません」となってしまいます.良い方法をご教授いただければ幸いです.下記は自分が作成したプログラムです. Sub Sample() Dim fso As Object Set fso = CreateObject("scripting.filesystemobject") Dim A As String Dim B As String Dim Z As Variant Z = Right(Range("A1"), 3) A = "C:\Users\abc\Documents\test\*Z*" B = "C:\Users\abc\Desktop\1\2\" fso.MoveFile A, B End Sub

  • ExcelのVBAの正規表現で二重引用符を含む文字列を検索できるようにしたい

    二重引用符を含む文字列を検索できるようにするには 下記の記述の re.Pattern = "<hr class=\"separate\">" の部分をどのように直せばよいのでしょうか? Sub tagCount() Dim cnt As Integer Dim IE As Object Dim HTML As String Set IE = CreateObject("InternetExplorer.Application") IE.Navigate ("http://www.yahoo.co.jp/") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend HTML = IE.Document.body.innerHTML IE.Quit Dim re As RegExp Dim mc As MatchCollection Dim m As Match Set re = New RegExp re.Pattern = "<hr class=\"separate\">" re.Global = True re.IgnoreCase = True Set mc = re.Execute(HTML) MsgBox mc.Count End Sub ご存知の方がおられましたらご回答をよろしくお願いします。 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003

  • アクセスのVBAのご相談

    初めて質問をいたします。よろしくお願いいたします。 Win 2007/Access 2007なのですが、 以下の記述のアドバイスをいただけないでしょうか。 症状は、レコード数を表示させたいフォームのテキストボックスに何も表示されない状況です。 <凡例> テーブルA テーブルB テーブルC テーブルD があります。 テーブルAはテーブルBとaにてリンク テーブルBはテーブルCとbにてリンク テーブルCとテーブルDはcにてリンクしているものとします。 <やりたいこと> フォームAのテキストボックスX、Y、Zを参照し、コマンドボタンをきっかけに、フォーム内部のWのテキストボックスに取得したbのカウント数を、再計算後に表示させたいと思っています。 <その他> Xはテキストボックス名でテキスト型 Zはテキストボックス名で日付型です。 Wはテキストボックス名で数値型です。 ★はbのカウント数です。 *は、数値型のレコードです。 +は、テキスト型のレコードです。 @は、日付型のレコードです。 <以下質問コード> Private Sub Form_Open(Cancel As Integer) Dim db As DAO.Databese Dim rs As DAO.Recordset Dim SQL As Variant Set db = CurrentDb SELECT Count(C.b) AS ★ FROM A INNER JOIN ((B INNER JOIN C ON B.b = C.b) INNER JOIN D ON C.c = D.c) ON A.a = B.a WHERE (((A.*)=1) AND ((D.+)=X) AND ((B.@)="0000-00-00 00:00:00") AND ((A.@) Between Y And Z)); Set rs = db.OpenRecordset(SQL) Me.W = rs!★ Set rs = Nothing Set db = Nothing End Sub <以上質問コード> 退職者が作ったアクセスデーターベースなのですが、 テキストボックスWに計算されたデータ数が表示がされなくなり、 自分なりに過去の質問をさぐってみたのですが、 いまだに、ゴールに行きつきません・・・。 質問の仕方が間違えていましたら申し訳ありません。 どうか、アドバイスのほど、よろしくお願いいたします。

  • エクセルVBAの文字列操作について2

    エクセルVBAの文字列操作について2 以前、こちらでご教授いただいた以下のような文字列操作方法があります。 この方法ですと例えば[1-3]から3をひいた際に"1-2"と表示されますが 今回は連続する数字が2つの場合は1,2と表示させ3つ以上の場合は-でつないで表示させたいと思います。 一週間ほど考えたのですが解決できませんでした。 どなたかご協力お願いいたします。 質問内容 例えば、[1-10,15-20,22-38]と入っているセルがあるとします。 このセルに数を足したり引いたりしたいのです。 例えば、このセルから”5”を引いて[1-4,6-10,15-20,22-38]と表示したり、 "21"を足して[1-10,15-38]と表示したい。 いただいたご回答  A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに =NUMORDER(A1,-5) と入力すると「1-4,6-10,12,15-20,22-38」と表示し =NUMORDER(A1,21) と入力すると「1-10,12,15-38」と表示します。  1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。 Function NUMORDER(myStr As Variant, num As Integer) As String  Dim i As Long  Dim j As Double  Dim myNum As Variant   '文字列中の スペース を削除  myStr = Replace(myStr, " ", "")   '文字列の前後に「0」・「100」を挿入  Select Case Left(myStr, 2)   Case "1,", "1-"    myStr = myStr & ",100"   Case Else    myStr = "0," & myStr & ",100"  End Select   '文字列を カンマ で分割し、ハイフン の区間の数字を補完する  myStr = Split(myStr, ",")  For i = 0 To UBound(myStr)   If InStr(myStr(i), "-") > 0 Then    myNum = Split(myStr(i), "-")    myStr(i) = ""    For j = myNum(0) To myNum(1)     myStr(i) = myStr(i) & " " & j    Next    myStr(i) = Trim(myStr(i))   End If  Next   '欠番に「●」を入れ、「数を足したり引いたり」する  myStr = Split(Join(myStr))  For i = 0 To UBound(myStr) - 1   myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)  Next  myStr = Split(Join(myStr))  If num > 0 Then   myStr(num - myStr(0)) = num  Else   myStr(-num - myStr(0)) = "●"  End If   '前後に挿入した「0」・「100」を削除  myStr = Replace(Join(myStr), " 100", "")  If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)   '連続数字を ハイフン で繋ぐ  myStr = Split(myStr, "●")  For i = 0 To UBound(myStr)   If myStr(i) <> " " Then   myNum = Split(Trim(myStr(i)))    If UBound(myNum) > 0 Then     myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))    End If   End If  Next   'カンマ で文字列に分割する  myStr = Application.Trim(Join(myStr))  NUMORDER = Replace(myStr, " ", ",") End Function

  • VBA エクセル 文字列

    A列に、【鈴木 太郎】、【佐藤 一郎】・・・・と続いていて、B列には鈴木、佐藤・・・と表示させたい場合は以下のソースに、 =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) と同じソースを書けばいいのはわかるのですが、勉強不足でわかりません。教えていただけませんでしょうか。下記のソースも教えていただきました。すごく助かります。 Sub PickupWords() Dim Matches As Object Dim Match As Object Dim buf As String Dim c As Variant With CreateObject("VBScript.RegExp") .Pattern = "【(.+)】" .Global = False Application.ScreenUpdating = False For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If .Test(c.Value) Then buf = c.Value Set Matches = .Execute(buf) c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す End If Next c Application.ScreenUpdating = True End With End Sub

  • VBA 文字列に関して

    現在 A22のセルに入力された文字列をボタンを押せば ばらばらにしてA22のセルから順番に入れるマクロを作りました (例)A22のセルに ”こんにちわ”の文字列が入っている場合 ボタン押下   ↓ A22のセル⇒こ B22のセル⇒ん C22のセル⇒に D22のセル⇒ち E22のセル⇒わ になる。 不思議なことに数字を16文字以上いれてボタンを押し文字を分離すると入力していない文字、数字が入ってしまいます。 数字だけこういう現象が発生してしまいます。 例えば "1111111111111111"と入力して文字を分離した場合 1.11111111111111E+15と個々のセルに格納されます。 原因がわかる方、教えて頂けないでしょうか? 以下がコードです。宜しくお願い致します。 Private Sub CommandButton1_Click()   Dim one As String   Dim myString As String   myString = Cells(22, 1)   numString = Len(Cells(22, 1))   If Len(myString) <= 50 Then    For i = 1 To Len(Range("A22").Value)      one = String(1, myString)      Cells(22, i) = one      myString = Replace(myString, one, "", 1, 1, vbTextCompare)    Next i   End If End Sub

  • VBA VLOOKUpについて

    VBA VLOOKUpについて すいません 例えば B1セルに名前があり Q1セルにIDがあります そこで UserFormを開いた時に表示させたい場合 どのような記述にすれば良いのでしょうか?? Dim wbMyBook As Workbook 'このブックをセット Dim w As Worksheet 'このブックのWシートをセット Dim vRet As Variant '使用するブックとシートをセット Set wbMyBook = Workbooks(ThisWorkbook.Name) Set wsKanjya = wbMyBook.Worksheets("W") vRet = WorksheetFunction.VLookup(TextBox1.Text, _ Sheets("w").Range("A:IV"), _ 17, _ False)   If vRet = "402-B" Then w.Cells(lng, 2) = TextBox1.Text Exit For End If Next lng これでは当然駄目です!! 組み合わせて使うと混乱してしまいます! 記述を教えてください。

  • vbaでの正規表現について教えてください

    「セルに入ってる値が数値ならA列からE列まで赤色にする」 を正規表現で行いたいのですがよくわかりません。 http://officetanaka.net/excel/vba/tips/tips38.htm を参考にしているのですが Sub Sample1() Dim RE, strPattern As String, r As Range Set RE = CreateObject("VBScript.RegExp") strPattern = "SUM\(" With RE .Pattern = strPattern ''検索パターンを設定 .IgnoreCase = True ''大文字と小文字を区別しない .Global = True ''文字列全体を検索 For Each r In ActiveSheet.UsedRange If .test(r.Formula) Then r.Interior.ColorIndex = 3 Next r End With Set RE = Nothing End Sub を、どう改造すれば、私のやりたい事になるのでしょうか? 【1】 まずstrPattern で、「数値ならば」はどうやればいいでしょうか? 【2】 次にtest(r.Formula)は、数式だからFormulaを使ってるのですよね? 数値を検索する場合はFormulaを何に変えればいいでしょうか? 【3】 最後に、 r.Interior.ColorIndex = 3はそのセルだけの色を変えるのですよね? A列からE列までにするにはどうすればいいでしょうか? 例えば A3セルに「1」が、A6セルに「3」が入っていたら、 A列からE列まで赤色にしたいです。

  • vbaで正規表現

    正規表現のコードなんですが、 上手く動きません。 何故でしょうか… Sub Test() Dim reg As Object Dim ans As Object Dim c As Range         Set reg = CreateObject("VBScript.RegExp")     For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))             With reg             .Pattern = "^【[(1)-(20)](\d*/\d*)"             Set ans = .Execute(c.Value)         End With                 If ans > 0 Then             If Len(ans(0).submatches(0)) > 0 Then                             Debug.Print c.Address & "|" & ans(0).submatches(0)                             End If         End If             Next     End Sub

専門家に質問してみよう