EXCEL VBA 記号の削除

このQ&Aのポイント
  • A列3行目からはじまる(A列2行目タイトル=FA)データより記号を取り除いたものをE列に表したい
  • ASC関数を使用せず、REPLACEの使い方が間違っているのかも
  • データを半角に変換し、記号を取り除けない問題が発生している
回答を見る
  • ベストアンサー

EXCEL VBA 記号の削除

A列3行目からはじまる(A列2行目タイトル=FA)データより"!"や"#"などの記号を取り除いた ものをE列に表したいと思っています。 データを半角にして、ASC関数を使って記号を取り除こうとしたのですが、半角になるだけで 記号を取り除くことができません。 If の後、ASC関数は使用せず、"!"や"#"を指定しても結果が同じだったんですが REPLACEの使い方が間違っているのでしょうか? Dim セル As Range Dim TARGET As Range Dim 変換文字 As String Dim i As Long Dim W As Worksheet Set W = Sheets("DATA転記") Set TARGET = W.Range("A3", Range("A65536").End(xlUp)) For Each セル In TARGET 変換文字 = StrConv(セル.Text, vbNarrow) For i = 1 To Len(変換文字) If Asc(変換文字) >= 32 And Asc(変換文字) <= 47 And _ Asc(変換文字) >= 58 And Asc(変換文字) <= 64 And _ Asc(変換文字) >= 91 And Asc(変換文字) <= 96 And _ Asc(変換文字) >= 123 And Asc(変換文字) <= 126 Then _ 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") End If Next i セル.Cells(, 5).Value = StrConv(セル.Text, vbWide) Next セル

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

  • ベストアンサー
回答No.6

> セルの範囲指定を足せばいいのでしょうか? > また"!##aabbc@01^AB|"の意味を教えていただけると幸いです。 そうです。一例として記載したソースは、あくまで「こんなやり方でやれば良いよ」というだけのものでして。strEXに「!##aabbc@01^AB|」の文字列を格納し、このソースを実行するとstrANSに「aabbc01AB」が入ります。という例です。 質問者さんのソースにそのまま、このやり方を当てはめると。。。こうなりますネ。 Sub ex()   Dim セル    As Range   Dim TARGET   As Range   Dim 変換文字  As String   Dim 変換後文字 As String   Dim i      As Long   Dim W      As Worksheet   Set W = Sheets("DATA転記")   Set TARGET = W.Range("A3", Range("A65536").End(xlUp))   For Each セル In TARGET     変換文字 = StrConv(セル.Value, vbWide)     変換後文字 = ""     For i = 1 To Len(変換文字)       If Mid(変換文字, i, 1) Like "[0-9,a-z,A-Z,あ-ん,ア-ン]" Then         変換後文字 = 変換後文字 & Mid(変換文字, i, 1)       End If     Next     セル.Offset(, 4).Value = 変換後文字   Next End Sub テストしたわけじゃありませんので(^^; あとはうまくアレンジしてください。

jr-junior
質問者

お礼

とても分かりやすく教えていただいて大変勉強になり、大変助かりました! ありがとうございました m(_ _)m

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

なにを難しいことをやっているのかな。 簡単に Sub test02() d = Range("A65536").End(xlUp).Row For i = 2 To d x = Cells(i, "A") y = Replace(x, "!", "") z = Replace(y, "#", "") Cells(i, "E") = z Next i End Sub で良いのでは? 半角全角などあるのなら、Replaceを増やせば仕舞い。 >For i = 1 To Len(変換文字) If Asc(変換文字) >= 32 And Asc(変換文字) <= 47 And _ など、全くおかしい。変換文字全体が、そういう文字コードの範囲内になるわけではないだろうし。

回答No.4

補足です。 一例として示したソースは、「英数字以外を削除する」という考え方ではなく 「英数字だけを抜き出す」という考え方になっています。 文字列を左から順に1文字ずつ判定し、英数字なら抜き出して別の変数に文字を繋げていく方法です。

回答No.3

