dポイントプレゼントキャンペーン実施中!

VBA超初心者です。ネットで検索しながら、達人のものをコピペしながら少しづつ理解して、なんとかexcelを作っています。
しかし、今回、どうにもうまくできないので質問です。

下の様な表があった場合(goo表示の都合上空白は_で記しています。)
セルA1(20)、B1(空白)、C3(40)のみを対象に、
20は"good"、40は"bad"、空白は"エラー"に変換したい。

_ A B C
1 20 _ 40
2 20 20 _
3 40 _ 40

ネットをごんごん調べてたどり着いた達人の書いたものが下記のとおりです。
Arrayの後に検索語と置換語を入れたら、上手く動きましたが範囲の指定をしようとした所でつまづいてます。
Set Set Rng = SelectionをRange("A1,C3")~~~などなど試してみましたが、どうも根本的に違うような。。。どうしたら良いのでしょうか。ご教授の程何卒よろしくお願い申し上げます。

Sub MultiReplacement()
 Dim MyWords As Variant
 Dim MyRepWords As Variant
 Dim Ans As Integer
 Dim Rng As Range
 MyWords = Array("A", "C") 'ここに検索語を入れてください。
 MyRepWords = Array(1, 2) 'ここに置換語を入れてください。
 '検索語と置換語を調べる
 If UBound(MyWords) <> UBound(MyRepWords) Then
  MsgBox "検索語数( " & UBound(MyWords) & _
  " )と置換語数( " & UBound(MyRepWords) & " )数が違います。", 64
  Exit Sub
 End If
 
 Set Rng = Selection 'マウスで範囲を選択してください。
 If Rng.Count = 1 Then
  Ans = MsgBox("セル1つしか選択されていませんが、よろしいですか?", vbYesNo)
  If Ans = vbNo Then
   Exit Sub
  End If
 End If
 '実行
 For i = LBound(MyWords) To UBound(MyWords)
  Cells.Replace What:=MyWords(i), Replacement:=MyRepWords(i), _
  LookAt:=xlPart, _
  MatchCase:=True
 Next i
End Sub

質問者からの補足コメント

  • 皆さま、早急なご回答有難うございます!なのに遅い補足ですみません!
    >san3939だけが使う物でしょうか
    将来的にexcelを全く知らない者も使います。
    >もう少し「実データ」や運用に関して教えてください。
    実は、通販で出品したものを棚に保管する際の保管票を作成するためです(ポス無泣)。出品済CSVをシート1に張付け→シート2は印刷用で4cmx6cm位が並んだ保存票に、シート1の情報が項目別に自動で飛ぶ様にしたかったのです。しかし、CSVの中に状態やらカテゴリIDが数字で表されているため、特定した数字を特定した文言に変換したかったのです。問題は票の価格や備考の文中にそのIDと同じ数字があった場合、そこも変換されてしまうので、セルを指定して変換を行いたいのです。
    >LookAt:=xlPart,MatchCase:=True
    達人のケースでは英文字を他の文言にしていました!だからですね!

      補足日時:2016/06/27 15:54

A 回答 (4件)

達人かどうかは別として、私の昔の古い書き方に似てはいます。


