[[20030219141853]] 『B列にアルファベットだけを抜き出したい』(名無し134) ページの最後に飛ぶ

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

 

『B列にアルファベットだけを抜き出したい』(名無し134)

A列に全角とアルフアベットを使って文字を入力しましたが、B列にはアルファベットの文字だけを抜き出したい場合はどうしたら良いでしょうか?ちなみにアルファベットは行によって入力しているところと、してたとしても位置はバラバラになっています。


 みやほりんが 未解決ログ解消を目的に 2005/3/8 15:42 レス上げしました。 
余裕のある方はレスお願いします。
仮定として「アルファベット」は「半角アルファベット」と解釈し、
A-Z および、a-zに限定することとします。
また、A列一列に「全角文字」と「半角アルファベット」がランダムな文字位置へ混在入力され、
その中から「半角アルファベット」をB列の同じ行へ抽出するものとします。
(みやほりん) 


 ユーザー定義関数ですが。
 対象セルがA1として、 =MyStr(A1) として使います。
 
Public Function MyStr(Target As Range) As String
MYLEN = Len(Target.Value)
    For i = 1 To MYLEN
        MyText = Mid(Target.Value, i, 1)
        MyCode = Asc(MyText)
        Select Case MyCode
            Case 65 To 90, 97 To 122
                MyVal = MyVal & MyText
        End Select
    Next i
    MyStr = MyVal
End Function

 (川野鮎太郎)ていうか、2年前のを掘り出しですか(^_^A;

 爆睡しておりました。。というわけで、、頭がまわっていません。。
さっきの使いまわしですみません。。(;^_^A あせあせ・・・
Option Explicit
Sub てすと()
Dim MyDic As Object
Dim MyA As Variant, MyAry() As Variant
Dim MyStr As String
Dim i As Long, n As Long, MyTimer As Single
Set MyDic = CreateObject("Scripting.Dictionary")
MyTimer = Timer
For i = 65 To 90
    MyStr = Chr(i)
    If Not MyDic.Exists(MyStr) Then MyDic.Add MyStr, Empty
Next
For i = 97 To 122
    MyStr = Chr(i)
    If Not MyDic.Exists(MyStr) Then MyDic.Add MyStr, Empty
Next
With Sheets("Sheet1")
    MyA = .Range("A1", .Range("A65536").End(xlUp)).Value
    ReDim MyAry(1 To UBound(MyA, 1), 1 To 1)
    For i = 1 To UBound(MyA, 1)
        For n = 1 To Len(MyA(i, 1))
            MyStr = Mid(MyA(i, 1), n, 1)
            If MyDic.Exists(MyStr) Then MyAry(i, 1) = MyAry(i, 1) & MyStr
        Next
    Next
    .Range("B:B").ClearContents
    .Range("B1").Resize(UBound(MyA, 1)).Value = MyAry
End With
MyTimer = Timer - MyTimer
MsgBox Format(MyTimer, "#,##0.00") & "処理完了!!"
Erase MyA, MyAry
Set MyDic = Nothing
End Sub
(SoulMan)

 鮎太郎さんとSoulManさんにお任せの形になってしまいましたね。
実は文字列操作関数で出来るのでは?と考え格闘していましたが、
「文字列から数値項目だけを抜き出す」場合と違って
ひとつの数式ではなかなかうまくいかないようです。
作業列をたくさん使えばもちろん可能なのですが、
=IF(JIS(MID($A1,COLUMN(A1),1))=MID($A1,COLUMN(A1),1),"",MID($A1,COLUMN(A1),1))
VBAでも作業列を使うやり方でも文字コードをひとつずつチェックするのが
確実な感じですね。(みやほりん)

 全列作業列にして、半角文字列だけ抜き出すものです。試しに書いてみました。       (SUMIF)
 C1に=LEFT(A1,LENB(LEFT(A1))=1)、
 D1に=C1&MID($A1,COLUMN(B1),LENB(MID($A1,COLUMN(B1),1))=1)として、D1をIV1までフィルドラッグ。
 B1に=IV1です。

 おぉ〜 綺麗な式だ!!

 んだば、σ(^o^;)も
 文字数限定!4文字!! で、作業列1つ
 と、回答とは言えない代物ですが・・・(T_T)

 C1 =SUBSTITUTE(SUM(((((CODE(MID(ASC(A1),ROW($A$1:$A$4),1)))>=65)*
(CODE(MID(ASC(A1),ROW($A$1:$A$4),1))<=122))-(((CODE(MID(ASC(A1),
ROW($A$1:$A$4),1)))>90)*(CODE(MID(ASC(A1),ROW($A$1:$A$4),1))<97)))*
(CODE(MID(ASC(A1),ROW($A$1:$A$4),1)))*({0.01;0.00001;0.00000001;0.00000000001})),".","")
 配列数式で

 B1 =IF(C1="0","",SUBSTITUTE(CHAR(IF(OR(ISERR(--MID(C1,1,3)),
OR(MID(C1,1,3)="000",MID(C1,1,3)="")),32,--MID(C1,1,3)))&
CHAR(IF(OR(ISERR(--MID(C1,4,3)),OR(MID(C1,4,3)="000",
MID(C1,4,3)="")),32,--MID(C1,4,3)))&CHAR(IF(OR(ISERR(--MID(C1,7,3)),
OR(MID(C1,7,3)="000",MID(C1,7,3)="")),32,--MID(C1,7,3)))&
CHAR(IF(OR(ISERR(--MID(C1,10,3)),OR(MID(C1,10,3)="000",
MID(C1,10,3)="")),32,--MID(C1,10,3)))," ",""))

 (キリキ)

 キリキさんのがヒントになりました。
5文字までの文字列にしか対応しませんが。
作業列C1へ配列数式で。

=IF($A1="","",TEXT(SUM(IF((CODE(RIGHT(",,,,,"&$A1,ROW($1:$5)))>64)*(CODE(RIGHT(",,,,,"&$A1,ROW($1:$5)))<91)+(CODE(RIGHT(",,,,,"&$A1,ROW($1:$5)))>96)*(CODE(RIGHT(",,,,,"&$A1,ROW($1:$5)))<123),CODE(RIGHT(",,,,,"&$A1,ROW($1:$5)))*10^((ROW($1:$5)-1)*3),44*10^((ROW($1:$5)-1)*3))),REPT("0",15)))

 C1へ

=IF($A1="","",SUBSTITUTE(CHAR(MID($C1,1,3))&CHAR(MID($C1,4,3))&CHAR(MID($C1,7,3))&CHAR(MID($C1,10,3))&CHAR(MID($C1,13,3)),",",""))

(みやほりん)


 そっか〜 文字数限定じゃなくても、増やしちゃって統一にしちゃえばいいんだ〜
 CHAR関数は、文字の先頭のに対するコードなんですよね〜
 頭に、TEXT関数で",,,,,"をつけちゃう、、、
 考えつかなかった・・・

 さらに、みやほりんさんはσ(^o^;)が、当初考えていた10の乗数でしている。
 σ(^o^;)は、どうしたら出来るかが考えつかず、小数点以下でやりました。
 そうか!配列に3を掛けたものを10に乗数としてあげればよかったのか〜
 〆(.. )メモメモ
 かなり勉強になりました!
 ありがとうございます。
 (キリキ)またこういった企画が欲しい〜☆

 調子に乗って、10文字まで対応版。
作業列を一つ使うのは相変わらずですが。
C1へ Shift+Ctrl+Enterの配列数式

=IF($A1="","",TEXT(SUM(IF((CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($6:$10)))>64)*(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($6:$10)))<91)+(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($6:$10)))>96)*(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($6:$10)))<123),CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($6:$10)))*10^((ROW($1:$5)-1)*3),44*10^((ROW($1:$5)-1)*3))),REPT("0",15))&TEXT(SUM(IF((CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($1:$5)))>64)*(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($1:$5)))<91)+(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($1:$5)))>96)*(CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($1:$5)))<123),CODE(RIGHT(",,,,,,,,,,"&$A1,ROW($1:$5)))*10^((ROW($1:$5)-1)*3),44*10^((ROW($1:$5)-1)*3))),REPT("0",15)))