Asc(変換文字) >= 32 ですが「変換文字」変数に入っている“何文字目”を判定していますか?(^^; 上記のままでは「変換文字」変数に入っている“文字列”の1文字目を、延々と判定している事になりますよ。 やりたい事は、もしかして Asc(Mid(変換文字,i,1)) >= 32 じゃありませんか?(^^) それと「0~9,a~z,A~Z 以外を削除したい」という事ですよね?であれば、IF文に Like 演算子を使用した方がシンプルかつ分かりやすくて良いです。 If Not Mid(変換文字,i,1) Like "[0-9,a-z,A-Z]" Then ただ、If文後に Replace 文で「""」に置換してしまっていますよね?そうすると文字を削除した分、前にドンドン詰まって行くので「いま何文字目?」と聞いてもズレてしまいます。 なので、そこも注意が必要です。 で。一例です。 Sub ex()   Dim strEX  As String   Dim strANS As String   Dim intCNT As Integer      strEX = "!##aabbc@01^AB|"      strANS = ""   For intCNT = 1 To Len(strEX)     If Mid(strEX, intCNT, 1) Like "[0-9,a-z,A-Z]" Then       strANS = strANS & Mid(strEX, intCNT, 1)     End If   Next End Sub

jr-junior
質問者

補足

ご投稿いただき、ありがとうございます。 非常にわかりやすくご回答いただき、大変勉強になります。 ひらがなやカタカナもあるので変換文字をvbwideで全角に修正し If Not Mid(変換文字, i, 1) Like "[0-9,a-z,A-Z,あ-ん,ア-ン]" Thenにし 取り急ぎreplaceは""を" "にし実行してみました。まさしく、希望通りの変換ができあがりました。 一例として教えていただいた方もやってみましたが、こちらだと変化なく(E列が全て空欄のまま) 実行が終わってしまいました。セルの範囲指定を足せばいいのでしょうか? また"!##aabbc@01^AB|"の意味を教えていただけると幸いです。 お忙しいところお手数ではございますがよろしくお願いいたします。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

NO1です。 追記です。 セル.Cells(, 5).Value = StrConv(セル.Text, vbWide) ↓ セル.Cells(, 5).Value = StrConv(変換文字, vbWide)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

コード範囲毎にand条件ではなくOr条件にしないと成立しませんよ。 IfよりSwitch~Caseはお勧めします。

jr-junior
質問者

補足

早速のご投稿ありがとうございます。 or条件にしてもやっぱり記号が消えませんでした。 switch~caseは使用したことがないのですが、下記のように書き直してみましたが (宣言部分省略)やはりうまくいきません。構文の組み立てがおかしいのでしょうか? Dim セル As Range Dim TARGET As Range Dim 変換文字 As String Dim 半角 As String Dim i As Long Dim W As Worksheet Set W = Sheets("DATA転記") Set TARGET = W.Range("A3", Range("A65536").End(xlUp)) For Each セル In TARGET 変換文字 = StrConv(セル.Text, vbNarrow) For i = 1 To Len(変換文字) Select Case 変換文字 Case Asc(変換文字) >= 32 And Asc(変換文字) <= 47 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") Case Asc(変換文字) >= 58 And Asc(変換文字) <= 64 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") Case Asc(変換文字) >= 91 And Asc(変換文字) <= 96 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") Case Asc(変換文字) >= 123 And Asc(変換文字) <= 126 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") End Select Next i セル.Cells(, 5).Value = StrConv(セル.Text, vbWide) Next セル

