2012年5月7日月曜日

エクセルで特定スペースの抽出

エクセルで特定スペースの抽出

エクセルである列のセルにスペースを入れる際にはルールがあります。



そのルールというのは“アルファベット間のみスペースOK”というものです。



例としては

『Yahoo JAPAN』⇒○

『YahooJAPAN』⇒○

『Yahoo! JAPAN』⇒×

『ヤフー JAPAN』⇒×

『ヤフー ジャパン』⇒×

『ヤフージャパン』⇒○

『SUPER MARIO BROS』⇒○

『スーパーMARIO BROS』⇒○

『“SUPER” MARIO BROS』⇒×



などです。





そこでルールに“従っていない”セルを抽出したいのですが

何か良い方法はないでしょうか?



理想としてはマクロやVBAで

該当のセルに目印として色をつけたいのですが…。





ちなみに対象の列のセル数は10000前後。

エクセルのバージョンは2007です。





よろしくお願いします。







guranie_uさん



【補足に対する追記】***************



変更してみました。。

Sub Sample全角()

Dim i As Long, j As Long, k As Long

j = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To j

For k = 1 To Len(Cells(i, 1))

If Mid(Cells(i, 1), k, 1) = " " Then

If Mid(Cells(i, 1), k - 1, 1) Like "[!A-Z,!a-z]" Or _

Mid(Cells(i, 1), k + 1, 1) Like "[!A-Z,!a-z]" Then

Cells(i, 1).Interior.ColorIndex = 3

Exit For

End If

End If

Next k

Next i

End Sub



【最初の回答】

データの列はどこでしょうか?

とりあえず、A列A1~下にずーっとデータがあるとして、、

ルール違反のセルを赤く塗りつぶします。



Sub Sample()

Dim i As Long, j As Long, k As Long

j = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To j

For k = 1 To Len(Cells(i, 1))

If Mid(Cells(i, 1), k, 1) = " " Then

If Mid(Cells(i, 1), k - 1, 1) Like "[!A-Z,!a-z,!A-Z]" Or _

Mid(Cells(i, 1), k + 1, 1) Like "[!A-Z,!a-z,!A-Z]" Then

Cells(i, 1).Interior.ColorIndex = 3

Exit For

End If

End If

Next k

Next i

End Sub



<マクロの貼り付け方>

上記のコードをコピーして、、

エクセルのワークシート上で「Alt」+「F11」でVBE画面を出して、、

上のメニュー→「挿入」→「標準モジュール」をクリックして、

広い画面のカーソルが「テカテカ」しているところにコードを貼り付けます。

もうこの画面はいらないので、、右上の「×」で元のシートに戻ります。



<マクロの実行>

「Alt」+「F8」を押すと、マクロのダイアログが出てきますので、、

「Sample」が選択された状態で「実行」を押下します。。








Sub try()



Dim r As Range



With CreateObject("VBScript.Regexp")



' [ ]の中は半角スペース1個と全角スペース1個

.Pattern = "[^A-Za-zA-Za-z]+[ ][^A-Za-zA-Za-z]*"

.Global = True



' 例えばA列にデータがある場合

For Each r In Range("A1", Cells(Rows.Count, 1).End(xlUp))



' 除外する場合はセルを赤に

If .Test(r.Value) Then r.Interior.ColorIndex = 3



Next



End With



End Sub



的外れでしたらごめんなさい。







全角だと聞いて、修正しました。



--

1) Excelを起動します。

2) 「Alt + F11」を押してVBEを起動します。

3) 「挿入」→「標準モジュール」をクリック。

4) 開いたウインドウに下記のコードを貼り付けます。

5) F5キーを押せば、マクロが実行できます。





Sub check()

Dim N As Long '半角スペースが見つかった位置

Dim cnt As Long '半角スペースの個数

Dim String1 As String

Const String2 As String = " " '全角スペース

' Const String2 As String = " " '半角スペース



'【☆】半角スペースが見つかった位置を格納する配列。

'一つの文字列につき、最大で半角スペース20個以下を想定。

Dim spacePosition(20) As Long

Dim errorFlag As Boolean

Dim i As Long



Dim maxPos As Long

Dim focusPos As Long

Dim prevChar As String

Dim nextChar As String

Dim j As Long

Dim lastrow As Long



lastrow = Cells(Rows.Count, 1).End(xlUp).Row



For j = 1 To lastrow



String1 = Cells(j, 1) '調べる文字列

'初期化

errorFlag = True

For i = 1 To 20

spacePosition(i) = 0

Next i



'文字列の中に、半角スペースが何個あるか数える

N = InStr(1, String1, String2)

If N > 0 Then

spacePosition(1) = N

End If



Do While N > 0

cnt = cnt + 1 '半角スペースが見つかった個数

N = InStr(N + 1, String1, String2) 'N番目に半角スペースがある。

spacePosition(cnt + 1) = N

' MsgBox N

Loop

' MsgBox """" & String2 & """" & "は、" & cnt & "個あります。"



'半角スペースが見つかった最後の位置を求めておく

For i = 1 To 20

If spacePosition(i) > 0 Then

maxPos = spacePosition(i)

Else

Exit For

End If

Next i

' MsgBox "半角スペースが出てきた最後の位置は" & maxPos





If cnt = 0 Then '半角スペースが見つからなかった場合

errorFlag = False

ElseIf spacePosition(1) = 1 Then '最初の1文字が半角スペースだった場合、エラー認定

errorFlag = True

ElseIf (Len(String1) > 0) And (maxPos = Len(String1)) Then '最後の1文字が半角スペースだった場合、エラー認定

errorFlag = True

Else



'少なくとも、最初と最後の文字は半角スペースではない場合

'スペースの両側の文字が、アルファベットか否かで判定する。

errorFlag = False 'ここまで来た場合、デフォルトをエラー無しに設定しておく。



For i = 1 To cnt

If spacePosition(i) > 0 Then

focusPos = spacePosition(i)

prevChar = Mid(String1, focusPos - 1, 1)

nextChar = Mid(String1, focusPos + 1, 1)



' MsgBox "前の文字は" & prevChar

' MsgBox "次の文字は" & nextChar

If (prevChar Like "[A-z]") And (nextChar Like "[A-z]") Then

' If (prevChar Like "[A-z]") And (nextChar Like "[A-z]") Then

' MsgBox "アルファベットです。"

'何もしない

Else

' MsgBox "アルファベットではない。"

errorFlag = errorFlag + True

End If

Else '全てのスペースについて調べ終えた

Exit For

End If

Next i



End If





If errorFlag = True Then

' MsgBox "エラーあり!"

Cells(j, 1).Interior.ColorIndex = 6

Else

' MsgBox "エラーなし"

End If





Next j



MsgBox "実行しました"





End Sub







とりあえず叩き台として

=IF(ISERROR(FIND(" ",A1)),"○",IF(LENB(MID(A1,FIND(" ",A1)-1,1))>1,"×","○"))

左から1個目の半角スペースの前のバイト数だけで判断させてます。

サンプルではこれで十分です。

スペースの右の文字は簡単に追加可能ですが、

2個目のスペースやアルファベット以外の半角文字がある場合にはひねりが必要になります。



必要であれば考えますので完璧なサンプルのご提示をお願いします。

0 件のコメント:

コメントを投稿