- ベストアンサー
文字と数値が混在する文字列で先頭のn文字のみ切り出す関数
おせわになっています AM23156 AB01567 C155901 M556348 BD65478 このような文字列データがあるのですが 先頭がアルファベット1文字の場合その文字のみを アルファベット2文字の場合その2文字を切り出したいのです C155901の場合「C」のみを取り出す AM23156の場合「AM」を取り出す このようにする関数を教えて下さい LEFT関数で取り出すのまではわかるのですが その後をどのようにするのか 見当がつきません win XP エクセル2003
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#3>単にA1にあるデータがそのまま表示されるだけです。 A1にある数字が半角なら =LEFT(A1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1) としてみて下さい。
その他の回答 (6)
- zap35
- ベストアンサー率44% (1383/3079)
#01です。先頭に英文字(全角半角混在可、大文字小文字混在可)以外の文字が入っていると結果は空白になりますが、そんなことはありませんか? 確認のため =AZout(A1) を入力したときに、必ず何らかの文字列が返るようにしてみました。これでも空白の結果になるようなら、ユーザ関数が起動されていない可能性が高いです。 その時はマクロを一旦全部削除してもう一度ペーストした上で、再度ユーザ関数式を入力してみてください。 Function AZout(ByVal Target As Range) As String Dim RE, strPattern, repPattarn, trgStr As String Dim mchItem Set RE = CreateObject("VBScript.RegExp") strPattern = "^[A-Z,A-Z]+" On Error Resume Next With RE .Pattern = strPattern ''検索パターンを設定 .IgnoreCase = True ''大文字と小文字を区別しない .Global = True ''文字列全体を検索 Set mchItem = .Execute(Target.Value) If mchItem.Count > 0 Then AZout = mchItem(0).Value Else '確認用に行追加 AZout = "×Not hit" '確認用に行追加 End If End With Set RE = Nothing End Function 原因が判明したら Else AZout = "×Not hit" の二行は削除してください。
お礼
お礼が遅れて申し訳ありませんでした もう一度チャレンジしてみます。 勉強のため構文を確認しながら実行してみます ありがとうございました
- zap35
- ベストアンサー率44% (1383/3079)
#01です >#NAME?になって思い通りに結果が出ません そうですか。私の環境では動きましたが… #01と#02の変更点は以下の1行のみです。 strPattern = "^[A-Z,A-Z]+" この行だけ差し替えて下さい
お礼
面倒な事ばかりで申し訳ありません 新規Bookでコピー・ペーストしてみたのですが 今度は、エラーではなく結果は空白になってしまいました。 編集画面は確かに”=AZout(A1)”などとなっていますが肝心のセルは空白になっています 原因がわかりません もし時間があれば教えてください
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#4>この配列関数をコピーするにはどうすればよかったでしょうか この場合、普通にコピーすればいいです。
お礼
>この場合、普通にコピーすればいいです。 わたしのPCでは、下の行にドラッグしてコピーしたのですが 数式は相対的に変更されているにも関わらず 表示はA1セルを参照したままです。 当該セルを一度編集状態にして「ENTER」を押すと正常な表示になりますが、 時間が掛かってしかたがありません AA123456 AA AB236547 AA a0654782 AA : : AA123456 AA AB236547 AB <--このセルを編集後ENTERで直る a0654782 AA このような状態です。 どうすれば直るのか教えてくださいお願いいたします
補足
すみませんでした 私のエクセルがどうしたことかオプションの計算方法が手動になっていました 再計算を自動にすれば解決しました しかしなぜ手動になったのか不思議です。 ありがとうございました
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
A1にデータが有る場合 =LEFT(A1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1) みたいな感じで 数字に半角数字がある場合は、追加して下さい。
お礼
ありがとうございます。 上記の関数をコピー・ペーストしたのですが 単にA1にあるデータがそのまま表示されるだけです。 コピー・ペーストの仕方がわるいのでしょうか 教えてください
- zap35
- ベストアンサー率44% (1383/3079)
#01です。 先頭の全角、半角混在文字列を抽出するようにしました。 関数名は AZout2 に変更しています。 >既存の関数式を使用する場合 とはどのような意味か十分には理解できていませんが、私のPC環境では1250行を一括で処理して再計算に10秒くらいかかりました。目安にして下さい。 Function AZout2(ByVal Target As Range) As String Dim RE, strPattern, repPattarn, trgStr As String Dim mchItem Set RE = CreateObject("VBScript.RegExp") strPattern = "^[A-Z,A-Z]+" On Error Resume Next With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set mchItem = .Execute(Target.Value) If mchItem.Count > 0 Then AZout2 = mchItem(0).Value End If End With Set RE = Nothing End Function
お礼
ありがとうございます。 上記のマクロをコピー・ペーストして =AZout2(A1) で関数として使用してみたのですが、 #NAME?になって思い通りに結果が出ません どこがわるいのでしょうか 申し訳ありません助けてください それと >既存の関数式を使用する場合 ではなく >既存の関数式を駆使して使用する場合 です 文字列関数とIFやANDなどを駆使してと言うことで・・・・ 説明不足ですみません
- zap35
- ベストアンサー率44% (1383/3079)
VBAで実現するなら以下のマクロになります。ユーザ定義関数にしましたので =AZout(A1) のように入力すれば、先頭の全角英文字列のみを抽出します。 マクロはALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。 Function AZout(ByVal Target As Range) As String Dim RE, strPattern, repPattarn, trgStr As String Dim mchItem Set RE = CreateObject("VBScript.RegExp") strPattern = "^[A-Z,a-z]+" On Error Resume Next With RE .Pattern = strPattern ''検索パターンを設定 .IgnoreCase = True ''大文字と小文字を区別しない .Global = True ''文字列全体を検索 Set mchItem = .Execute(Target.Value) If mchItem.Count > 0 Then AZout = mchItem(0).Value End If End With Set RE = Nothing End Function
補足
早速ありがとうございます 好意に甘えついでに、質問させてください >先頭の全角英文字列のみを抽出します。 半角英文字列や全角と半角が混ざっている文字列の場合 どの部分を修正すればよいのでしょうか また既存の関数式を使用する場合とでは切り出す処理速度は変わらないのでしょうか なにぶん、データ行が数1000行あるもので心配です 初歩的な質問ですみません
お礼
ありがとうございました 出来ました。 質問させてください この配列関数をコピーするにはどうすればよかたでしょうか 何か約束事があったような気がするのですが よろしくお願いします。