教えてください。Excelで、文字数の決まっていない文字列を抽出したいのですが、例えば、

セルA1 : プロジェクト1 簡単な文章 2352 PD_JOK
セルA2 : プロジェクト13 複雑な文章列とは決まっていない 2453 AO_JKI
・・・・・・
というセルから、
プロジェクト名から、半角数字前までの文字数が決まっていない文字列「簡単な文章」や「複雑な文章~」をセルB列に抽出する方法を教えていただきたいのですが、
そして、半角数字後の半角英字「PD_JOK」をセルC列に抽出する方法も同時に教えてください。
万単位でデータがあるので、関数を使わないと難しいです。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

こんにちは。



スペースのない場合を想定しました。
以下は、汎用性がありますので、他にも使用できます。
'-----------------------------------------------------------
Function ReReplace(myStr As String, strPattern As String)
'myStr 元の文字, strPattern 正規表現パターン
 Dim Matches As Object
 Dim Match As Object
  With CreateObject("VBScript.RegExp")
    .Pattern = strPattern
    .Global = False
  If .Test(myStr) Then
    Set Matches = .Execute(myStr)
    Set Match = Matches(0)
    If Match.SubMatches.Count > 0 Then
     ReReplace = Trim$(Match.SubMatches(0))
    Else
     ReReplace = Trim$(Match.Value)
    End If
    Set Match = Nothing
    Set Matches = Nothing
  End If
  End With
End Function

'--------------------------------------------------------
Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。
次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以上のコードを貼り付けて、Alt + Q で、画面を閉じます。


ワークシートに戻ったら、

「プロジェクト1 簡単な文章 2352 PD_JOK」
(スペースがあるなしは関係がありません)

抜き出し; 簡単な文章

=REREPLACE(A1,"\d([^\d]+)")

抜き出し; PD_JOK

=REREPLACE(A1,"\d{4}([^\d]+)$")

\d は、数字のこと
[^\d] は、非数字

なお、万単位ある場合は、コピーして、値貼り付けで、定数化して、数式は取り除いたほうが、ワークシートは軽くなります。
    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:01

データ-区切り位置でスペースを区切り文字としてバラしてからお好きなように処理すればよろしいのでは?

    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:01

区切り位置がスペース、半角英字が6桁として、異化の方法は如何でしょうか。


B1に=MID(A1,1,FIND(" ",A1,FIND(" ",A2,1)+1)-1)
C1に=RIGHT(A1,6)
    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:02

