VBAコードにおける数字の削除方法と、その問題についての解決策

このQ&Aのポイント
  • VBAコードを使用して特定の範囲内のセルから数字を取り除く方法について質問があります。
  • コードを実行した際、一部のセルでは数字が正常に取り除かれる一方で、他のセルでは数字が残ってしまう場合があります。
  • 公開変数を使用している他の関連コードもあるため、問題は文字列またはデータの問題かどうか判断できません。解決策やアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

VBA Replaceで

Win7、Excel2010使用。 VBAにて下記のコードを作成。 シート内のある範囲において、セル中に漢字と数字(算用)が 混在した文字列があり、Replaceにて数字を取り除く為に作成 しましたが、実行したところ、正常に動作して全て取り除ける場合と、 そのまま数字が全て残る場合があります。 指定した範囲は、別のブックから値のみコピーして 貼り付けたもので、書式は「標準」にしています。 ※元データも「標準」の文字列です。 下記コード以外でもいくつか試しましたが、改善見られなかっ為、 コードの問題ではなく、文字列の問題なのかなとも思いましたが、 よくわかりませんでした。 解決策などがありましたら教えて頂けると助かります。 よろしくお願いします。 =(VBAコード)= Sub NumDell() '余分な数字を削除します。 Application.Calculation = xlCalculationManual Dim r As Long Dim c As Long Dim i As Long  Call hen 'Public変数を設定。単独実行時のみ For r = 53 To Lr2 Step 2 For c = 3 To dc If c = 9 Then Stop End If With Cells(r, c) For i = 1 To 9 .Replace CStr(i), "" .Replace StrConv(CStr(i), vbNarrow), "" Next i End With Next c Next r Application.Calculation = xlCalculationAutomatic End Sub ------------------------- ※変数は、関連コードあるため、Public変数を使用しています。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 ' /// 余分な数字を削除します。 Sub Re8766547()   Application.Calculation = xlCalculationManual Dim r As Long ' Dim c As Long ' 以下の記述では使っていません Dim i As Long   Call hen '単独実行時のみPublic変数を設定します。   For r = 53 To Lr2 Step 2     For i = 0 To 9       Cells(r, 3).Resize(, dc - 2).Replace _         What:=CStr(i), Replacement:="", _         LookAt:=xlPart, SearchOrder:=xlByRows, _         MatchByte:=False     Next i   Next r   Application.Calculation = xlCalculationAutomatic End Sub Replace メソッドを使う例としては以上のような感じです。 (単セル毎に処理するのは非効率なので)セルブロック毎(各行毎)に置換処理すること と、 名前付き引数 LookAt MatchByte について正しく理解した上で活用すること が、 ポイントになります。 VBAのヘルプでもいいですから、.Replace メソッドの各引数の意味等について 確認してみて下さい。 因みにCStr()関数は使っても使わなくても結果は一緒です。 ∵名前付き引数 What はVariant型だから。 それと。Stop ステートメントについてですが、 特に説明が無いようですから、 これは、専ら、デバッグ&トレース用、動作の確認用 の記述という判断で、こちらが書いたコードには反映させていません。 敢えて Stop させるなら、Next i と Next r の間の行あたりでしょうか。 以上です。

-antsu-
質問者

お礼

早速の回答ありがとうございます。 おかげさまで正常に動作するようになりました。 独学だった為、知識がまだまだ不十分で、 引数についても、あまり気にすることなく スルーに近い状態でした。 コードの作成方法についても 大変勉強になりました。 もっとスキルアップしていきたいと思います。

