プロが教える店舗&オフィスのセキュリティ対策術

EXCEL VBA 単語置き換え について質問です

ブック名 ぶぶぶ
シート名 ししし
セル  V3〜V10 本当はV50000
2行目は、見出しA、見出しB、と右方向へAB2セルまであります。

セルの中身 最大300文字
  日本語文字英数字で、1セルあたり平均80文字入力既にある状態

ざっくり言って 
V列の中に含まれる 特定の文字を指定する文字に置き換えます

置き換え単語は同じブックの別のシートに用意されています

ブック名 ぶぶぶ
シート名 おおお

   列A   列B
行1 モモ   タコ
行2 ハート  ダイヤ
行3 月曜   火曜
行4
この行は1000行 同様にあります

この意味はブック名ぶぶぶ にある
シート名ししし の 列Vにある自由文章の中で 単語モモのあるセルにはタコに置き換えるものです。

置き換えた結果は
列Vを上書きし、
上書きを終えると
ブック名ぶぶぶ
シート名ししし 
この人の中身をそっくり複製して
ブック名 ニュー
シート名 新
これで
ブック名ぶぶぶ 
が保管された同じフォルダ内に新しいブックとして保存します

行がたくさんありますし
置き換えする単語も上から下に複数ありますし わからなくなりました

VBAのコードを
教えてください

A 回答 (3件)

Sub ReplaceWords()


'ブック「ぶぶぶ」のシート「ししし」の範囲を指定
Dim sourceSheet As Worksheet
Set sourceSheet = Workbooks("ぶぶぶ.xlsm").Worksheets("ししし")
Dim lastRow As Long
lastRow = sourceSheet.Cells(Rows.Count, "V").End(xlUp).Row
Dim sourceRange As Range
Set sourceRange = sourceSheet.Range("V3:V" & lastRow)

'置き換える単語を指定
Dim replaceWords() As String
replaceWords = Array("モモ", "ハート", "月曜") '必要に応じて追加

'置き換える文字列があるセルを特定し、置換する
Dim cell As Range
Dim replaceWord As Variant
For Each cell In sourceRange
For Each replaceWord In replaceWords
If InStr(1, cell.Value, replaceWord) > 0 Then
cell.Value = Replace(cell.Value, replaceWord, GetReplacementWord(replaceWord))
Exit For
End If
Next replaceWord
Next cell

'結果を新しいブックに保存
Dim newBook As Workbook
Set newBook = Workbooks.Add
Dim newSheet As Worksheet
Set newSheet = newBook.Worksheets("Sheet1")
sourceSheet.UsedRange.Copy Destination:=newSheet.Range("A1")
newBook.SaveAs Filename:="ニュー.xlsx" '必要に応じて拡張子を変更

End Sub

Function GetReplacementWord(ByVal word As String) As String
'置き換える単語を、別のシートから取得する関数
Dim replaceSheet As Worksheet
Set replaceSheet = Workbooks("ぶぶぶ.xlsm").Worksheets("おおお")
Dim replaceRange As Range
Set replaceRange = replaceSheet.Range("A1:B" & replaceSheet.Cells(Rows.Count, "A").End(xlUp).Row)
Dim replaceCell As Range
For Each replaceCell In replaceRange.Columns(1).Cells
If replaceCell.Value = word Then
GetReplacementWord = replaceCell.Offset(0, 1).Value
Exit Function
End If
Next replaceCell
End Function
    • good
    • 0
この回答へのお礼

ありがとうございます行ってみます大変助かりました

お礼日時:2023/03/08 07:08

No1です。



>ご回答いただいた文章の意味がマクロの記録ボタンを使って手で1行1行下げていけば
>1000行だけ繰り返せばいいという意味でしょうか
えっと・・・
マクロだけでなく、大抵のいわゆる「プログラミング言語」には、繰り返し処理を行う構文が用意されています。
(代表的なのが、For ~ Next のループです)
基本的には、「検索文字列」と「置換え文字列」を可変(=変数化するという意味)にするなど一般化しておいて、上記のループを利用して必要回数繰り返すような構文を利用すれば、実際に記述するのはほぼ一回分の置換え処理で済むという意味です。


ループは大抵の処理(=マシンで大量のデータを自動処理するなど)で利用されるごく基本的な構文ですので、まずはそちらを学習してください。
覚えておいて損は無いはずです。
(繰り返し構文には、「For~Next」以外にも、「Do~Loop」、「Do~While」、「Do~Until」、「While~Wend」、「For Each~Next」などなど、いろいろな種類が用意されていますので、処理内容に応じて使い分けてください。)
https://learn.microsoft.com/ja-jp/office/vba/lan …


どうやら、その分では、セル範囲をマクロで取得する方法もご存じなさそうですね・・
大抵は、最終行を取得できれば(不確定の)セル範囲を求めることができると思いますので、以下が参考になるのではないでしょうか?
(必ずこの方法とは限りませんけれど・・)
https://www.sejuku.net/blog/28929
    • good
    • 0

こんばんは



>VBAのコードを
>教えてください
一回分の置換えのコードなら、置換の操作を「マクロの記録」で記録すれば得られます。
これを少し修正してセット分繰り返せばよさそうですが、問題があります。

キーワードに包含関係が合ったり、置き換え後の文字列の組み合わせが、新しいキーワードに一致したりと、文字列の内容と処理する順序によって異なる結果になる可能性がありそうだからです。

例えば「~~東京~~」の文章がある時に、
1)「東京」→「東京都」
2)「京都」→「京都府」
のような置き換えを行うと、最初の文字は「~~東京都府~~」となるようなことです。
上記の例は単純ですが、もっと複雑に、置換え文字列と元からある文字が連続する部分でも同様のことが起こり得るので、この辺りをどのように処理するのかを、あらかじめ考えておいた方がよさそうに思われます。
    • good
    • 0
この回答へのお礼

文字の大きさの順番は現在人間が判断して留意することで処理しています

VBA のことをよく知らないですが
おそらく列Vをえらび
コンピューターはシェル V さんにある自由文章を読み込んで
置き換える単語が モモがヒットすれば列vにある単語モモを
すべてタコに置き換えるのでしょう
そして次にコンピューターは同じく列vにある単語ハートがヒットすればダイヤに置き換えるのでしょう

私がわからないのは
単語モモを置き換えた時に
一行下がってハートの単語を列vについて置き換えるところです

ご回答いただいた文章の意味がマクロの記録ボタンを使って手で1行1行下げていけば1000行だけ繰り返せばいいという意味でしょうか
それはしたくないです

該当欄への書き込みありがとうございます

お礼日時:2023/03/08 02:22

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