![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エクセルで日本語で書かれているsheet1をsheet2にある英語変換表を用いて英語に変換したいのですが、以下のマクロで実行すると、
例えば「建物」は「Building」になるのですが「建物附属設備」は「Interior Work」に変換されるべきところ「Building付属設備」となってしまいます。
他にも置換リストに同様の参照事項があると、同様に「日本語+英語のミックス」になるのですが
これはどのように改善すればよろしいでしょうか?
マクロは全くの素人で、ネットでこのようなことを書いてくださっている記述をコピペしただけなので、ド初心者にどうぞよろしくご指導ください。m(__)m
Sub 置換() 'この行から
Dim i As Long, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
For i = 2 To wS2.Cells(Rows.Count, "A").End(xlUp).Row
wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlWhole
Next i
End Sub 'この行まで
No.6ベストアンサー
- 回答日時:
No.2・4です。
ん~~~
何も変化なしですかぁ~~?
こちらではちゃんと置換できたのでそのままコードを記載したのですが・・・
一つ気になるのは、Zongaiさまの補足欄に
>A1に 建物 B1にBuilding
>A2に建物付属設備 B2にInteriorWork
とありますね。
お示しのコードはSheet2の2行目以降のループになっているので
当然1行目は項目行で置換データは2行目以降にあるものだとして投稿しました。
もし1行目から置換データがあるのであれば
前回のコードの変更が必要です。
Sub 置換2()
Dim i As Long, lastRow As Long
Dim wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
lastRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row
wS2.Range("A:A").Insert
Range(wS2.Cells(1, "A"), wS2.Cells(lastRow, "A")).Formula = "=LEN(B1)"
wS2.Range("A1").CurrentRegion.Sort key1:=wS2.Range("A1"), order1:=xlDescending, Header:=xlNo
wS2.Range("A:A").Delete
For i = 1 To wS2.Cells(Rows.Count, "A").End(xlUp).Row
wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlPart
Next i
End Sub
こんな感じになると思います。
※ 変更箇所はご自身で確認してみてください。m(_ _)m
tom04さま
ありがとうございます。あれからもう一度まっさらにしてやり直してみたところ、すっきり無事にできました。
出来なかった理由は、ド素人ゆえ、全くわからないのですが、まずは一歩。ありがとうございました。
zongaiさまにも丁寧にフォローしていただき、両方々をベストアンサーにさせていただきたいところですが
tom04さまの記述をそのままコピペして無事にできたことから、zongaiさまには申し訳ありませんがtom04さまをベストアンサーにさせていただきます。ありがとうございました。
No.7
- 回答日時:
ちょっと補足漏れがありましたので訂正。
------------
書かれているものについて、
> wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlWhole
最後の「lookat:=xlWhole」はセルの完全一致で置換するので、
<<Sheet1>>に「建物」は「建物附属設備」という言葉【セルに単独で入っている】のであれば、現状で望んだ通りの結果になるはずです。
<<Sheet1>>に「建物附属設備とは建物の~」と書かれているセルでは全く置換が行われません。
------------
<<Sheet1>> が抜けてました。
zongaiさま
ご丁寧な説明ありがとうございます。
ゆっくり最初から考えてやってみます。
いろんなヒント、ありがとうございました!
m(__)m
No.5
- 回答日時:
Sheet1 と Sheet2 がごちゃごちゃに解釈されてしまってるようなので、
強調して書いてみました。
なお、完全一致で変換するなら「Building付属設備」のような変換はありえません。
これは部分一致です。
このへんの言葉と動作の認識もおかしな感じになっちゃってますね。
----------------------------------
書かれてるコードですが、
<<Sheet1>>の全セルに対して、
<<Sheet2>>の2行目の言葉から順に置換を行っていく、
というもので間違いないですよね?
------------
書かれているものについて、
> wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlWhole
最後の「lookat:=xlWhole」はセルの完全一致で置換するので、
「建物」は「建物附属設備」という言葉【セルに単独で入っている】のであれば、現状で望んだ通りの結果になるはずです。
「建物附属設備とは建物の~」と書かれているセルでは全く置換が行われません。
------------
「lookat:=xlPart」にすると、セルの部分一致で置換します。
<<Sheet1>>
「建物」
「建物附属設備」
「建物附属設備とは建物の~」
と書かれているセルがあるとしたら、
まず、<<Sheet2>>で、より上にある「建物」で変換が行われ
<<Sheet1>>
「Building」
「Building附属設備」
「Building附属設備とはBuildingの~」
となり、<<Sheet2>>で「建物」より下の行にある「建物附属設備」を変換しようにも既にその言葉は存在しない状態になってしまいます。
失敗ですね。
------------
で・・・・
<<Sheet2>>の順番を文字数が長い順番に並び替えると・・・
まず、<<Sheet2>>で順位が上にある「建物附属設備」で変換が行われ
<<Sheet1>>
「建物」
「Interior Work」
「Interior Workとは建物の~」
となり、<<Sheet2>>で「建物附属設備」より下の行にある「建物」が後から変換されるので
<<Sheet1>>
「Building」
「Interior Work」
「Interior WorkとはBuildingの~」
という変換結果になります。
たぶん、コレが望む結果ですよね。
------------
勘違いされておられるようですが、
文字数で判断していません!
文字数は変換の優先度を決めるための順番に並べ替えるためにつかっているだけ。
変換には関わってきません。
「建物」「建物附属設備」「建物附属用品」の言葉があった場合、
文字数が多い順から並べると
<<Sheet2>>
「建物附属設備」
「建物附属用品」
「建物」
の順番になるでしょ?(1番目と2番めは逆になるかもしれないけど、影響なし)
この順番で<<Sheet1>>を変換していくことになります。
------------
こんな説明でどうでしょう。
やることは・・・
①「lookat:=xlPart」にするのと、
②単語データを文字数が多い順に並べ替え。
変換する場合、この並べ替えをしておくのは割とよく使うテクニックです。
No.4
- 回答日時:
No.2です。
今後Sheet2のデータが増えても対応する方法にしてみました。
Sheet2のA列の文字数の降順に並び替えをするコードを加えています。
↓のコードではどうでしょうか?
Sub 置換()
Dim i As Long, lastRow As Long '//←変数の追加★//
Dim wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
'//▼ここから追加//
lastRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row
wS2.Range("A:A").Insert
wS2.Range("A1") = "ダミー"
Range(wS2.Cells(2, "A"), wS2.Cells(lastRow, "A")).Formula = "=LEN(B2)"
wS2.Range("A1").CurrentRegion.Sort key1:=wS2.Range("A1"), order1:=xlDescending, Header:=xlYes
wS2.Range("A:A").Delete
'//▲ここまで
For i = 2 To wS2.Cells(Rows.Count, "A").End(xlUp).Row
wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlPart '//★//
Next i
End Sub
※ マクロを実行するたびに、Sheet2の並び替えを行っていますので、
文字列の長さは気にしなくてよいと思います。m(_ _)m
No.3
- 回答日時:
書かれてるコードですが、
Sheet1の全セルに対して、
Sheet2の2行目の言葉から順に置換を行っていく、
というもので間違いないですよね?
------------
書かれているものについて、
> wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlWhole
最後の「lookat:=xlWhole」はセルの完全一致で置換するので、
「建物」は「建物附属設備」という言葉【セルに単独で入っている】のであれば、現状で望んだ通りの結果になるはずです。
「建物附属設備とは建物の~」と書かれているセルでは全く置換が行われません。
------------
「lookat:=xlPart」にすると、セルの部分一致で置換します。
「建物」
「建物附属設備」
「建物附属設備とは建物の~」
と書かれているセルがあるとしたら、
まず、Sheet2で、より上にあり「建物」で変換が行われ
「Building」
「Building附属設備」
「Building附属設備とはBuildingの~」
となり、それより下の行にある「建物附属設備」を変換しようにも素手にその言葉は存在しない状態になってしまいます。
失敗ですね。
------------
で・・・・
Sheet2の順番を文字数が長い順番に並び替えると・・・
まず、Sheet2で順位が上にある「建物附属設備」で変換が行われ
「建物」
「Interior Work」
「Interior Workとは建物の~」
となり、それより下の行にある「建物」が後から変換されるので
「Building」
「Interior Work」
「Interior WorkとはBuildingの~」
という変換結果になります。
たぶん、コレが望む結果ですよね。
------------
勘違いされておられるようですが、
文字数で判断していません!
文字数は変換の優先度を決めるための順番に並べ替えるためにつかっているだけ。
変換には関わってきません。
「建物」「建物附属設備」「建物附属用品」の言葉があった場合、
文字数が多い順から並べると
「建物附属設備」
「建物附属用品」
「建物」
でしすよね?
この順番で変換していくだけです。
------------
こんな説明でどうでしょう。
やることは・・・
①「lookat:=xlPart」にするのと、
②単語データを文字数が多い順に並べ替え。
変換する場合、この並べ替えをしておくのは割とよく使うテクニックです。
No.2
- 回答日時:
こんにちは!
横からお邪魔します。
コードを拝見すると
>・・・lookat:=xlWhole
となっていますね。
すなわちセル内完全一致の場合のみそのセル全体が置換されます。
というコトは質問文にあるような結果になることはないと思うのですが・・・
もしかしてSheet1のセル内に長文が入っていて、部分一致で置換したいのでしょうかね?
その場合は
>lookat:=xlWhole
を
>lookat:=xlPart
として、
No1さんが仰っているように文字列の長い順に置換すれば問題ないと思います。
※ 同じ文字長であればどちらが先でも構いません。m(_ _)m
No.1
- 回答日時:
Sheet2の順番が、
建物 | Building
建物附属設備 | Interior Work
の順になっているから、
最初にヒットする「建物 | Building」の変換をしちゃうわけです。
なので、手っ取り早く解決するのは、文字数の多い順番に並べ替えること。
建物附属設備 | Interior Work
建物 | Building
これなら、先に「建物附属設備 | Interior Work」とが「建物〇〇 | △△△」を変換し、
どれにも絡まなかった「建物」が「Building」に変換されます。
Sheet2のC列に
[C1]=LEN(A1)
の式を入れて日本語の文字数を取得、全行コピー。
「データ」タブ→並べ替え→C列大きい順
で並べ替えれば望む結果になると思う。
zongaiさま
ご指示ありがとうございます。
文字の長さ、という観点ではなくSheet2のA列のそれぞれのセルと「完全一致するもの」紐づけB列
としたいのですが
これは全く別の角度からの方法になるのでしょうか?・・・
ご指示の方法ですとこの場合はうまくいきそうですが、同じ文字数で違う表記(例えば「建物付属設備」「建物附属用品」など)は同じ長さでも中身が違うと認識できますでしょうか?
何ともど素人なもので、失礼な発言でしたらお許しください!m(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Excel(エクセル) vba 転記するときの最終行について 2 2022/09/03 09:31
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ミステリという勿れ11巻に出て...
-
日本で一番面積が広い建物は、S...
-
【戦争時に空爆されたら建物の...
-
国公立大より私立大の方が建物...
-
無窓階の窓の数え方
-
京アニで沢山人が死にましたが...
-
新幹線から見える福山駅付近に...
-
大規模リフォームについて(建...
-
違法建築物?
-
電気室の防火対象物区分について
-
ポール灯の基礎サイズについて
-
正誤問題なのですが、
-
石屋製菓のチョコレートファク...
-
建ぺい率がオーバーしている家...
-
千葉刑務所の保護室のトイレの...
-
エレベーターのB1って
-
府中市で一番高い建物は何?
-
美濃太田駅の近くで24時間あい...
-
USJのあの建物の中は
-
勤労青少年センター・勤労者プ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ミステリという勿れ11巻に出て...
-
避雷針というのがあるとネット...
-
日本で一番面積が広い建物は、S...
-
高層ビルに付いてる赤い点滅ランプ
-
ポール灯の基礎サイズについて
-
建物解体のときのおはらい。 ...
-
雨に濡れない方法教えてください
-
避雷設備について
-
違法建築物?
-
圧縮記帳と積立金
-
幹線道路沿いに住んでいます。...
-
ビル建設用のクレーンはどうや...
-
土地家屋調査士
-
府中市で一番高い建物は何?
-
地下設置の給水タンクは違法な...
-
電気室の防火対象物区分について
-
岩城滉一さん主演のペット探偵...
-
京アニで沢山人が死にましたが...
-
イギリスの「アセニアン・クラ...
-
無窓階の窓の数え方
おすすめ情報
tom04さま
ありがとうございます!
そうなのです、コピペした元は「Part」になっていたので、これが原因かと素人なりな(;^ω^)判断でWholeに変えてみたんですけど変わらないのです。
文字数で判断となるとこの先の変換文字を増やしていったときに支障が出る気がするのですね。
たとえば
建物 Building
建物附属設備 Interior Work
が
Building
Building附属設備
なり
【固定資産】 【Fixed Assets】
資産の部合計 Total Assets
が
【Fixed Assets】
Assets合計
になったりするのです。。。。
特段にセルに長い文字を入れたりはしていないのです。。。
やりたいことは
「決算書や試算表の日本語を英語に置き換える」
なのですね。
会計ソフトからエクセルに吐き出すことができるので、それで英語変換ができればとm(__)m
tom04さま
数々ありがとうございます。。。
当方全く素人なので、元のマクロを全部消して、書いていただいたものをコピペしたのですが
現象は変化なかったです。。。(T_T)
全く分からなくて。。。すみません・・・・何を確認していいのすらわからず。。。
お手上げです。。。(T_T)
Zongaiさま
Sheet1の全セルに対して、
Sheet2の2行目の言葉から順に置換を行っていく、
というもので間違いないですよね?
>>>はい、そのとおりです。
「建物」は「建物附属設備」という言葉【セルに単独で入っている】
>>>はい
Sheet2 の
A1に 建物 B1にBuilding
A2に建物付属設備 B2にInteriorWork
という風に入っていて、完全一致の紐づけだけでよいのです・・・
つまり「建物」は「建物付属設備」とは全く別のもの、という認識を持ちたいのです・・・
あまりに私が安易に考えすぎなのか、本当に素人すぎて、ここでおたずねするのもお恥ずかしい限りです・・・
すみません。
tom04さま
ありがとうございます。先ほど書いた補足は事例で、変換コード表は1行目は項目行で
実際のデータは2行目から記載しております。
本当にすいません。ありがとうございます。ちょっとゆっくり考えながらやってみます。
ありがとうございましたm(__)m