[[20170808170207]] 『指定範囲から文字列を検索して抜き出したい』(pen) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定範囲から文字列を検索して抜き出したい』(pen)

皆様

下記、ご教示ください。

A1:E5の範囲のどこかのセルに、「ABC」から始まる文字列が入力されています。

それを、さがしだして「ABC」を含む9文字を抜き出す処理をしたいです。

■やりたいこと

 ・探すセル範囲:A1:E5
 ・探す文字列:あいう
 ・抜き出したい文字列:ABC******

■その他の条件

 ・抜き出したい文字列「ABC******」が全角になっている場合は、半角にして抜き出す。
 ・抜き出す文字列の前後に他の文字列がある場合も考慮する。
 例:「注意:ABC******の内容に含む」と入力されていた場合でも、
   「ABC******」のみを抜き出したい。

探し出すところまでは、下記で対応できている状況です。

 Set ordernum = Range("A1:E5").Find(What:="ABC", MatchCase:=False, MatchByte:=False, LookAt:=xlPart)

MID関数が使えるかと思い、

 c = Mid(Range(ordernum.Address), Find("ABC", Range(ordernum.Address)), 9)
 を試しましたがだめでした。。。

お力を貸していただけますようお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


ん〜、抜き出したい文字列の条件が良く判らないのですが、こんな感じのコードで参考になりますか?
それとも、「ABC」から始まる文字列、との事ですが、ABCが途中の場合もあるのでしょうか?

 Sub test()
    Dim ordernum As Object
    Dim cw As String

    Set ordernum = Range("A1:E5").Find(What:="ABC", MatchCase:=False, MatchByte:=False, LookAt:=xlPart)
    If Not ordernum Is Nothing Then
        cw = StrConv(ordernum, vbNarrow)
        If Left(cw, 3) = "ABC" Then
            MsgBox Left(cw, 9)
        End If
    End If
 End Sub
(???) 2017/08/08(火) 17:33

???様

ご教示ありがとうございます。

■やりたいこと

 ・探すセル範囲:A1:E5
 ・探す文字列:あいう
 ・抜き出したい文字列:ABC******

と書いてしまっていましたが、

■やりたいこと

 ・探すセル範囲:A1:E5
 ・探す文字列:ABC
 ・抜き出したい文字列:ABC******

でした。すみません。

抜き出したい文字列は、あるひとつのセルの中に他の文字列に紛れてある感じです。
なので、ABC******が始まるのが何文字目か確認してそこから9文字抜き出すことがしたいです。

left(CW,3)にしてしまうと、上記の例で記載した、「注番:」と記載の場合のみしか対応できず、
もう少し長い文章が入力されてしまっている場合などに対応が出来ません。

ABC******の前に、例では「注番:」としましたが、
「ABC*********」のみが記載されている場合や、
「前回から増額ABC*********」と記載があったりとさまざまです。

また、「ABC*********」と全角で記載されている場合や、
「他の文字列ABC******他の文字列」となっている場合もあります。

?@ABC*********という全角か半角の文字列が含まれるセルを探し出す。
?A同セルにABC*********以外の文字列が入力されたいたら、排除した状態で抜き出したい。
?B「*******」の部分はユニークになるので、ABCからはj決まる9文字を抜き出すとしたい。

といった状態です。

【補足】

全体の背景は、複数シートが入っているファイルを、シートごとに分割する作業です。
その際に、各ファイルのタイトルを、日付、ABC******、件名にしたいのです。

ただ、ABC******は、各入力者が備考や注意事項も一緒に入力してしまう場合と、
注意などを書くために、セルをずらした範囲で入力している場合があり、
入力されているセルと、余計な入力を無視して、ABC******のみを取得したいというものです。

よろしくお願いいたします。

(pen) 2017/08/09(水) 09:56


丸数字は、機種依存文字であり、多くの掲示板で化けたり見えなかったりするので、使うべきではありませんよ。括弧で表記しましょう。
そして、先頭からではない、というのが正解だったのですね。ならば、見つけた後の処理を少し変えて、以下。

 Sub test()
    Dim ordernum As Object
    Dim cw As String
    Dim iw As Long

    Set ordernum = Range("A1:E5").Find(What:="ABC", MatchCase:=False, MatchByte:=False, LookAt:=xlPart)
    If Not ordernum Is Nothing Then
        cw = StrConv(ordernum, vbNarrow)
        iw = InStr(cw, "ABC")
        If 0 < iw Then
            MsgBox Mid(cw, iw, 9)
        End If
    End If
 End Sub
(???) 2017/08/09(水) 10:07

???様

丸文字の件、失礼いたしました。気をつけます。

StrConvで、半角に変換
InStrで、始まりの位置を取得

の理解であってますでしょうか。

あまり日数がないので、まずはそのままコピーしてテストしてみます。

やり方を調べていたときに、同じ関数が出てきて、試したのですが、
だめだったので、自分で書いたものと比べてみます。

また、わからないことがありましたら、質問させていただきます。
ありがとうございました。

(pen) 2017/08/09(水) 10:22


StrConv に vbNarrow を指定することで半角変換。InStr は文字列から文字列を探す関数で合ってます。 こういう関数の意味を知りたい場合は、関数をクリックしてカーソルがある状態で、F1キーを押してみてください。 それがExclが用意したヘルプであり、Webで検索するより先に、まず見るべき情報です。(とはいえ、ヘルプが充実さえしていれば、Webで使い方を調べたりする必要が無いのですけどねぇ。メーカーが駄目なおかげで、Google等が発展したという…)
(???) 2017/08/09(水) 11:20

???様

エクセルのヘルプはわかりにくい先入観があって、全く見てませんでした(汗
私の言葉も足りず、追って説明していただくようにしてしまい申し訳ありませんでした。
vbNarrow のほかにも指定できるものがあるのだろうと思って本とかも調べて、
vbNarrow で半角=StrConvで半角という表現になってました。失礼しました。

ヘルプももう少し、皆さんが教えてくださるようにわかりやすい表現や例になってくれるといいですね。。。
また色々勉強してみたいと思います。
ありがとうございました。

(pen) 2017/08/10(木) 11:29


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.