B1へ

=IF($A1="","",SUBSTITUTE(CHAR(MID($C1,1,3))&CHAR(MID($C1,4,3))&CHAR(MID($C1,7,3))&CHAR(MID($C1,10,3))&CHAR(MID($C1,13,3))&CHAR(MID($C1,16,3))&CHAR(MID($C1,19,3))&CHAR(MID($C1,22,3))&CHAR(MID($C1,25,3))&CHAR(MID($C1,28,3)),",",""))

 この調子なら15文字までなら&でつなげていけばなんとか出来そう。
(数式の文字列長は1024文字が限界。上記C1の式で621文字)
",,,,,,,,,,"は","を抽出対象外としているので使っていますが、
「半角文字だけ抜き出す」という条件なら「",,,,,,,,,,"&」の部分と
SUBSTITUTE関数の検索文字列","を任意の全角文字で代替。
その場合は全半角の判別部分がもう少し簡潔に書くことができると思うので、
20文字くらいなら可能かもしれません。
目が疲れたのでこれ以上やりませんが・・・(笑)
ただし、数式が長い、わかりにくい、作業列を使う、
配列を多用しているので数が多いと再計算に時間がかかるなどの点から
実用上はどうか? やはり VBAでの解決がスマートかなぁ。
 
>またこういった企画が欲しい〜☆
そのうち掘り出します。
(みやほりん)

 みやほりんさん、お疲れ様でした〜

 >実用上はどうか? やはり VBAでの解決がスマートかなぁ。
 (ー_ー;)う〜ん。 たしかに、、、

 でもσ(^o^;)は、またまたエクセルが好きになりました〜♪
 (キリキ)

コメント返信:

[ 一覧(最新更新順) ]


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