[[20100812015618]] 『アルファベット以外の取得』(hai) ページの最後に飛ぶ

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

 

『アルファベット以外の取得』(hai)

 excel2010 windows 7

 A列のアルファベット以外をB列に入力するマクロを教えてください。
 範囲は行2からA列に入力のある範囲です。

       A     B

 1
 2    A1     1
 3    AA1    1
 4    A2     2
 5    AAA2   2
 6    A33    33
 7    AA33   33


 標準モジュールに
 '===========================================================================
 Option Explicit
 Option Compare Text 'これも必須です
 Sub samp()
    Dim rng As Range
    Set rng = Range("a2", Cells(Rows.Count, "a").End(xlUp))
    With rng
       If .Row > 1 Then
          With .Offset(0, 1)
             .Formula = "=except_alpha(rc[-1])"
             .Value = .Value
          End With
       End If
    End With
 End Sub
 '====================================================================
 Function except_alpha(mydata As Variant) As String
    Dim chkstr As String
    Dim g0 As Long
    except_alpha = ""
    chkstr = mydata
    For g0 = 1 To Len(chkstr)
       If Mid(chkstr, g0, 1) Like "[!a-z]" Then
          except_alpha = except_alpha & Mid(chkstr, g0, 1)
       End If
    Next
 End Function

 これでデータがあるシートをアクティブにして、sampを実行してみてください。

 ichinose

 ichinoseさんありがとうございます。
 できました!が、内容不足でした。少し変えさせてください。

 >A列のアルファベット以外をB列に入力するマクロを教えてください。
 >範囲は行2からA列に入力のある範囲です。

 G列のアルファベット以外をH列に入力してG列にはアルファベットのみを残すマクロ教えてください。
 範囲は行2からG列に入力のある範囲です。
 そのマクロとは別に、G列とH列に分解したデータをG列に合体させるマクロも教えて下さい。
 たくさん注文入れてすいません。
 (hai)


 G列の2行目からデータがあるとして、標準モジュールに

 '==================================================================
 Option Explicit
 Option Compare Text 'これも必須です
 Sub samp()
    Dim rng As Range
    Set rng = Range("g2", Cells(Rows.Count, "g").End(xlUp))
    With rng
       If .Row > 1 Then
          With .Offset(0, 1)
             .Formula = "=except_alpha(rc[-1])"
             .Value = .Value
          End With
          .Value = Evaluate("=if(" & .Address & "="""","""",SUBSTITUTE(" & _
                                     .Address & "," & .Offset(0, 1).Address & ",""""))")
          MsgBox "G列とH列をアルファベットとそれ以外に分けました。 確認してください"
          .Value = Evaluate("=" & .Address & "&" & .Offset(0, 1).Address)
          MsgBox "G列とH列を合体させました"
       End If
    End With
 End Sub
 '====================================================================
 Function except_alpha(mydata As Variant) As String
    Dim chkstr As String
    Dim g0 As Long
    except_alpha = ""
    chkstr = mydata
    For g0 = 1 To Len(chkstr)
       If Mid(chkstr, g0, 1) Like "[!a-z]" Then
          except_alpha = except_alpha & Mid(chkstr, g0, 1)
       End If
    Next
 End Function

 これで当該シートをアクティブにした状態でsampを実行して下さい。
 分けるのと合体を同時に行っています。

 実際の運用に当たっては、コードを解析して、使ってください。

 ichinose

 これは
[[20100812015618]] の延長ですわなぁ?
 だったら並べ替えもすべてマクロでやってしもたらどうでっか?
 こっちかな。
'''''''''''''''''''''''''''''''''''''''
Sub hai()
    Dim i As Long, tbl
    tbl = Range("a2").Resize(Range("a" & Rows.Count).End(xlUp).Row - 1)
    Application.ScreenUpdating = False
    With CreateObject("vbscript.regexp")
        .Pattern = "(\D+)(\d+)"
        For i = 1 To UBound(tbl, 1)
            If .test(tbl(i, 1)) Then
                tbl(i, 1) = .Replace(tbl(i, 1), "$1") & Format(.Replace(tbl(i, 1), "$2"), "0000")
            End If
        Next i
        Range("b2").Resize(UBound(tbl, 1)) = tbl
        Range("b2").Resize(UBound(tbl, 1)).Sort key1:=Range("b2"), order1:=xlAscending
        tbl = Range("b2").Resize(UBound(tbl, 1))
        .Pattern = "(0)*(\d+)"
        .Global = True
        For i = 1 To UBound(tbl, 1)
            If .test(tbl(i, 1)) Then
                tbl(i, 1) = .Replace(tbl(i, 1), "$2")
            End If
        Next i
    End With
    Range("b2").Resize(UBound(tbl, 1)) = tbl
    Application.ScreenUpdating = True
End Sub
 '''''''''''''''''''''''''''''''''''

 それともこっち?
 ''''''''''''''''''''''''''''''''''''
Sub haiこっち()
    Dim i As Long, tbl
    tbl = Range("a2").Resize(Range("a" & Rows.Count).End(xlUp).Row - 1)
    Application.ScreenUpdating = False
    With Sheets.Add
        .Range("a1").Resize(UBound(tbl, 1)) = tbl
        With CreateObject("vbscript.regexp")
            .Pattern = "(\D+)(\d+)"
            For i = 1 To UBound(tbl, 1)
                If .test(tbl(i, 1)) Then
                    tbl(i, 1) = Left(.Replace(tbl(i, 1), "$1"), 1) & Format(.Replace(tbl(i, 1), "$2"), "00000")
                End If
            Next i
        End With
        .Range("b1").Resize(UBound(tbl, 1)) = tbl
        .Range("a1").Resize(UBound(tbl, 1), 2).Sort key1:=.Range("b1"), order1:=xlAscending, _
                            key2:=.Range("a1"), order2:=xlAscending
        tbl = .Range("a1").Resize(UBound(tbl, 1))
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    Range("b2").Resize(UBound(tbl, 1)) = tbl
    Application.ScreenUpdating = True
End Sub
       ↓(追加)
      ボケ防止作品(弥太郎) 


 ichinoseさん、弥太郎さん
 ありがとうございました。
 私には絶対作れないコードです。。
 本とインターネットだけではなかなか難しいですね。
 (hai)

 こんばんわ。作っていただいたコードで質問なのですが、
 G列とH列を合体させる前に、処理を追加したいのですがうまく動きません。。
 追加したい処理は下記です。
 Sheets("sheet1").Select
 Range("H1").Select
 ActiveCell.FormulaR1C1 = "ダミー"
 Rows("1:1").Select
 Selection.AutoFilter
 ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort.SortFields.Clear
 ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort.SortFields.Add Key:= _
        Range("A2:A32"), SortOn:=xlSortOnValues, Order:=xlAscending,  DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort.SortFields.Add Key:= _
        Range("F2:F32"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder _
        :="A*,C*,B*", DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort.SortFields.Add Key:= _
        Range("G2:G32"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort.SortFields.Add Key:= _
        Range("H2:H32"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("sheet1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

 '==================================================================
 Option Explicit
 Option Compare Text 'これも必須です
 Sub samp()
    Dim rng As Range
    Set rng = Range("g2", Cells(Rows.Count, "g").End(xlUp))
    With rng
       If .Row > 1 Then
          With .Offset(0, 1)
             .Formula = "=except_alpha(rc[-1])"
             .Value = .Value
          End With
          .Value = Evaluate("=if(" & .Address & "="""","""",SUBSTITUTE(" & _
                                     .Address & "," & .Offset(0, 1).Address & ",""""))")
          MsgBox "G列とH列をアルファベットとそれ以外に分けました。 確認してください"

 ↑↓この間に処理を入れたいです。

          .Value = Evaluate("=" & .Address & "&" & .Offset(0, 1).Address)
          MsgBox "G列とH列を合体させました"
       End If
    End With
 End Sub
 '====================================================================
 Function except_alpha(mydata As Variant) As String
    Dim chkstr As String
    Dim g0 As Long
    except_alpha = ""
    chkstr = mydata
    For g0 = 1 To Len(chkstr)
       If Mid(chkstr, g0, 1) Like "[!a-z]" Then
          except_alpha = except_alpha & Mid(chkstr, g0, 1)
       End If
    Next
 End Function
 (hai)

 できました。。
 失礼しました。
 またお願いいたします。
 (hai)

