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

エクセルで日本語で書かれている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 'この行まで

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

  • うれしい

    tom04さま
    ありがとうございます!
    そうなのです、コピペした元は「Part」になっていたので、これが原因かと素人なりな(;^ω^)判断でWholeに変えてみたんですけど変わらないのです。
    文字数で判断となるとこの先の変換文字を増やしていったときに支障が出る気がするのですね。
    たとえば
    建物 Building
    建物附属設備 Interior Work

    Building
    Building附属設備
    なり
    【固定資産】 【Fixed Assets】
    資産の部合計 Total Assets

    【Fixed Assets】
    Assets合計
    になったりするのです。。。。
    特段にセルに長い文字を入れたりはしていないのです。。。
    やりたいことは
    「決算書や試算表の日本語を英語に置き換える」
    なのですね。
    会計ソフトからエクセルに吐き出すことができるので、それで英語変換ができればとm(__)m

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/04/15 14:04
  • つらい・・・

    tom04さま

    数々ありがとうございます。。。
    当方全く素人なので、元のマクロを全部消して、書いていただいたものをコピペしたのですが
    現象は変化なかったです。。。(T_T)
    全く分からなくて。。。すみません・・・・何を確認していいのすらわからず。。。
    お手上げです。。。(T_T)

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/04/15 14:48
  • つらい・・・

    Zongaiさま

    Sheet1の全セルに対して、
    Sheet2の2行目の言葉から順に置換を行っていく、

    というもので間違いないですよね?

    >>>はい、そのとおりです。

    「建物」は「建物附属設備」という言葉【セルに単独で入っている】

    >>>はい
    Sheet2 の
    A1に 建物 B1にBuilding
    A2に建物付属設備 B2にInteriorWork
    という風に入っていて、完全一致の紐づけだけでよいのです・・・
    つまり「建物」は「建物付属設備」とは全く別のもの、という認識を持ちたいのです・・・

    あまりに私が安易に考えすぎなのか、本当に素人すぎて、ここでおたずねするのもお恥ずかしい限りです・・・
    すみません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/04/15 14:54
  • HAPPY

    tom04さま
    ありがとうございます。先ほど書いた補足は事例で、変換コード表は1行目は項目行で
    実際のデータは2行目から記載しております。

    本当にすいません。ありがとうございます。ちょっとゆっくり考えながらやってみます。

    ありがとうございましたm(__)m

    No.6の回答に寄せられた補足コメントです。 補足日時:2019/04/15 15:22

A 回答 (7件)

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
この回答への補足あり
    • good
    • 0
この回答へのお礼

tom04さま
ありがとうございます。あれからもう一度まっさらにしてやり直してみたところ、すっきり無事にできました。
出来なかった理由は、ド素人ゆえ、全くわからないのですが、まずは一歩。ありがとうございました。
zongaiさまにも丁寧にフォローしていただき、両方々をベストアンサーにさせていただきたいところですが
tom04さまの記述をそのままコピペして無事にできたことから、zongaiさまには申し訳ありませんがtom04さまをベストアンサーにさせていただきます。ありがとうございました。

お礼日時:2019/04/16 10:45

ちょっと補足漏れがありましたので訂正。



------------

書かれているものについて、

> wS1.Cells.Replace what:=wS2.Cells(i, "A"), replacement:=wS2.Cells(i, "B"), lookat:=xlWhole

最後の「lookat:=xlWhole」はセルの完全一致で置換するので、
<<Sheet1>>に「建物」は「建物附属設備」という言葉【セルに単独で入っている】のであれば、現状で望んだ通りの結果になるはずです。
<<Sheet1>>に「建物附属設備とは建物の~」と書かれているセルでは全く置換が行われません。

------------

<<Sheet1>> が抜けてました。
    • good
    • 0
この回答へのお礼

zongaiさま
ご丁寧な説明ありがとうございます。
ゆっくり最初から考えてやってみます。
いろんなヒント、ありがとうございました!
m(__)m

お礼日時:2019/04/15 15:25

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」にするのと、
②単語データを文字数が多い順に並べ替え。

変換する場合、この並べ替えをしておくのは割とよく使うテクニックです。
    • good
    • 0

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
この回答への補足あり
    • good
    • 0

書かれてるコードですが、



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」にするのと、
②単語データを文字数が多い順に並べ替え。

変換する場合、この並べ替えをしておくのは割とよく使うテクニックです。
この回答への補足あり
    • good
    • 0

こんにちは!



横からお邪魔します。

コードを拝見すると
>・・・lookat:=xlWhole
となっていますね。
すなわちセル内完全一致の場合のみそのセル全体が置換されます。

というコトは質問文にあるような結果になることはないと思うのですが・・・

もしかしてSheet1のセル内に長文が入っていて、部分一致で置換したいのでしょうかね?

その場合は
>lookat:=xlWhole

>lookat:=xlPart
として、
No1さんが仰っているように文字列の長い順に置換すれば問題ないと思います。

※ 同じ文字長であればどちらが先でも構いません。m(_ _)m
この回答への補足あり
    • good
    • 0

Sheet2の順番が、



建物 | Building
建物附属設備 | Interior Work

の順になっているから、
最初にヒットする「建物 | Building」の変換をしちゃうわけです。

なので、手っ取り早く解決するのは、文字数の多い順番に並べ替えること。

建物附属設備 | Interior Work
建物 | Building

これなら、先に「建物附属設備 | Interior Work」とが「建物〇〇 | △△△」を変換し、
どれにも絡まなかった「建物」が「Building」に変換されます。

Sheet2のC列に
[C1]=LEN(A1)
の式を入れて日本語の文字数を取得、全行コピー。
「データ」タブ→並べ替え→C列大きい順

で並べ替えれば望む結果になると思う。
    • good
    • 0
この回答へのお礼

zongaiさま
ご指示ありがとうございます。
文字の長さ、という観点ではなくSheet2のA列のそれぞれのセルと「完全一致するもの」紐づけB列
としたいのですが
これは全く別の角度からの方法になるのでしょうか?・・・
ご指示の方法ですとこの場合はうまくいきそうですが、同じ文字数で違う表記(例えば「建物付属設備」「建物附属用品」など)は同じ長さでも中身が違うと認識できますでしょうか?
何ともど素人なもので、失礼な発言でしたらお許しください!m(__)m

お礼日時:2019/04/15 13:29

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