ExcelVBAです。


A列にある「鈴木」「佐藤」の文字列を「総務部」に一気に置換したいのですが
下記マクロですと、表全体に対して置換してしまいます。
A列だけ置換し、A列以外にある「鈴木」「佐藤」はそのままにしたいのですが
どうしたらいいでしょうか?

Sub test01()
Dim x As Variant
Dim i As Integer

x = Split("鈴木、佐藤", "、")
For i = LBound(x) To UBound(x)
ActiveSheet.UsedRange.Replace What:=x(i), Replacement:="総務部", LookAt:=xlPart
Next
End Sub

ちなみにこの設定が複数あるので
「伊藤」「高橋」だったら「営業部」
「高田」「斉藤」だったら「企画部」のように
スッキリしたマクロになれば一番理想的なのですが
今の私ですと、変数を変えるだけで縦に長々と書くことになりそうです。

もし他にやり方があれば教えていただけますでしょうか?
宜しくお願い致します。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2008/07/29 01:14:00
  • 終了:2008/07/29 20:14:09

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912008/07/29 09:08:36

ポイント40pt

すでに多数回答が付いているので解決したかもしれませんが、二つのやり方でサンプルを作成してみました。


上のやり方は hananeko 0 さんがやろうとしたように、マクロだけで行う方法です。

下のやり方は、変換データを作業用のワークシートに記載してから実行する方法です。


どちらでも同じ結果になると思いますので、やりやすい方で試してみてください。

'--------------------------------------------------------------------------------
'
' 配列を使用するやり方。
'
' cnbTable に変換するリストを例のように記載して、変換するシートを表示して実行する
'
'--------------------------------------------------------------------------------
Sub nameConvertAR()
'--------------------------------------------------------------------------------
    Dim cnvTable
'★ 変換リストを => ではさんで列挙する。
    cnvTable = Array("佐藤=>総務", "鈴木=>総務", "伊藤=>営業部", "高橋=>営業部", "高田=>企画部", "斉藤=>企画部")
    
    Dim ar, dt
    For Each dt In cnvTable
        ar = Split(dt, "=>")
        Columns(1).Replace what:=ar(0), replacement:=ar(1), lookat:=xlWhole
    Next
End Sub



'--------------------------------------------------------------------------------
' 作業シートを使用するやり方。
'
' 新しいシートを用意し、A列に変換前の名前、B列に変換後の名称を対にして記載する
' 下記の★1の部分に変換先のシート名
'    ★2の部分に用意した変換テーブルのシート名
' を記載し、実行する。
'
'--------------------------------------------------------------------------------
Sub nameConvertWS()
'--------------------------------------------------------------------------------
    Dim dstWS As Worksheet
    Dim srcWS As Worksheet
    
    Set dstWS = Worksheets("Sheet1")  '★1 変換するシート
    Set srcWS = Worksheets("Sheet2")  '★2 変換するデータのあるシート:A列に名前、B列に置換名
    
    Dim r As Long
    r = 1

    Do While srcWS.Cells(r, "A") <> "" And srcWS.Cells(r, "B") <> ""
        dstWS.Columns(1).Replace what:=srcWS.Cells(r, "A").Value, replacement:=srcWS.Cells(r, "B").Value, lookat:=xlWhole
        r = r + 1
    Next
End Sub

http://officetanaka.net/excel/vba/function/Replace.htm