しかし[ツッコミがいがある)書き方かなって思います。(^^;
私が、昔の私にダメ出しするような気がします。

もし、今回のように数値検索では、

  LookAt:=xlPart,
 
は、うまくないなって思います。
本当は、xlWhole にしておいて、20*, 40* などとした方がよいような気がします。今回はこれは手をつけません。

>Set Set Rng = SelectionをRange("A1,C3")~~~などなど試してみましたが、どうも根本的に違うような。。。

非連続であろうがなかろうが、ヒットしたセルを対象とするのですが、特にセルを1つずつ拾う必要はありません。
Range("A1,C3") ではなく、Range("A1","C3") か、Range("A1:C3")です。

MatchCase:=True は、何か理由があるのでしょうか。アルファベットの大文字・小文字を区別するものです。

#2さんの「VBAが異様に長いです。」
Findメソッドってこういうスタイルしかないと思うのです。私の頭では細かく入れることが出来そうにもありませんので、Findメソッドは、最初からテンプレートに入れているのです。

昔は、My と大文字で書いていましたが、今は、myは小文字で書くようになりました。

'//
Sub MultiReplacement2()
  Dim myWords As Variant
  Dim wd As String, rp As String
  Dim myRepWords As Variant
  Dim i As Long
  Dim blkRng As Range
  Dim Rng As Range
  Dim c As Range
  Dim buf As Variant
  Dim FirstAddress As String
  
  wd = "20,40" 'ここに検索語を入れてください。
  rp = "good,bad" 'ここに置換語を入れてください。

  Set Rng = Range("A1:C3")
  myWords = Split(wd, ",")
  myRepWords = Split(rp, ",")
  For i = LBound(myWords) To UBound(myWords)
    buf = InStr(1, rp, myWords(i), vbTextCompare)
    If buf > 0 Then
      MsgBox myWords(i) & "は、検索語と置換後に単語が混じっています。", vbExclamation
    Exit Sub
    End If
  Next i
  Application.ScreenUpdating = False
  If UBound(myWords) <> UBound(myRepWords) Then
    MsgBox "検索語と置換後の数が違っています。", vbExclamation
    Exit Sub
  End If
  On Error Resume Next
  Set blkRng = Rng.SpecialCells(xlCellTypeBlanks)
  On Error GoTo 0
  If Not blkRng Is Nothing Then
    blkRng.Value = "エラー"
  End If
  For i = LBound(myWords) To UBound(myWords)
    With Rng
      Set c = .Find( _
      What:=myWords(i), _
      LookIn:=xlValues, _
      LookAt:=xlPart, _
      SearchOrder:=xlByRows, _
      MatchCase:=False, _
      MatchByte:=False)
      If Not c Is Nothing Then
        FirstAddress = c.Address
        Do
          c = Replace(c.Value, myWords(i), myRepWords(i), , , vbTextCompare)
          Set c = .FindNext(c)
          DoEvents
          If c Is Nothing Then Exit Do
          If c.Address = FirstAddress Then Exit Do
        Loop 'Until c Is Nothing
      End If
    End With
    FirstAddress = ""
  Next i
  Application.ScreenUpdating = True
End Sub

'//
    • good
    • 0
この回答へのお礼

有難う御座いました!早速コピーさせていただき、セルの指定等した所、きれいに動きました!まだテスト段階ではありますが、A4紙3枚分、計48枚の保管票に関数入れてみて、作動するかどうかはが分かるのは28日になりそうですが、おかげさまで一山越えました!やはりVBAは便利ですので、ゆっくりですが基礎から学んでいこうと思います。本当に助かりました。有難う御座いました!

お礼日時:2016/06/27 18:17

「Set Rng =」の部分は、san3939さんの理解で正しいですよ。


もう1点、Replaceのところを修正する必要がありそうです。
(当然ですが、検索語、置換語も修正するのですよね?)
こんな感じです。

Set Rng = Selection 'マウスで範囲を選択してください。
 ↓
Set Rng = Range("A1,B1,C3")


Cells.Replace What:=MyWords(i), Replacement:=MyRepWords(i), _
 ↓
Rng.Replace What:=MyWords(i), Replacement:=MyRepWords(i), _
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!少しでも「正しいですよ」と言われると、嬉しくなりました(笑)ゆっくりですが、やはり基礎から順を追ってネットの講座で学んでいこうかと思います。有難うございました!

お礼日時:2016/06/27 18:11

もう一つ質問です。



ご質問の内容や参考のデータと、VBAと比べると、VBAが異様に長いです。

機密に関わらない範囲で、もう少し「実データ」や運用に関して教えてください。
    • good
    • 0

こんにちは



>VBA超初心者です。
最初にお訊きしたいことがあります。

このプログラムは、san3939だけが使う物でしょうか?
将来的に別の人が使うのであっても、簡単なマニュアルあれば使えいるような内容でしょうか?


・自分がだけが使うプログラム
・他人も使うプログラム
で、作り方が(誤操作や、例外のデータがあったときの処理)が違ってきます。
    • good
    • 0
この回答へのお礼

早急なご返答、本当に有難うございました!早急のタグをつけたのにかかわらず、週明けての補足になり申訳ございません。今後質問する時には、何時・誰が・何処で・何を・どのようにするか、できる限り明白に書くようにします。ありがとうございます!

お礼日時:2016/06/27 18:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!