あなたの習慣について教えてください!!

おせわになっています

AM23156
AB01567
C155901
M556348
BD65478

このような文字列データがあるのですが
先頭がアルファベット1文字の場合その文字のみを
アルファベット2文字の場合その2文字を切り出したいのです

C155901の場合「C」のみを取り出す
AM23156の場合「AM」を取り出す

このようにする関数を教えて下さい
LEFT関数で取り出すのまではわかるのですが
その後をどのようにするのか
見当がつきません

win XP エクセル2003

A 回答 (7件)

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行あるもので心配です
初歩的な質問ですみません

補足日時:2006/09/23 14:12
    • good
    • 0

#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
    • good
    • 0
この回答へのお礼

ありがとうございます。

上記のマクロをコピー・ペーストして =AZout2(A1)
で関数として使用してみたのですが、

#NAME?になって思い通りに結果が出ません

どこがわるいのでしょうか

申し訳ありません助けてください

それと
>既存の関数式を使用する場合  ではなく
>既存の関数式を駆使して使用する場合 です
 文字列関数とIFやANDなどを駆使してと言うことで・・・・

説明不足ですみません

お礼日時:2006/09/23 19:43

A1にデータが有る場合


=LEFT(A1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1)
みたいな感じで
数字に半角数字がある場合は、追加して下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。

上記の関数をコピー・ペーストしたのですが
単にA1にあるデータがそのまま表示されるだけです。

コピー・ペーストの仕方がわるいのでしょうか
教えてください

お礼日時:2006/09/23 19:48

#3>単にA1にあるデータがそのまま表示されるだけです。


A1にある数字が半角なら
=LEFT(A1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1)
としてみて下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました
出来ました。

質問させてください
この配列関数をコピーするにはどうすればよかたでしょうか

何か約束事があったような気がするのですが
よろしくお願いします。

お礼日時:2006/09/23 21:43

#4>この配列関数をコピーするにはどうすればよかったでしょうか


この場合、普通にコピーすればいいです。

この回答への補足

すみませんでした
私のエクセルがどうしたことかオプションの計算方法が手動になっていました

再計算を自動にすれば解決しました

しかしなぜ手動になったのか不思議です。

ありがとうございました

補足日時:2006/09/24 10:07
    • good
    • 0
この回答へのお礼

>この場合、普通にコピーすればいいです。

わたしのPCでは、下の行にドラッグしてコピーしたのですが
数式は相対的に変更されているにも関わらず
表示はA1セルを参照したままです。

当該セルを一度編集状態にして「ENTER」を押すと正常な表示になりますが、
時間が掛かってしかたがありません

AA123456  AA
AB236547  AA
a0654782  AA
:
:

AA123456  AA
AB236547  AB <--このセルを編集後ENTERで直る
a0654782  AA

このような状態です。
どうすれば直るのか教えてくださいお願いいたします

お礼日時:2006/09/24 09:00

#01です


>#NAME?になって思い通りに結果が出ません
そうですか。私の環境では動きましたが…

#01と#02の変更点は以下の1行のみです。
strPattern = "^[A-Z,A-Z]+"

この行だけ差し替えて下さい
    • good
    • 0
この回答へのお礼

面倒な事ばかりで申し訳ありません

新規Bookでコピー・ペーストしてみたのですが
今度は、エラーではなく結果は空白になってしまいました。

編集画面は確かに”=AZout(A1)”などとなっていますが肝心のセルは空白になっています

原因がわかりません
もし時間があれば教えてください

お礼日時:2006/09/25 21:28

#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"
の二行は削除してください。
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ありませんでした
もう一度チャレンジしてみます。

勉強のため構文を確認しながら実行してみます
ありがとうございました

お礼日時:2006/10/09 20:51

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