解決されたようですが、自分もちと考えてみました。

 Option Explicit
 Sub test()
 Const INPUT_RANGE As String = "G2:G10"
 Const OUTPUT_RANGE_STR As String = "H"
 Const OUTPUT_RANGE_NUM As String = "I"
 Dim c As Variant
 Dim i As Long, ans As Long

 For Each c In Range(INPUT_RANGE)
     For i = 1 To Len(c.Value)
         ans = Val(Mid(c.Value, i, 9))
         If ans Then
             Range(OUTPUT_RANGE_NUM & c.Row).Value = ans
             Exit For
         End If
         Range(OUTPUT_RANGE_STR & c.Row).Value = Mid(c.Value, 1, i)
     Next i
 Next c
 End Sub

INPUT_RANGEは自分で指定します。

文字部分はH列、数値部分はI列に出力するので、実行し終わったら表内のどこかをクリックしておいて、メニューの[データ]-[並べ替え]より、最優先されるキー[H列]昇順、2番目に優先されるキー[I列]昇順で並べ替え。

G列も連動して並び替えされているので、不要となったH、I列は自分で削除〜 という感じで考えてます。

(ramrun)ぬ〜ん


 解決後ですが、

 A001
 a0

 なんてデータでは

 A    001
 a    0

 と分けるように(つまり、アルファベットと数字文字列)したいなら

  Function except_alpha(mydata As Variant) As String
    Dim chkstr As String
    Dim g0 As Long
    except_alpha = "'"   'ここを訂正
    chkstr = mydata
    For g0 = 1 To Len(chkstr)
       If Mid(chkstr, g0, 1) Like "[!a-z]" Then
          except_alpha = except_alpha & Mid(chkstr, g0, 1)
       End If
    Next
 End Function

 としたほうがよいですね!!

 どっちかな?

 ichinose

コメント返信:

[ 一覧(最新更新順) ]


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