Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1573 / 13644 ツリー ←次へ | 前へ→

【73420】文中の数字を判定するには? コンソール 13/1/6(日) 1:24 質問[未読]
【73421】Re:文中の数字を判定するには? UO3 13/1/6(日) 7:35 発言[未読]
【73425】Re:文中の数字を判定するには? コンソール 13/1/7(月) 13:15 お礼[未読]
【73426】Re:文中の数字を判定するには? UO3 13/1/7(月) 14:08 発言[未読]
【73427】Re:文中の数字を判定するには? コンソール 13/1/7(月) 17:34 お礼[未読]
【73422】Re:文中の数字を判定するには? UO3 13/1/6(日) 7:45 発言[未読]

【73420】文中の数字を判定するには?
質問  コンソール  - 13/1/6(日) 1:24 -

引用なし
パスワード
   マクロ初心者です。

お世話になります。
早速ですが、質問させて頂きます。

発生件数を計算したいのですが、
場合によっては文中の数字が件数が変動します。

下記は例になります。
-------------------------------------
株式会社○○○
12:00 TYTYにてアラーム〜が発生。
12:10 チケット発行。
12:12 SEへ連絡。

株式会社△△△
HTHTにてアラーム〜が2件発生。
13:10 チケット発行。
13:12 SEへ連絡。
IKUKにてアラーム〜が8件発生。
15:00 チケット発行。
15:05 SEへ連絡。

営業所×××
10:10 LKLKにてアラーム〜が発生。
10:11 JKJKにてアラーム〜が発生。
10:12 CEへ連絡。

-------------------------------------
B列に一行毎に記載されています。
上記では13件発生したことになります。


文中の○件発生+発生をキーワードに件数を合計することは
できるでしょうか。

B列にて一行毎に〜が発生。を含む場合で検索し、該当したら
C列に1を入力して最終的に合計しようと考えたのですが、
文中の数字が記載された場合の処理が考えられません。
アドバイスをお願いします。

【73421】Re:文中の数字を判定するには?
発言  UO3  - 13/1/6(日) 7:35 -

引用なし
パスワード
   ▼コンソール さん:

おはようございます

○○○発生 と nnn件発生 をわけてチェックした方がいいかとは思うのですが
横着に、あわせた形でチェックしています。(まぁ、問題ないとは思いますが)
C列に各インシデント毎の件数をセット。
合計を最後にメッセージで表示します。

正規表現というものを使っていますので、少しわかりにくいかもしれませんが。

Sub Sample()
  Dim re As Object
  Dim ms As Object
  Dim m As Object
  Dim c As Range
  Dim cnt As Long
  Dim d As String
  Dim x As Long
  
  Set re = CreateObject("VBSCript.RegExp")
  re.Pattern = "\d*件{0,1}発生"
  
  Columns("C").ClearContents
  
  For Each c In Range("B1", Range("B" & Rows.Count).End(xlUp))
    If Len(c.Value) > 0 Then
    
      Set ms = re.Execute(c.Value)
      If ms.Count > 0 Then
        d = ms.Item(0)
        x = Val(d)
        If x = 0 Then x = 1
        c.Offset(, 1).Value = x
        cnt = cnt + x
      End If
    
    End If
  Next
  
  MsgBox "発生件数は " & cnt & " 件でした"
  
End Sub

【73422】Re:文中の数字を判定するには?
発言  UO3  - 13/1/6(日) 7:45 -

引用なし
パスワード
   ▼コンソール さん:

補足です。
該当の文字列が文中に1ヶ所という前提です。
複数有った場合、最初のものを採用しています。

IKUKにて○○が10件発生。またアラーム〜が9件発生。

この場合、10件となります。
19件にしたいということなら対応はできます。

また、2種類の要素をあわせて1回でチェックしています。

IKUKにて発生。内容としてはアラーム〜が9件発生。

この場合、文としては最初の 発生 のみを抽出しますので 1 件になります。
これは 9 件が正しい ということなら、ここも(少し面倒ですが)対応できます。

【73425】Re:文中の数字を判定するには?
お礼  コンソール  - 13/1/7(月) 13:15 -

