似たようなモデルでお話ししますと、今、B列に長文のデータがずらりと入っています。
この長文の中から、指定の文字列だけを取り出して、A列に移動させたいのです。
「1つの文字列を取り出す」場合は、添付の図のように、アメリカだけを取り出して、移動させたいのです。
また、「2つ以上の文字列を取り出す」場合は、必ず指定した順番で(図の例で言いますと、「アメリカ」と「アラスカ」という文字列を取り出したいのですがが、必ず先に「アメリカ」を取り出して、その後「アラスカ」を取り出して、引っ付けて、同じ行のA列のセルに移動させたい)のです。
このような処理をできるだけ早く行える関数やマクロなどご存知でしたら、教えていただけないでしょうか?
よろしくお願いします。
=IF(ISERR(FIND("アメリカ",B1)),"","アメリカ") & IF(ISERR(FIND("アラスカ",B1)),"","アラスカ")
最初の行に これを 貼り付けて それをコピーして 他の行に貼り付けたらいいでしょう。
=IF(ISERR(FIND("アメリカ",B1)),"","アメリカ") & IF(ISERR(FIND("アラスカ",B1)),"","アラスカ")
最初の行に これを 貼り付けて それをコピーして 他の行に貼り付けたらいいでしょう。
ありがとうございます!
うまくできました。
このようなマクロを組んでは如何でしょうか
Option Explicit
Sub 文字列取りだし()
'
' 文字列取りだし Macro
'
'
'取り出し対象
Dim varGet() As Variant
varGet = Range("B1:b6").Value
Dim strG As String
Dim strGet() As String
Dim lngY As Long
Dim lngYEnd As Long
lngY = LBound(varGet, 1)
lngYEnd = UBound(varGet, 1)
Do While lngY <= lngYEnd
ReDim Preserve strGet(lngY)
strG = varGet(lngY, 1)
strGet(lngY - 1) = Replace(strG, """", "")
lngY = lngY + 1
Loop
'抽出対象
Dim varChusyutu As Variant
varChusyutu = Range("c1:c6")
Dim strGet_C() As String
Dim lngY_C As Long
Dim lngYEnd_C As Long
lngY_C = LBound(varChusyutu, 1)
lngYEnd_C = UBound(varChusyutu, 1)
Do While lngY_C <= lngYEnd_C
ReDim Preserve strGet_C(lngY_C)
strGet_C(lngY_C - 1) = varChusyutu(lngY_C, 1)
lngY_C = lngY_C + 1
Loop
'抽出作業
Dim lngC_Chusyutu As Long
Dim lngC_Tango As Long
Dim strCCell As String
Dim strTCell As String
Dim lngFind As Long
Dim blnSearch As Boolean
Dim blnExist As Boolean
Dim strList() As String
ReDim strList(1)
lngC_Tango = 0
Do While lngC_Tango < 6
strTCell = strGet(lngC_Tango)
If Not Len(strTCell) = 0 Then
lngC_Chusyutu = 0
Do While lngC_Chusyutu < 6
strCCell = strGet_C(lngC_Chusyutu)
blnSearch = True
lngFind = 1
Do While blnSearch
lngFind = InStr(lngFind, strCCell, strTCell, vbTextCompare)
If Not lngFind = 0 Then
blnExist = F_HairetuKensaku(strList, strTCell)
If Not blnExist Then
ReDim Preserve strList(UBound(strList) + 1)
strList(UBound(strList) - 1) = strTCell
End If
lngFind = lngFind + Len(strTCell)
If lngFind > Len(strCCell) Then
Exit Do
End If
Else
blnSearch = False
End If
Loop
lngC_Chusyutu = lngC_Chusyutu + 1
Loop
End If
lngC_Tango = lngC_Tango + 1
Loop
'結果出力
Dim lngLen As Long
lngLen = UBound(strList)
Dim lngRowmm As Long
lngRowmm = 0
Const cOutStart As Long = 6
Dim strOutCell As String
Do While lngRowmm < lngLen
Cells(lngRowmm + cOutStart, 2).Value = strList(lngRowmm) 'B列7行目以降に出力
lngRowmm = lngRowmm + 1
Loop
MsgBox ("完了")
End Sub
Private Function F_HairetuKensaku(strList() As String, strFind As String) As Boolean
Dim blnFind As Boolean
blnFind = False
Dim lngN As Long
lngN = 0
Dim lngEnd As Long
lngEnd = UBound(strList)
Do While lngN < lngEnd
If strList(lngN) = strFind Then
blnFind = True
Exit Do
End If
lngN = lngN + 1
Loop
F_HairetuKensaku = blnFind
End Function
あれ・・・xatosiさんに教えていただいたマクロを、そのまま貼り付けて実行してみたのですが、うまくいきません(>_<)
「アメリカ」「アラスカ」は、B列から移動されることなく、そのままです。
もしよろしければ、再度ご回答いただければ幸いなのですが、どこを書き換えれば、「アメリカ」「アラスカ」といった文字列を、その文字列がある同じ行のA列もしくはC列などの空白に、移動させることができるのでしょうか?
1番 taknt さんと同様の回答ですが:
(1)取り出したい文字列を、優先順にC列以降の弟2行に記入する
例:アメリカ、アラスカの順の場合、セルC2に「アメリカ」、セルD2に「アラスカ」
(2)文字列の有無を判断する関数を、C列以降の弟3行に記述する
例:セルC3に、「=IF(ISERROR(FIND(C2,B3,1)),"",C2)」
セルD3に、「=IF(ISERROR(FIND(D2,B3,1)),"",D2)」
(1)で記入した文字列があるときはその文字列を2行目から引用表示し、無い時は空白を表示します。
(3)A列のセルに、文字列有無の結果(C列以降の3行目)を連結表示する
例:セルA3に、「=C3&D3」
(4)他の行に関数をコピーする準備として、参照セルを絶対位置指定に変える
例:セルC3を、「=IF(ISERROR(FIND($C$2,B3,1)),"",$C$2)」
セルD3を、「=IF(ISERROR(FIND($D$2,B3,1)),"",$D$2)」
(5)セルをコピーして他の行のセルに貼り付ける
例:セルC3をコピーして、C列の最終行(B列に文章が入っている最終の行)までを選択して貼り付ける
セルD3をコピーして、D列の最終行(B列に文章が入っている最終の行)までを選択して貼り付ける
セルA3をコピーして、A列の最終行(B列に文章が入っている最終の行)までを選択して貼り付ける
注意点:
1.B列の文はそのままです
「移動」よりも「抽出」のイメージです
2.同じ文字列を2箇所から取り出す場合は関数を変える必要があります
例:文「アメリカにあるアラスカは、アメリカの中でも・・・」から
アメリカ、アラスカ、アメリカと取り出したい場合
(1)は上記と同様に、セルE2に「アメリカ」と記入
(2)はセルE3に、「=IF(ISERROR(FIND(E2,B3,xxx)),"",E2)」
xxx は FIND(C2,B3,1)+LEN(C2)
URLは参照サイトです
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/itiran.html
うまくできました(^_^;)
ありがとうございます<m(__)m>
ありがとうございます!
うまくできました。