[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『アルファベット以外の取得』(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.