- ベストアンサー
文字列からアルファベットを抽出する方法と注意点
- 以下のVBAコードは、与えられた文字列からアルファベットを抜き出す方法を示しています。ただし、2文字以下の英字の場合は空白を返します。
- また、与えられた文の中で、最初の一塊と後から出てくる一塊がある場合、長い方を返します。
- これにより、与えられた文の中からアルファベットを抽出する際に便利に使うことができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.3です! 続けてお邪魔します。 今回は(2)の方のコードになります。 今回もアルファベットの塊は二つとしています。 Sub test2() Dim i, k As Long Dim str, buf As String For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 3) = WorksheetFunction.Substitute(WorksheetFunction.Substitute _ (WorksheetFunction.Substitute(Cells(i, 1), " ", ""), "]", ""), "[", "") For k = 1 To Len(Cells(i, 3)) str = Mid(Cells(i, 3), k, 1) If str Like "[A-z,A-z]" Then buf = buf & str End If If Len(buf) > 0 And Not str Like "[A-z,A-z]" Then Exit For Next k Cells(i, Columns.Count).End(xlToLeft).Offset(, 1) = buf buf = "" Next i For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 3) = WorksheetFunction.Substitute(Cells(i, 3), Cells(i, 4), "") For k = 1 To Len(Cells(i, 3)) str = Mid(Cells(i, 3), k, 1) If str Like "[A-z,A-z]" Then buf = buf & str End If If Len(buf) > 0 And Not str Like "[A-z,A-z]" Then Exit For Next k Cells(i, Columns.Count).End(xlToLeft).Offset(, 1) = buf buf = "" If Len(Cells(i, 4)) >= Len(Cells(i, 5)) Then Cells(i, 2) = Cells(i, 4) Else Cells(i, 2) = Cells(i, 5) End If Next i Range("C:E").Delete End Sub 以上、かなり強引なコードですが他に良い方法があればごめんなさいね。m(__)m
その他の回答 (3)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 前回投稿した者です。 乗りかかった船ですので、何とかご希望に添えれば良いのですが・・・ 無理矢理って感じの方法です。 アルファベットの塊は二つだけとしています。 まず、(1)の場合の場合のコードです。 Sub test1() Dim i, k As Long Dim str, buf As String For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 3) = WorksheetFunction.Substitute(WorksheetFunction.Substitute _ (WorksheetFunction.Substitute(Cells(i, 1), " ", ""), "]", ""), "[", "") For k = 1 To Len(Cells(i, 3)) str = Mid(Cells(i, 3), k, 1) If str Like "[A-z,A-z]" Then buf = buf & str End If If Len(buf) > 0 And Not str Like "[A-z,A-z]" Then Exit For Next k Cells(i, 2) = buf buf = "" Next i For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Len(Cells(i, 2)) < 3 Then Cells(i, 3) = WorksheetFunction.Substitute(Cells(i, 3), Cells(i, 2), "") Cells(i, 2) = "" For k = 1 To Len(Cells(i, 3)) str = Mid(Cells(i, 3), k, 1) If str Like "[A-z,A-z]" Then buf = buf & str End If If Len(buf) > 0 And Not str Like "[A-z,A-z]" Then Exit For Next k End If Cells(i, 4) = buf If Cells(i, 4) <> "" Then Cells(i, 2) = Cells(i, 4) End If buf = "" Next i Range("C:D").Delete End Sub 尚、(2)の場合のコードを載せると2000文字を超えそうなので もう一度続けて投稿します。 まずはここまで・・・m(__)m
- mu2011
- ベストアンサー率38% (1910/4994)
先ずは、頂かれたサンプルコードを理解する事が必要ではないでしょうか。 理解すれば(1)については直ぐに解が得られると思う、(2)についてソースの明示は 丸写しされるとご質問者の為になりませんからヒントを回答します。 >2文字以下の英字の時は英字がなかったものとして空白をかえしてほしい。 ⇒「If Len(buf) > 0 ~」を変更、但し、英字単語が1つの場合のみに限る >最初の一塊と後から出てくる一塊の長いほうをかえしてほしい。 ⇒文字列の組立用と設定用の2つ分のエリアを持ち、組立用文字数が設定用文字数より 大の場合に組立用から設定用にコピーする様にする この場合、前述の条件も併せた判定をすれば一石2鳥である事は言うまでもない
お礼
一身上の都合で遠方に月曜の晩から行っており、昨日戻って参りました。ご回答を頂戴致しましたのに長らくお返事できずに申し訳ございませんでした。 まったく仰る通りです。自分で勉強して書けるようになりたいですが、今回は頂戴したソースを使わせて頂きました。以後、時間が有る時には勉強して行きたいと思います。ありがとうございました。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
(1)も(2)も質問のプログラムを解析し、アルファベットの塊が2つだったら簡単にできそう。 B1セルが出る A1セルの文字列からB1セルの文字を置き換え、C1セルに代入する C1セルからアルファベットを取り出す 文字の長さを比較してどちらかを採用する 最終結果が2文字以下なら消す 付加すれば(1)になる
お礼
一身上の都合で遠方に月曜の晩から行っており、昨日戻って参りました。ご回答を頂戴致しましたのに長らくお返事できずに申し訳ございませんでした。 ご説明して頂いた理屈は理解致しましたが脳が実際のコードを書く技量がございませんでした。今後は自分でもっと考えれるように勉強したいと思います。ありがとうございました。
お礼
再三のご回答ありがとうございます。今後は自分でもこのようなVBが扱えるように時間を作って精進したいと思います。ご教示頂いたソースで作業が楽になり空いた時間に勉強したいと思いますので今後また困った時は宜しくお願い致します。 今回はまた遠方に戻る為に簡単なテストしか出来ませんでした。思った動作をしてくれませんでしたが、帰ってきたら試行錯誤しながら改造させて頂きたいと思います。ありがとうございました。