[[20061211213216]] 『変換〜変換』(初心者です) ページの最後に飛ぶ

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

 

『変換〜変換』(初心者です)
	A	   B	  C
1	A01-01	A001-001  A1-1
2	B100-01	B100-001	 B100-1
3	ZZ1-01	ZZ001-001	 ZZ1-1

A列に上記のようなアルファベットと数字の混じったデータがあります。(数千あります)

B列に数字のみを3桁に・C列はゼロを抜いたものを出したいのですが?

A列に入力した時にBとCを一度に出せるマクロ式はあるのでしょうか?それとも通常の式でも??


 編集>検索>置き換え でできると思います。


 少しなが〜〜〜くなりますが、、、
 B1=SUBSTITUTE(SUBSTITUTE(LEFT(A1,FIND("-",A1)-1),LOOKUP(10^5,--RIGHT(LEFT(A1,FIND("-",A1)-1),ROW($A$1:$A$4))),""),0,"")&TEXT(LOOKUP(10^5,--RIGHT(LEFT(A1,FIND("-",A1)-1),ROW($A$1:$A$4))),"000")&TEXT(--SUBSTITUTE(A1,LEFT(A1,FIND("-",A1)-1),""),"000")
 C1=SUBSTITUTE(SUBSTITUTE(LEFT(A1,FIND("-",A1)-1),LOOKUP(10^5,--RIGHT(LEFT(A1,FIND("-",A1)-1),ROW($A$1:$A$4))),""),0,"")&LOOKUP(10^5,--RIGHT(B1,ROW($A$1:$A$4)))&--SUBSTITUTE(A1,LEFT(A1,FIND("-",A1)-1),"")

 (川野鮎太郎)

 ユーザー定義関数。
標準モジュールに登録後、セルへ
=ST(セルアドレス,分割文字列,指定桁数)
のように通常の関数のように指定。
=st(A1,"-",3) = A001-001
=st(A1,"-",1) = A1-1
のような結果になります。
 
 Function ST(ByVal Target As Range, ByVal Splitter As String, ByVal Digit As Long) As Variant
     Dim VarStr As Variant, i As Long, j As Long
     Dim StrChk() As String, strTmp1 As String, strTmp2 As String
     Application.Volatile
     If Target.Count = 1 And Digit >= 1 And Len(Splitter) > 0 Then
         VarStr = Split(Target, Splitter)
         ReDim StrChk(UBound(VarStr))
         For i = 0 To UBound(VarStr)
             For j = 1 To Len(VarStr(i))
                 StrChk(i) = Right(VarStr(i), j)
                 If Not IsNumeric(StrChk(i)) Then Exit For
                 strTmp1 = StrChk(i)
                 strTmp2 = Replace(VarStr(i), strTmp1, "")
             Next j
             ST = ST & strTmp2 & Format(Val(strTmp1), WorksheetFunction.Rept("0", Digit)) & Splitter
         Next i
         ST = Left(ST, Len(ST) - 1)
     Else
         ST = CVErr(xlErrValue)
     End If
 End Function
 
習作なので、改善できる点があればご指摘下さい。
(みやほりん)(-_∂)b


 なんとなく、
 Function ST(略) As String
  ↓
 Function ST(略) As variant

 ST = "#VALUE!"
  ↓
 ST = CVErr(xlErrValue)
 BJ

 やはり、エラー値を返す関数がありましたか。BJさんありがとう。
ユーザー定義関数でmsgbox使うと再計算のたびにメッセージが出てうるさいですね。
上記コード、修正しました。
(みやほりん)(-_∂)b

 ご希望とは、異なるもので、どうしようかと迷いましたが、書いてみます。
 このように長くなっています。                    (6UP)

 B1に
 =IF(SUM(COUNTIF(A1,"*-*"),COUNT(RIGHT(A1)),COUNT(LEFT(A1))=0)<3,"",
 LEFT(A1,LEN(A1)-COUNT(-RIGHT(SUBSTITUTE(A1,"-","."),{1,2,3,4,5,6,7})))
 &TEXT(LOOKUP(9^9,INT(RIGHT(SUBSTITUTE(A1,"-","."),{1,2,3,4,5,6,7}))),"000-")
 &RIGHT(SUBSTITUTE(A1,"-","000"),3))

 C1に
 =IF(SUM(COUNTIF(A1,"*-*"),COUNT(RIGHT(A1)),COUNT(LEFT(A1))=0)<3,"",
 LEFT(A1,LEN(A1)-COUNT(-RIGHT(SUBSTITUTE(A1,"-","."),{1,2,3,4,5,6,7})))
 &LOOKUP(9^9,INT(RIGHT(SUBSTITUTE(A1,"-","."),{1,2,3,4,5,6,7})))
 &-RIGHT(SUBSTITUTE(A1,"-","000"),3))

 みやほりんさん、
 Volatile は必要ないのでは?
 (seiya)

 数式でもう一案。
と言っても、数字部分はお二方から出てるので割愛して、頭のアルファベット部分だけですけど。
2文字以内ならOK。それ以上なら ,4,5,6 と続けてくださいまし。
=LEFT($A1,MIN(IF(ISNUMBER(--MID($A1,{1,2,3},1)),{1,2,3}-1,"")))
ただ、アルファベットが何文字続くか分らなければ、使えない...<<大いなる弱点>>
(sin) 

 シートモジュールで考えてみました。
 
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MyVal As Variant, x(1 To 2) As Variant
    With Target
        If .Count > 1 Then Exit Sub
        If Intersect(.Cells, Range("A:A")) Is Nothing Then Exit Sub
    End With
    With CreateObject("VBScript.RegExp")
        .Pattern = "^([A-Za-z]+)(\d+)(-|−)(\d+)$"
        If .Test(Target) Then
            x(1) = .Replace(Target, "$1") & Format(.Replace(Target, "$2"), "000") & .Replace(Target, "$3") & Format(.Replace(Target, "$4"), "000")
            x(2) = .Replace(Target, "$1") & Format(.Replace(Target, "$2"), "0") & .Replace(Target, "$3") & Format(.Replace(Target, "$4"), "0")
        End If
    End With
    Application.EnableEvents = False
    Target.Offset(0, 1).Resize(1, 2) = x()
    Application.EnableEvents = True
End Sub
 
 (キリキ)(〃⌒o⌒)b

 こんにちは〜♪

 私も作ってみました。

 B1セル
 =IF(A1="","",LEFT(A1,MATCH(1,INDEX(ISNUMBER(MID(A1,ROW($1:$20),1)*1)*1,),0)-1)
&TEXT(RIGHT(SUBSTITUTE(A1,RIGHT(A1,LEN(A1)-FIND("-",A1)+1),""),FIND("-",A1)-
MATCH(1,INDEX(ISNUMBER(MID(A1,ROW($1:$20),1)*1)*1,),0)),"000")&TEXT(RIGHT
(A1,LEN(A1)-FIND("-",A1)+1),"000"))

 C1セル
  =IF(A1="","",LEFT(A1,MATCH(1,INDEX(ISNUMBER(MID(A1,ROW($1:$20),1)*1)*1,),0)-
1)&RIGHT(SUBSTITUTE(A1,RIGHT(A1,LEN(A1)-FIND("-",A1)+1),""),FIND("-",A1)-MATCH
(1,INDEX(ISNUMBER(MID(A1,ROW($1:$20),1)*1)*1,),0))*1&RIGHT(A1,LEN(A1)-FIND("-
",A1)+1)*1)

 。。。。Ms.Rinでした〜♪♪


コメント返信:

[ 一覧(最新更新順) ]


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