関連するQ&A

  • エラー"Next"に対する"for"がありません

    EXCELのVBAで、A列3行目から入力されているデータ(A列2行目タイトル="FA")を 一度全て半角に変換し、変換した"変換文字"から"!"や"#"の記号をASC関数を利用し 削除、記号だけを削除した文字列をE列に取得しようとしていますが NEXTにたいするFORがありませんとエラーが出てしまいます。 TARGETの設定の仕方が悪いのでしょうか? (win7/EXCEL2010使用) Dim セル As Range Dim TARGET As Range Dim 変換文字 As String Dim i As Long Dim W As Worksheet Set W = Sheets("DATA転記") Set TARGET = W.Range("A3", Range("A65536").End(xlUp)) For Each セル In TARGET 変換文字 = StrConv(セル.Text, vbNarrow) For i = 1 To Len(変換文字) If Asc(変換文字) >= 32 And Asc(変換文字) <= 47 And _ Asc(変換文字) >= 58 And Asc(変換文字) <= 64 And _ Asc(変換文字) >= 91 And Asc(変換文字) <= 96 And _ Asc(変換文字) >= 123 And Asc(変換文字) <= 126 Then _ 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") Next i セル.Cells(, 5).Value = 変換文字 Next セル

  • エクセルVBAのコードを簡単に表現したい

    お世話になっています。 エクセルVBAでコードを書いたのですが、なにぶん初心者のためゴテゴテしたものになってしまいました。 A列にはA2からA11まで15文字以内の文字列が入っています。 同じ行のB列からP列に、濁点も1文字として1セルに1文字づつ抜き出すようにコードを書きました。 以下です。 Sub test() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Set s1 = Sheets("sheet1") For i = 2 To 11 For m = 1 To 15 変換 = s1.Cells(i, 1) 変換 = StrConv(変換, vbKatakana) 変換 = Application.WorksheetFunction.Asc(変換) 変換 = Mid(変換, m, 1) 変換 = StrConv(変換, vbWide) s1.Cells(i, m + 1) = StrConv(変換, vbHiragana) Next Next End Sub そこで質問なのですが、上記のコードをもっとスマートに表現するとどのようなコードになるのでしょうか。(特に「変換」が連なっているところ) よろしくお願いします。

  • VBA エクセル 列の並び替え

    左から右にA、B、Cと値が入っています。 ABC以外の文字が列に入っていたら、削除するというマクロを組みましたが、範囲を設定するところでエラーが出てしまいました。 なぜでしょうか? 教えて下さい。 Sub arrange() Dim rg As Range Dim i As Long i = 1 Do rg = Cells(i, 1) If rg <> "A" And rg <> "B" And rg <> "C" Then Range(i & ":" & i).Delete End If i = i + 1 Loop Until (i & "1") = "" End Sub

  • VBAエラー「スタック領域が不足しています」

    C2とD2のセルに英文字を入力した時,先頭文字を大文字にするVBAを組んだのですが,いざ実行すると「スタック領域が不足しています」と出てしまいます。以下にコードを示します。 'Sheet1 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row = 2 And Target.Column = 3 Then     Range("C2").Value = StrConv(Range("C2").Value, vbProperCase)   End If   If Target.Row = 2 And Target.Column = 4 Then     Range("D2").Value = StrConv(Range("D2").Value, vbProperCase)   End If End Sub なぜこのようなエラーが出るのでしょうか。考えれば考えるほど合っているように思えて仕方なくなったので,ミスがあればご指摘をおねがいします。

  • エクセルで英語の頭のみ大文字にするマクロについて

    Excel2003を使っています 英語の文字列で先頭の文字のみ大文字に変換する下記のマクロを作ってみましたが、記号・・・"("、")"、"/"などを含む文字列の場合、記号の後の先頭文字が小文字になってしまいます。 例 SOMEBODY (WHO) → Somebody (who) これをSomebody (Who) としたいのですがどうしたらよいでしょうか Sub Proper処理x() Dim セル As Range Dim 変換文字 As Strin For Each セル In Selection 変換文字 = StrConv(セル.Text, vbProperCase) セル.Value = 変換文字 Next End Sub ワークシート関数のProper()の場合、記号の後は大文字になります、その代わりCAN'TがCan'Tになってしまします。 Proper関数とStrConv関数では機能が違うのでしょうか 英数文字列の先頭文字を大文字にするマクロで、記号の後の文字を大文字にかつ、アポストロフィーの後のみは小文字にするマクロを作りたいのです。 よろしくお願いします。

  • エクセルVBAのイベントで質問です。

    ダブルクリックイベントで、G12:G31の範囲の文字列をB10:B27の範囲(最下行)に入れていくものを使っていますが、新たにH12:H31にある文字列もダブルクリックするとC10:C27の範囲(最下行)に入れていけるようにしたいと思います。 どのようにすればいいでしょうか。 ご存知の方いらっしゃればお教えいただけると助かります。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, _ Cancel As Boolean) Dim i As Long Dim flg As Boolean If Intersect(Target, Range("G12:G31")) Is Nothing Then Exit Sub If IsEmpty(Target.Value) Then Exit Sub With Worksheets("シートA") For i = 10 To 27 If .Range("B" & i).Value = "" Then .Range("B" & i).Value = Target.Value flg = True Exit For End If Next i If flg = False Then MsgBox .Name & " がいっぱいです。" End If End With Cancel = True End Sub

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • VBA(エクセル)でのCOUNTAについて

    エクセルのSheet1のB列にSheet2の内容をコピーして、(ここまではできました) Sheet1のB列に入ってきたデータの横(A列に)連番を振りたいと思っています。 そのため、以下のように作ってみたのですが、 A列に表示される連番が現在のB列の最後の数“54”をA列全て(B列にデータがあるところ)に表示してしまいます。 どの部分が悪いのかさっぱりわからず、どのように修正すべきかもわからず・・・困ってしまっています。 よろしくお願いします。 Dim i As Range Dim mycount As Range Set mycount = Application.Intersect(Target, Me.Range("b:b")) If mycount Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each i In mycount If IsEmpty(i.Value) Then i.Offset(0, -1).ClearContents Else i.Offset(0, -1).Value = Application.WorksheetFunction.CountA(Range("b2:b200")) End If Next i Application.EnableEvents = True End Sub

  • エクセル2003のVBAについて

    次のコードのように、初めにクリックしたセルに、次にクリックしたセルの内容をコピーするVBAを書いたのですが、コピー先の列を、複数指定する方法がわかりません。 たとえば、C~O列(3~15)のように指定できればと思っています。 このようなことは可能でしょうか? ご教授いただけます方、よろしくお願い申し上げます。 -------------------------------------------------- Dim FrstCell As Range Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.MergeCells = False And Target.Count > 2 Then Exit Sub On Error Resume Next '想定しないエラーを無視 If Target.Cells(1) = "" Then If Target.Column <> 3 Then Exit Sub 'C列 コピー先 Set FrstCell = Target.Cells(1) Else If Target.Column <> 18 Then Exit Sub 'R列 コピー元 Target.Copy FrstCell.MergeArea End If On Error GoTo 0 'エラートラップ終了 End Sub

  • excel vba

    VBAに不慣れなので教えてください。 今下記のプログラム(A1セルで青色以外の文字を消去する)はA1セルのみを対象にしているのですが、 (1)セルをA1からA3までにする。 (2)処理対象をA1のある列を対象とするようにしたい。 各々どう手直しすればいいか。 プログラムtest Public Sub test() Dim r As Range Dim i, wk As String Set r = Range("A1") wk = "" For i = 1 To Len(r.Value) Debug.Print r.Characters(i, 1).Font.ColorIndex If r.Characters(i, 1).Font.Color = vbBlue Then wk = wk + r.Characters(i, 1).Text End If Next r.Value = wk r.Characters.Font.Color = vbBlue End Sub

専門家に質問してみよう