C1: =MID(A7,FIND("!",SUBSTITUTE(A7," ","

!",3))+1,99)
    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:02

最後の文字列が6桁で統一なら


C1=RIGHT(A1,6)
桁数が固定でなく、区切り位置が半角スペースの4番目の文字列なら
C1=RIGHT(A1,LEN(A1)-FIND("!",SUBSTITUTE(A1," ","!",3)))
    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:03

プロジェクト1_簡単な文章_2352_PD_JOK



↑で『_』で示した所は、半角スペースですか?もし、半角スペースと決まっているなら、

セルB1: =LEFT($A1,FIND("_",$A1,FIND("_",$A1)+1)-1)    (←『_』は半角スペース。ご質問の『_』が全角スペースなら全角スペースに置き換えてください。)

セルC1: =RIGHT($A1,LEN($A1)-FIND("_",$A1,FIND("_",$A1,FIND("_",$A1)+1)+1))    (同上)

『find("文字列",A1,文字数)』は、セルA1の左端から数えた『文字数』で示された文字位置から『文字列』を探して、見つかると、その『文字列』の左端から数えた文字数を返します。(文字数が1のときは省略可)
    • good
    • 0
この回答へのお礼

助かりました。ありがとうございました。遅くなってすいませんでした。

お礼日時:2006/08/29 08:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QA列とB列の重複を抽出したいのですがA列とB列の値は一部だけ同じ文字です。ご教示お願いします。

エクセル初心者です。重複を見つけるのが仕事です。いろいろやってみたのですがうまくできません。
お知恵をお貸しください。

A列には企業名が入力されています。
B列にも企業名が入力されていますが全く同じ文字ではないのです。

たとえばこういうことです。
A1 (有)雪見酒      B1  雪見
A2 株式会社豪雪地帯   B2 (株)豪雪地帯
A3 ゆきかき本舗     B3 (有)ゆきかき本舗

A列にある企業名とB列にある企業名が同じであればセルを塗りつぶすか○を表示させるように
したいのです。
重複を見つけるのが目的なので、ほかの方法でもかまいません。
すみません、A列のセルとB列のセルが全く同じ名前ならば重複が見つけられたのですが
ここから先がどうしてもわからないのです。。。
申し訳ありませんがどうか教えてください。。。

Aベストアンサー

No4です。以下のマクロを標準モジュールへ登録してください。
--------------------------------------------------
Option Explicit
Public Sub 重複チェック()
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim nameT1() As String
Dim nameT2() As String
Dim t1, t2 As Variant
t1 = Time
maxrow1 = Cells(Rows.Count, "A").End(xlUp).row '最大行取得
maxrow2 = Cells(Rows.Count, "B").End(xlUp).row '最大行取得
ReDim nameT1(maxrow1)
ReDim nameT2(maxrow2)
Range("C1:" & "D" & maxrow2).Value = ""
Call makeTable(nameT1, "A", maxrow1)
Call makeTable(nameT2, "B", maxrow2)
For row1 = 1 To maxrow1
For row2 = 1 To maxrow2
If Cells(row2, "C") = "" Then
If Mymatch(nameT1(row1), nameT2(row2)) = True Then
Cells(row2, "C").Value = "○"
Cells(row2, "D").Value = row1
End If
End If
Next
Next
t2 = Time
MsgBox ("チェック完了 処理時間=" & Minute(t2 - t1) & "分" & Second(t2 - t1) & "秒")
End Sub
'余分な文字を削除した結果をテーブルに格納する
Private Sub makeTable(ByRef nameT() As String, ByVal col As String, ByVal maxrow As Long)
Dim row As Long
Dim ary As Variant
Dim name As String
Dim i As Long
ary = Array("㈱", "(株)", "株式", "(有)", "有限", "会社")
For row = 1 To maxrow
name = Cells(row, col).Value
For i = 0 To UBound(ary)
name = Replace(name, ary(i), "")
Next
nameT(row) = name
Next
End Sub
'企業名が一致かどうか判定する
Private Function Mymatch(ByVal name1 As String, ByVal name2 As String) As Boolean
Mymatch = False
Dim pos As Variant
pos = InStr(1, name1, name2, vbTextCompare)
If pos > 0 Then Mymatch = True
End Function
-----------------------------------------------------
一致の精度が悪ければその旨補足してください。
(一致すべきものが一致しない、一致してはいけないものが一致している)
100%解決できる保証はありませんが、多少のチューニングは行います。

No4です。以下のマクロを標準モジュールへ登録してください。
--------------------------------------------------
Option Explicit
Public Sub 重複チェック()
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim nameT1() As String
Dim nameT2() As String
Dim t1, t2 As Variant
t1 = Time
maxrow1 = Cells(Rows.Count, "A").End(xlUp).row '最大行取得
maxrow2 = Cells(Rows.Count, "B").End(xlUp).row '最大行取得
ReDim ...続きを読む

QエクセルのA列とB列で重複するレコードのみを抽出して別の列に表示させた

エクセルのA列とB列で重複するレコードのみを抽出して別の列に表示させたい。

エクセルのA列に約1,000行くらいのデータが有ります。
このA列内で重複レコードがあります。
B列に約1,000行くらいのデータが有ります。
B列内でも重複レコードが有ります。
この条件の中で

(1)A列にもB列にあるデータすべて
(2)A列にしかないデータすべて
(3)B列にしかないデータすべて
を抽出したいのですが、どんな方法がありますか?
それで
(1)をC列
(2)をD列
(3)をE列
に並べて表示させたいです。
さらに抽出されたデータで重複レコードの場合は1件のみで表示したいです。
複数の操作を繰り返すのではなく
C,D,E列に式を入れるだけで済ませる事は可能でしょうか?
よろしくお願いします。


   A   B    C   D   E
1-001-002--001--004--007
2-002-002--002--006--008
3-001-001--005--010
4-005-007
5-001-005
6-004-005
7-004-008
8-010-007
9-006-007

A列には001が3個、002が1個、005が1個有ります。
B列には001が1個、002が2個、005が2個有ります。
A列にもB列にも有るのは、001と002と005ですから
これがC列に表示されます。
でそれぞれA列にもB列にも複数有りますが、1個として判定なので

よって、C列には
001
001
001
001
002
002
005
005
と表示ではなく
001
002
005
と表示したい。

次にD列はA列に有る物だけですから
004
006
010
となります。B列には004は2個有りますが同じ値なので
004
004
006
010
では無く004は1個の表示です。

E列はB列のみのデータなので
007
008
です。
同じくB列には007が3個有りますが1個ともなします。
007
007
007
008
では無く
007
008
です。

エクセルのA列とB列で重複するレコードのみを抽出して別の列に表示させたい。

エクセルのA列に約1,000行くらいのデータが有ります。
このA列内で重複レコードがあります。
B列に約1,000行くらいのデータが有ります。
B列内でも重複レコードが有ります。
この条件の中で

(1)A列にもB列にあるデータすべて
(2)A列にしかないデータすべて
(3)B列にしかないデータすべて
を抽出したいのですが、どんな方法がありますか?
それで
(1)をC列
(2)をD列
(3)をE列
に並べて表示...続きを読む

Aベストアンサー

No.2です!
たびたびすみません。
投稿した後で質問文を読み返してみるとデータが約10000行あるということなので、
前回の数式の「1000」の部分を全て「10000」に変更してみてください。

そして余計なお世話かもしれませんが、10000行までオートフィルでコピーするのは大変でしょうから、
当方使用のExcel2003の場合ですが
もう1列A列に列を挿入します。
A2セルに「1」を入力後、A2セルをアクティブにします 
→ メニュー → 編集 → フィル → 連続データの作成 → 「列」を選択 → 「停止値」に「10000」としてOK
そして、B2~D2セルに作業列が移動しているはずですので、B2~D2セルを範囲指定し、
D2セルのフィルハンドルの(+)マークでダブルクリック
10000行目までコピーできますが、少し時間がかかると思います。
最後にA列全てを削除します。

以上、何度もごめんなさいね。m(__)m

QExcel関数  A列の値とC列の値の間であればD列の値が抽出される関数

いつもお世話になっております。
F1にある数値を入れ、その数値が一覧表の中の範囲にマッチすればその数値を集計表シートのセルG1に反映したいのです。
例えば
A B C D E F G
1    1 ~ 1000  70 1200 ?
2  1001 ~ 1500  85
3  1501 ~ 2000  92
というような表があるとします。
F1に「1200」と入力するとG1には「85」と出るようにするにはG1にどのような関数を入れたらいいでしょうか。
必要があれば左の数値と~、右の数値は便宜上3列に分けて入力しています。
宜しくお願い致します。

Aベストアンサー

VLOOKUP関数でできます。

求める数値がD列にあるとします。
F1の値を $A$1:$D$3の範囲の左端の列から検索して、D列(検索範囲の4列目)の値を求めます。
セルG1に
=VLOOKUP(F1,$A$1:$D$3,4,TRUE)

一覧表を分かりやすくするために3列に分けているのだと思いますが、
値を求めるだけなら、B列、C列の「~1000」などは不要です。
B列、C列を削除して、「70,85,92・・・」をB列にしておけば
=VLOOKUP(F1,$A$1:$B$3,2,TRUE)
で求められます。

VLOOKUP関数をヘルプで参照していただくとわかると思いますが、
>TRUE を指定するか省略すると、検索値 が見つからない場合に、検索値 未満で最も大きい値が使用されます。
検索値が1200の場合、1200はA列にありませんが、1200未満でもっとも大きい値「1001」に対応する「85」が得られます。

Qエクセル 関数 1と入力されたセルの隣の列の値から、一つ前に1と入力されたセルの隣の列の値の引き算

1と入力されたセルの隣の列の値から、一つ前に1と入力されたセルの隣の列の値の引き算をしたいです。
具体的に、添付した画像の表で説明します。
A列は、連続した数値が入っています。
B列には、ところどころに、1が入力されています。(空白のセルが多いです。)
C列には、B列で、1と入力されたセル(例:B6)と同じ行のA列のセル(A6)の値から、B列で、一つ前に1と入力されたセル(B2)と同じ行のA列のセル(A2)の値の引き算をしたいです。
いまのところ、C列の結果は、D列にしめしたような計算で、ひとつずつ計算しています。

C列を、自動的におこなってくれるように工夫したいのですが、どんな関数をつかったらよいかわからないので、教えてほしいです。
補足ですが、行の入れ替え(サイズを変える、等)はしたくないです。(列の挿入はもちろんOKです。)

どうぞよろしくお願いします。

Aベストアンサー

D列を作業用に使用します。D列を最終的には見えないように設定してください。(文字色を白にするなど)
D1セルに「=A1*B1」
D2セルに「=IF(B2<>1,D1,A2*B2)」
D3セルより下はD2セルをコピー
C1セルに「=IF(D1=0,"",D1)」
C2セルに「=IF(D1=D2,"",D2-D1)」
C3セルより下はC2セルをコピー

Qエクセル セルの結合(A列,B列→A列に結合)の操作

現在、大量の人名を編集しています。

A列に名字、B列に名前が入力されている状態なのですが、A列に名字と名前を一緒に表示させるためには、どのようにすればよいか教えて下さい。

Aベストアンサー

C列に「名字+氏名」を表示させるなら、C1セルに
 =A1&B1
と入力して、下方向にコピーすれば良いです。

名字が入力されているA列の値を「名字+氏名」で置き換えるのは関数ではできません。
どうしても置き換えたいなら上記で説明した方法で表示された「名字+名前」をコピーして、A1に「編集」→「形式を選択して貼り付け」→「値」で貼り付けるという方法はありますが…


人気Q&Aランキング

おすすめ情報