引用なし
パスワード
   ▼UO3 さん:

おはようございます。
返信ありがとうございました。

実際に試してみまして、見事に件数がカウントされていました。

>  re.Pattern = "\d*件{0,1}発生"
この部分で{0,1}がどういった表現なのでしょうか。
よく理解できませんでした。

頭の中ではこうすればいいのかなぁとか創造は出来るのですが、
実際に表現してみるという事聞いてくれなくて苦労しています。
今後も勉強に励みたいと思います。
ありがとうございました。


>▼コンソール さん:
>
>おはようございます
>
>○○○発生 と nnn件発生 をわけてチェックした方がいいかとは思うのですが
>横着に、あわせた形でチェックしています。(まぁ、問題ないとは思いますが)
>C列に各インシデント毎の件数をセット。
>合計を最後にメッセージで表示します。
>
>正規表現というものを使っていますので、少しわかりにくいかもしれませんが。
>
>Sub Sample()
>  Dim re As Object
>  Dim ms As Object
>  Dim m As Object
>  Dim c As Range
>  Dim cnt As Long
>  Dim d As String
>  Dim x As Long
>  
>  Set re = CreateObject("VBSCript.RegExp")
>  re.Pattern = "\d*件{0,1}発生"
>  
>  Columns("C").ClearContents
>  
>  For Each c In Range("B1", Range("B" & Rows.Count).End(xlUp))
>    If Len(c.Value) > 0 Then
>    
>      Set ms = re.Execute(c.Value)
>      If ms.Count > 0 Then
>        d = ms.Item(0)
>        x = Val(d)
>        If x = 0 Then x = 1
>        c.Offset(, 1).Value = x
>        cnt = cnt + x
>      End If
>    
>    End If
>  Next
>  
>  MsgBox "発生件数は " & cnt & " 件でした"
>  
>End Sub

【73426】Re:文中の数字を判定するには?
発言  UO3  - 13/1/7(月) 14:08 -

引用なし
パスワード
   ▼コンソール さん:

>>  re.Pattern = "\d*件{0,1}発生"
>この部分で{0,1}がどういった表現なのでしょうか。
>よく理解できませんでした。

こんにちは。
うまく動いたようで、安心しました。
申し上げましたように、ちょっと【横着】なパターンコードです。

\d*   連続した数字。なくてもいい。
件{0,1} 1文字または【0文字】 の "件" つまり 件がなくてもいい。
発生   文字通り "発生" でおわるもの。

ということなので、たとえば
12345発生 という文字列の場合、12345件とみなされてしまうという【手抜き】です。

本来なら \d+件発生 (必ず数字があって、その後、"件発生" が続く)で抽出。
もしなければ、今度は 発生 で抽出。
こういったことをしなければいけないのでしょうが。

【73427】Re:文中の数字を判定するには?
お礼  コンソール  - 13/1/7(月) 17:34 -

引用なし
パスワード
   ▼UO3 さん:

お疲れ様です。

返信ありがとうございます。

なるほど、{0,1}の部分がうまく理解出来なかったのですが、
理解出来てスッキリしました。
下記の条件であれば、異常事態がなければ正常に認識してくれると思います。
とても参考になりました。
ありがとうございます。

>▼コンソール さん:
>
>>>  re.Pattern = "\d*件{0,1}発生"
>>この部分で{0,1}がどういった表現なのでしょうか。
>>よく理解できませんでした。
>
>こんにちは。
>うまく動いたようで、安心しました。
>申し上げましたように、ちょっと【横着】なパターンコードです。
>
>\d*   連続した数字。なくてもいい。
>件{0,1} 1文字または【0文字】 の "件" つまり 件がなくてもいい。
>発生   文字通り "発生" でおわるもの。
>
>ということなので、たとえば
>12345発生 という文字列の場合、12345件とみなされてしまうという【手抜き】です。
>
>本来なら \d+件発生 (必ず数字があって、その後、"件発生" が続く)で抽出。
>もしなければ、今度は 発生 で抽出。
>こういったことをしなければいけないのでしょうが。

1573 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free