人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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



●質問者: hananeko_0
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:as NeXT sub スッキリ マクロ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Mook
●40ポイント ベストアンサー

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


上のやり方は 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


2 ● slapshock
●15ポイント

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

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

◎質問者からの返答

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

ありがとうございます!


3 ● kn1967
●20ポイント
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のポイント

◎質問者からの返答

正しく動作しましたっ!

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

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

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

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


4 ● きゃづみぃ
●20ポイント

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

◎質問者からの返答

正しい結果がでました!

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