• ベストアンサー

文字列末尾についている数字を削除する2

先ほど締め切ったのですが、 大変申し訳ありません、再質問をさせてください。 (初質問の上に不手際続きで本当に申し訳ありません) 前回質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2333617 カタカナ濁音がある場合に、 =LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890))-1) を使うとうまくいかず、 =IF(AND(RIGHT(A1,3)>="100",RIGHT(A1,2)<="999"),LEFT(A1,LEN(A1)-3),IF(AND(RIGHT(A1,2)>="10",RIGHT(A1,2)<="99"),LEFT(A1,LEN(A1)-2),IF(AND(RIGHT(A1,1)>="0",RIGHT(A1,1)<="9"),LEFT(A1,LEN(A1)-1),A1))) でなんとかうまくいったものの、 内容が汎用的ではなく、もう一案いただきたく =JIS(LEFT(ASC(A1),FIND({1,2,3,4,5,6,7,8,9,0},ASC(A1)&"1234567890")-1)) をテストデータでやったところうまくいったので 締め切らせていただいたのですが、 本ちゃんデータで走らせて見たところ、 コードの最左数値が1以外のものではうまくいきませんでした。 つまり カブ1   カブ カブ10  カブ カブ100 カブ カブ2   カブ2 カブ20  カブ20 カブ200 カブ200 もう少しお知恵をいただけるとうれしいです。 ずうずうしくて大変申し訳ありません

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

すみません。min()を入れ忘れました =JIS(LEFT(ASC(A1),MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&"0123456789")-1)))

naonoan
質問者

お礼

すいません、週末がお休みな職場だったので、 お返事が遅れました。 お盆返上できた甲斐がありました 私こそよくみないで使ってしまったので、 これで無事何とかなりました。 もう少し自分の頭でも考えられるように勉強したいです。 感謝

その他の回答 (6)

  • NCU
  • ベストアンサー率10% (32/318)
回答No.7

#5です。 末尾の数値を削除する関数ですが、多分この方が少しできがいいかな。 Function TrimLastNum(argStr As String) As String   Dim i As Integer   For i = Len(argStr) To 1 Step -1     If Not Mid(argStr, i, 1) Like "#" Then Exit For   Next   TrimLastNum = Left(argStr, i) End Function

naonoan
質問者

お礼

VBAは全くの初心者ですが、学生時代やったCの勉強からDoWhileは苦手で(笑) 無理やりいつもFor文にしてコードやってた者としては For文のほうがまだ頭になじみやすいので、 大変助かります。 それでも時間がかかるでしょうけど、 がんばって勉強してみます。 日本語で書くとこんな感じかな?などと・・・・ あってるんだろうか・・・ Iを一個ずつ足す  対象値のI桁目の1文字が文字列でなかったらiから1引いて脱出 繰り返す 左から数字になる直前までの桁数で対象値を削除する まだ職場なので、ニュアンスしかつかめませんが、 午後から夏休みにVBAの本買ってきて、チャレンジする気になって きました。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 私のは、こんな式です。もうひとつの定石です。 =LEFT(A1,MATCH(FALSE,INDEX(ISERROR(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1)*1),,),0)-1) ROW(INDIRECT("A1:A"&LEN(A1))) この部分は、キメウチで、 最高、20文字までなら、 例: ROW($A$1:$A$20) に入れ替えてもよいです。 これは、全角、半角、混ざってもよいですが、エラー処理がされていませんので、空白セルには、エラーが出ます。

naonoan
質問者

お礼

MATCH関数もINDEX関数も本当の基本的な使い方 しかやったことはないですし、 INDIRECT関数は初めての体験になります。 この夏休みに勉強させていただきます。 ありがとうございました!

  • NCU
  • ベストアンサー率10% (32/318)
回答No.5

末尾の数値を削除する関数です。 Function TrimLastNum(argStr As String) As String   Dim i As Integer   i = Len(argStr)   If i = 0 Then Exit Function   Do While Mid(argStr, i, 1) Like "#"     i = i - 1   Loop   TrimLastNum = Left(argStr, i) End Function

naonoan
質問者

お礼

VBAは絶賛挫折中ですが、いつかはチャレンジしたいです! でも、どこから取り掛かってみたらいいのか わからなかったので、このコードを参考に 念願のループチャレンジ。 きっかけをありがとうございます

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。 数字をカットするのだから、置換でいいんじゃないかなぁ... 0~9までの9回の操作なので関数を考えてるより早いですよ。 多分 2 分もかからない。 何だか話の流れに逆らってます。関数の勉強というご質問で あれば、すみません。

naonoan
質問者

お礼

ありがとうございます。 0~9なら我慢もできるのですが、 現状では なし~999なんで、 1000回続ける気力がありませんでした(汗) そして今後は桁数が増えて行くこともあり、 関数で勉強してみたかったのです。 独り言 コード体系を自分で決めたかった・・・・(泣) (できれば桁数は固定化したかったですぅ)

naonoan
質問者

補足

あ、そうか、よおく考えてみたら 「~を含む」でやると9回で済みますね。 置換も中々あなどれませんね。 今後の参考にさせていただきます。 感謝

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.3

上記の式の場合、2以降の数値より1が先に見つかる為ですね。 =JIS(LEFT(ASC(A1),MIN(FIND({1,2,3,4,5,6,7,8,9,0},ASC(A1)&"1234567890")-1))) のように数値が見つかった位置の最小値で切り取るようにすればOKです。

naonoan
質問者

お礼

無事できました。 ありがとうございました。 日ごろはmin関数は使わなくて、 色々やり方があるのだと勉強になりました

noname#19676
noname#19676
回答No.2

=JIS(LEFT(ASC(A4),MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A4)&"0123456789")-1))) 先の回答にはminがなかったのですね。

naonoan
質問者

お礼

ありがとうございました よくみたらそうでした(笑) 頭からあると仮定してコピペしていたので・・・ 無事出来ました、ありがとうございます!

関連するQ&A