[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『環境依存文字を変換したい』(うえの)
文字を変換したい者です。よろしくお願いします。
実際のデータの列はAA列まであります。行はシートによって違います。下のサンプルデータの中で、環境依存文字を常用漢字に変換したいです。
この質問を投稿した時に、正しく表示されているかわからないので、変えたいセルの漢字の感じを説明します。
A B C
1 儀 忠
2 㐂
3 蔵
4 峰 㭭
5 貴
6 偠
7
8 産 勌
9
10 傺
B2(七が、”森”状に並んでいます) → 『喜』に
B6(にんべんに、”要”) → 『要』に
C4(木へんに、『別』) → 『別』に
C8(左側は『巻』、右側は『力』) → 『券』に
C10(にんべんに、『祭』) → 『祭』に
このように変えたいのです。VBA超初心者のため、マクロのコードをインターネットで調べて、
下のようにしました。
Option Explicit
Sub 変える()
Dim 最終行 As Long 最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Dim セル As Range For Each セル In Range("B3:C" & 最終行) If セル.Value <> "" Then セル.Value = Replace(セル.Value, "㐂", "七") End If Next セル End Sub
VBAのコード画面では、【セル.Value = Replace(セル.Value, "㐂", "七")】の "七" の前の "㐂"が、半角のクエスチョンになってしまいます。
上で説明した、5つの文字が全部クエスチョンになってしまいます。
どのようにして変えたらいいのでしょうか。宜しくお願い致します。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
EXCEL は UNICODE に対応しているのですが、VBE はUNICODE に対応していません。 A1、A2 セルにそれぞれの文字を描けば セル.Value = Replace(セル.Value, Range("A1").Value, Range("A2").Value) とは書けそうです。 あるいは文字コードを調べて、Chrw 関数で文字を指定することもできます。 セル.Value = Replace(セル.Value, ChrW(&H3402), "七") http://support.microsoft.com/kb/408879/ja http://support.microsoft.com/kb/404928/ja (Mook) 2013/12/19(木) 01:26
Sub 変える()
Dim 変換 As Range
Set 変換 = Range("A1:AA100")
Application.ScreenUpdating = False With 変換
.Replace What:=Sheet1.Range("B2"), Replacement:="喜" .Replace What:=Sheet1.Range("B6"), Replacement:="要" .Replace What:=Sheet1.Range("C4"), Replacement:="別" .Replace What:=Sheet1.Range("C8"), Replacement:="券" .Replace What:=Sheet1.Range("C10"), Replacement:="祭"
End With
Application.ScreenUpdating = True End Sub
'シート名はsheet1としてます、環境にあわせてください。
'.Replace What:=Sheet1.Range(""), Replacement:=""を必要分追加 '範囲はとりあえずA1:AA100にしています。
マクロに(㐂)文字を貼り付けると?となってしまいます。
With MyR .Replace What:="㐂", Replacement:="喜" ↓ .Replace What:="?", Replacement:="喜"
End With
(そばぼーろ) 2013/12/19(木) 02:15
(うえの) 2013/12/19(木) 05:39
(うえの) 2013/12/19(木) 08:04
>”B2”とか指定できないのです。200個くらいあります。
一か所指定できればいいのですが。
1).シートを新しく挿入。(sheet8)とします。
2).sheet8の
【A】
1 㐂
2 偠
3 㭭
4 勌
5 傺
コピー等で貼り付ける。
Sub 変える()
Dim 変換 As Range Set 変換 = Sheet1.Range("A1:AA100")
Application.ScreenUpdating = False With 変換 .Replace What:=Sheet8.Range("A1"), Replacement:="喜" .Replace What:=Sheet8.Range("A2"), Replacement:="要" .Replace What:=Sheet8.Range("A3"), Replacement:="別" .Replace What:=Sheet8.Range("A4"), Replacement:="券" .Replace What:=Sheet8.Range("A5"), Replacement:="祭" End With Application.ScreenUpdating = True End Sub
これでsheet1.A1:AA100の環境依存5文字が一括変換.
エクセル2007、vistaでは出来ました。
(そばぼーろ) 2013/12/19(木) 10:45
VBA でUNICODE(環境依存文字)のコードを調べる際は ASC ではなく ASCWを使用してください。 そばぼーろさんがシートを使用する例を書かれていますが、「変換表」というシートの A1:B10(A列:UNICODE文字、B列:変換後文字)とすると 変換したいシートの変換範囲を選択した状態で、
Sub 文字変換() Dim 変換表 As Range Set 変換表 = Worksheets("変換表").Range("A1:B10")
Dim r As Long With Selection For r = 1 To 変換表.Rows.Count .Replace What:=変換表.Cells(r, "A").Value, Replacement:=変換表.Cells(r, "B").Value Next End With End Sub のようにもできると思います。 (Mook) 2013/12/19(木) 11:01
すいません、回答じゃないのですが・・・。 私のパソコンの環境はXP、2002ですがそばぼーろさんのコードでもMookさんのコードでも なぜか㭭が喜に変換されます。他の文字はちゃんと変換されてます。
うえのさんは2007のようなので何ら問題はないと思いますが、気になって・・・。 (se_9) 2013/12/19(木) 11:22
こちらで試してみましたが、一応問題なく変換できるようです。 これはどちらかというと Office の問題よりは Windows のバージョンの問題のような 気がします。 システムとしてきちんと UNICODE に対応したのは確か Vista からだったような・・・。
時間が取れたら確認しますが、ガセだったらごめんなさい。 (Mook) 2013/12/19(木) 12:12
追伸: やっぱりうろ覚えは良くないですね。 Vista あたりから強化はされていますが、XP でも扱う分には問題なかったのかな。 http://itpro.nikkeibp.co.jp/article/OPINION/20070312/264548/ ちょっと原因がわかりません。
Mookさん、ありがとうございます。 自分もいろいろ調べてみましたがさっぱりわからなくて眠くなってきました(笑) 他の環境でも試してみたいのですが、近くにはXP&2002しかなくて。 原因を探るのはまたの機会にします。 (se_9) 2013/12/19(木) 15:09
(se_9)さまの回答にありました、
> なぜか㭭が喜に変換されます。他の文字はちゃんと変換されてます。
ここです、自分のパソコンでは、半角クエスチョンに変換されています。これは、(Mook)さまの回答に書いてある、
> これはどちらかというと Office の問題よりは Windows のバージョンの問題のような
気がします。
これが問題なのでしょうね。家のパソコンでできても、学校や会社のパソコンではできない理由がわかりました。
できれば、数が多くなっても、環境依存文字をあるだけ全部変換したいです。変換表のシートのA列に貼りつけて、B列に変換後漢字を入力したらいいということもわかりました。
質問したデータは、漢文をひとつづつのセルにバラバラにしたものをメールで送ってもらったものです。漢字が入ってるはずなのに、
なぜなのか、空白になってる漢字もあります。正確には、空白に見える漢字 ということなのかもしれません。
これらをA列に貼りつけて正解の漢字をB列に入力してみます。
(Mook)さまの回答で、マクロではASCではなくASCWで とあったところを、今から調べてみます。
困ったら、また質問させてください。ありがとうございました。
(うえの) 2013/12/20(金) 04:21
>、自分のパソコンでは、半角クエスチョンに変換されています。 に関してだけ。
これに関しては XP だろうと Windows 8 であろうと、VBE では UNICODE(環境依存文字)は 直接書けないので、「?」になってしまいます。 これは表示だけでなく、中身も変わってしまうので区別がつきません。 代わりとしてセルの値参照や、関数を使用して文字コードのまま扱うことで、データ処理は 出来ます。
「㭭」の字が何か特別なのか、これはうまくいかない環境で確認してみないと何ともですね。 (Mook) 2013/12/20(金) 08:07
報告です。
2013/12/20(金) 04:21 までは、何度やっても 㭭が、自分のパソコンでは、半角クエスチョンに変換されていたのですが、いいのか悪いのか、今は、全部変換されています。理由はわかりません。
ところで、自分は、マクロ初心者で、他の方のコードを見て勉強しています。
Mookさんに教えてもらったコードを少し違うものにしてみました。
範囲をセレクトしないで、レンジで指定しました。
ここはこうしたほうがいいとか、違う点を 教えて頂けないでしょうか。
よろしくお願いします。
Sub 文字変換()
Dim 範囲, セル, 変換表 As Range Set 範囲 = ActiveSheet.Range("B3:C12") Set 変換表 = Worksheets("変換表").Range("A2:B10")
Dim r As Long For Each セル In 範囲 If セル <> "" Then For r = 1 To 変換表.Rows.Count If 変換表.Cells(r, "A").Value = セル Then セル.Value = Replace(セル.Value, 変換表.Cells(r, "A").Value, 変換表.Cells(r, "B").Value) End If Next End If Next End Sub
(うえの) 2013/12/23(月) 15:34
内容は問題ないと思います。 変更したほうが良いと思われる点だけ。
Dim 範囲, セル, 変換表 As Range は Range として宣言されるのは最後だけで、前者の二つは Variant 型となります。 Range として使用したければ、個別に書くか下記のようになります。 Dim 範囲 As Range, セル As Range, 変換表 As Range
Set 範囲 = ActiveSheet.Range("B3:C12")
を意図してこう書いているのであればよいのですが、特定のシートを指すのであれば、 Set 範囲 = WorkSheets("処理するシート名").Range("B3:C12") のように、特定したほうが良いと思います。
If セル <> "" Then も If セル.Value <> "" Then というように Range の 値を処理する場合、全体的に Value 指定は省略しないほうが 良いでしょう。 (Mook) 2013/12/23(月) 16:38
Mookさんとかぶったので、変数宣言の補足。 Variant型でもこの場合は不都合は少ないと思われますが、 習慣になってしまうと、将来、不適切な変数代入が見つけにくくなります。 想定していない型の変数を代入していても動いてしまうので、 例えば、数値型で格納したいのに、文字列であっても格納されてしまいます。 その後の処理に不都合があっても、実行時エラーにならず、 原因究明に時間がかかったりします。 (みやほりん) 2013/12/23(月) 16:51
> Dim 範囲, セル, 変換表 As Range
>は Range として宣言されるのは最後だけで、前者の二つは Variant 型となります。
>Variant型でもこの場合は不都合は少ないと思われますが、
>習慣になってしまうと、将来、不適切な変数代入が見つけにくくなります。
>その後の処理に不都合があっても、実行時エラーにならず、
>原因究明に時間がかかったりします。
> Set 範囲 = WorkSheets("処理するシート名").Range("B3:C12")
> のように、特定したほうが良いと思います。
教えてもらい、とても嬉しいです。今から気を付けて行きます。本当に、ありがとうございました。
(うえの) 2013/12/23(月) 17:47
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.