関連するQ&A

  • 【vba】「CStr」と「Str」は同じ意味ですか?

    Sub 数値を文字型に変更() Dim i As Long Dim moji As String i = 1 moji = CStr(i) moji = Str(i) End Sub 上記のコードで得られる結果は同じです。 "1"になります。 「CStr」でも「Str」でも数値を文字列に変換しています。 ということは「CStr」でも「Str」は同じなのですか? しかしコードの表示色が 「CStr」→キーワード 「Str」→識別子 です。 これが違うと言うことは何かが違うのでしょうか?  よろしくお願いします。

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • VBA教えて下さい

    VBA初心者です やりたいこと 変数を宣言し 今開いているシート(activesheet)に for nextを使用し 列5~20を調べ 行3~5を指定し もし、5~20列の2行目のどれかに”No.8”という文字があれば(ここまでのコードは書けました) その当てはまる列の3~5行を選択し(1) 更に、(1)の下2列を選択する(2) そして、(1)と(2)を結合させる といったコードが書きたいです 考えたコード Sub test() Dim i As Long Dim j As Long With ActiveSheet For j = 5 To 20 For i = 3 To 5 If .Cells(j, 2) Like "*No.8*" Then 'ここからがわかりません End If Next i Next j End With End Sub 変な書き方なので例えを書きます A1セルにNo.8の文字があれば E1セルとF1セルを選択し 更に、E3セルとF3セルも選択し E1セルとF3まとめてセルを結合といったことがしたいです。 質問頂ければ追記しますm(ーー)m おそらくoffsetを使用して選択すると思うのですが上手く出来ませんでした 回答お願い致します

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

  • クラスモジュールについて

    下記のコードは平均値を出すコードを作ったのですが、B列に文字列を含むとエラーになってしまいます。なのでB列に数字以外のものが入っている状態でも動くようにしたいのですが、お詳しい方アドバイスお願いします。 ' 標準モジュール Public Sub 平均値() Dim dct As Object Dim bot As Long Dim k As Variant Dim r As Long Dim itm As Class1 Set dct = CreateObject("Scripting.Dictionary") bot = Cells(Rows.Count, "A").End(xlUp).Row For r = 2 To bot k = CStr(Cells(r, "A").Value) If dct.Exists(k) Then Set itm = dct(k) Else Set itm = New Class1 dct.Add k, itm End If itm.Sum Cells(r, "B").Value Next For r = 2 To bot Cells(r, "C").Value = dct(CStr(Cells(r, "A").Value)).Avg() Next End Sub ' クラスモジュール(オブジェクト名「Class1」) Private total As Double Private cnt As Long Public Sub Sum(ByVal v As Double) total = total + v cnt = cnt + 1 End Sub Public Function Avg() As Double Avg = total / cnt End Function

  • 連続した数字で一部飛び飛びの数字がある場合

    連続した数字で一部飛び飛びの数字がある場合 行を挿入して数字を記入するにはどうすればいいですか マクロのコードを作ったのですが Sub Try1() Dim r As Range, r2 As Range, c As Range Dim i As Long Dim max As Long Dim min As Long With ActiveSheet.[A1].CurrentRegion '[D]列の最後のセル Set r2 = .Cells(.Rows.Count, "D") '[D]列データ範囲 Set r = .Range("D2", r2) 'データ 最大 最少 min = r(1).Value max = r2.Value ReDim a(min To max) As String For i = min To max: a(i) = CStr(i): Next 'min ~ max に 番号を振る For Each c In r a(c.Value) = "x" '実際にある番号の位置は "x" に書き換える Next a = Filter(a, "x", False) 'a配列の中から 「"x"でない」要素を抽出。 r2.Offset(1).Resize(UBound(a) + 1).Value = Application.Transpose(a) '欠損番号を[D]列に追加 ◆ End With With ActiveSheet.[A1].CurrentRegion .Sort Key1:=.Columns(4), Header:=xlYes 'D列で並び替える End With End Sub  min = r(1).Value の所で型が一致しませんとでます 数字はDれつにあります

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • VBAで教えてください。

    以前ここで教えていただいたVBAで http://jisaku.155cm.com/src/1371930716_9b9006528605642980beed48a8998013b0731e4b.jpg のようにA列のテスト4をクリックしたときにC列のテスト4が一発で解るようにしたいです。 もちろん、テスト11をクリックしたときは、テスト4塗りつぶしは解除され、 テスト11が塗りつぶされるようにしたいです。 写真は塗りつぶししていますが、解るようにしたいだけなので、塗りつぶしにはこだわっていません。 あと、E、F、G列は解りやすく並べているだけで、実際はA、B、C列だけです。 それと、C列は関数を使って表示してあります。 という質問で Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("C:C").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("A:A")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "C") = Target Then Cells(i, "C").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで をシートのコードに張り付ければいいですよ。と教えてくれたものがあるのですが、 A列でクリックした文字をC列からすべて見つけて反転してくれないようです。何個か反転してくれない ものが出てきてしまいました。 C列が何百行とかなってしまうと、すべての同じ文字を検索してくれないのでしょうか? ちなみに列がここに掲載しているものと違うので Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("R:R").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("B:B")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "R") = Target Then Cells(i, "R").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで のCをRにAをBに変更して使ってます。 これがいけないのかな? よろしくお願いします。

専門家に質問してみよう