その他の回答(3件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912008/07/29 09:08:36ここでベストアンサー

ポイント40pt

すでに多数回答が付いているので解決したかもしれませんが、二つのやり方でサンプルを作成してみました。


上のやり方は hananeko 0 さんがやろうとしたように、マクロだけで行う方法です。

下のやり方は、変換データを作業用のワークシートに記載してから実行する方法です。


どちらでも同じ結果になると思いますので、やりやすい方で試してみてください。

'--------------------------------------------------------------------------------
'
' 配列を使用するやり方。
'
' cnbTable に変換するリストを例のように記載して、変換するシートを表示して実行する
'
'--------------------------------------------------------------------------------
Sub nameConvertAR()
'--------------------------------------------------------------------------------
    Dim cnvTable
'★ 変換リストを => ではさんで列挙する。
    cnvTable = Array("佐藤=>総務", "鈴木=>総務", "伊藤=>営業部", "高橋=>営業部", "高田=>企画部", "斉藤=>企画部")
    
    Dim ar, dt
    For Each dt In cnvTable
        ar = Split(dt, "=>")
        Columns(1).Replace what:=ar(0), replacement:=ar(1), lookat:=xlWhole
    Next
End Sub



'--------------------------------------------------------------------------------
' 作業シートを使用するやり方。
'
' 新しいシートを用意し、A列に変換前の名前、B列に変換後の名称を対にして記載する
' 下記の★1の部分に変換先のシート名
'    ★2の部分に用意した変換テーブルのシート名
' を記載し、実行する。
'
'--------------------------------------------------------------------------------
Sub nameConvertWS()
'--------------------------------------------------------------------------------
    Dim dstWS As Worksheet
    Dim srcWS As Worksheet
    
    Set dstWS = Worksheets("Sheet1")  '★1 変換するシート
    Set srcWS = Worksheets("Sheet2")  '★2 変換するデータのあるシート:A列に名前、B列に置換名
    
    Dim r As Long
    r = 1

    Do While srcWS.Cells(r, "A") <> "" And srcWS.Cells(r, "B") <> ""
        dstWS.Columns(1).Replace what:=srcWS.Cells(r, "A").Value, replacement:=srcWS.Cells(r, "B").Value, lookat:=xlWhole
        r = r + 1
    Next
End Sub

http://officetanaka.net/excel/vba/function/Replace.htm

id:slapshock No.2

slapshock回答回数264ベストアンサー獲得回数152008/07/29 01:35:52

ポイント15pt

UsedRangeの部分をRange("A:A")に変更すればいけますよ

http://www.q.hatena.co.jp(URLはダミーです。)

id:hananeko_0

Range("A:A")に変更したら、A列のみ置換しましたっ

ありがとうございます!

2008/07/29 20:01:31
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012008/07/29 04:57:48

ポイント20pt
Sub test01()
  Dim Men(2) As String
  Dim x As Variant
  Dim i As Integer,k As Integer  
  
  Men(0) = "総務部,鈴木,佐藤"
  Men(1) = "企画部,高田,斎藤"
  Men(2) = "営業部,伊藤,高橋"

  For i = 0 To 2
    x = Split(Men(i), ",")
    For k = 1 To UBound(x)
      ActiveSheet.Range("A:A").Replace What:=x(k), Replacement:=x(0), LookAt:=xlPart
    Next k
  Next i
End Sub

御覧の通りForループは i が部署で k が所属メンバーという形で二重になります。

x(0)には部署名が入っているので k のループは 1 からスタートさせるのがミソです。

データを作る際にも楽だと思いますが、いかがでしょう。


↓ URL必須ということで LBound() と UBound() の話をチョイス。

VBAのポイント

id:hananeko_0

正しく動作しましたっ!

>x(0)には部署名が入っているので k のループは 1 からスタートさせるのがミソです。

なるほど!ループの使い方、勉強になりました!他にも応用できそうです。

大変助かりました <(_ _)>

URLもありがとうございます!

2008/07/29 20:09:48
id:taknt No.4

きゃづみぃ回答回数13538ベストアンサー獲得回数11982008/07/29 05:46:45

ポイント20pt

Columns(1).Replace What:="鈴木", Replacement:="総務部", LookAt:=xlPart, SearchOrder:=xlByRows, SearchFormat:=False, ReplaceFormat:=False

Columns(1).Replace What:="佐藤", Replacement:="総務部", LookAt:=xlPart, SearchOrder:=xlByRows, SearchFormat:=False, ReplaceFormat:=False

このように 置換したい言葉で 行を 増やせばいいですよ。

ちなみに Columns(1)というのは A列という意味です。

数字を変更すれば 違う列を指定できます。

http://q.hatena.ne.jp/answer

id:hananeko_0

正しい結果がでました!

他にも色々応用できそうです!

ありがとうございました!

2008/07/29 20:11:23
  • id:slapshock
    自分の書いたものに対し補足です。


    質問者さんが作ったプログラムを少し変えて使いやすくしました。
    これだと名前、部署を変える場合でも簡単に行えます。

    Sub test01()
    namae = Split("鈴木、佐藤", "、")
    Call test02(namae, "総務部")
    namae = Split("山下", "、")
    Call test02(namae, "総務部")
    End Sub

    Sub test02(namae As Variant, shozoku)
    Dim i As Integer

    For i = LBound(namae) To UBound(namae)
    ActiveSheet.Range("A:A").Replace What:=namae(i), Replacement:=shozoku, LookAt:=xlPart
    Next
    End Sub
  • id:hananeko_0
    test01の方に色々なパターンを入れて実行したら
    簡単に行えました!

    かなり使いやすくなりました!
    本当にありがとうございますっ <(_ _)>

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません