[[20131218234709]] 『環境依存文字を変換したい』(うえの) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『環境依存文字を変換したい』(うえの)

文字を変換したい者です。よろしくお願いします。

実際のデータの列は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


(そばぼーろ)さま、ありがとうございます。依存文字が、”B2”とか指定できないのです。
200個くらいあります。どこにあるかわからないときは、どう対応したらいいでしょうか。

(うえの) 2013/12/19(木) 05:39


(Mook)さま、勉強になります。早速サイトを見ています。どのように応用すればいいのか?難しそうです。うえの

(うえの) 2013/12/19(木) 08:04


(Mook)さま、質問にある5つの例の依存文字のコード関数(ワークシート関数)は、全て 63 になっています。
ユニコードは、今から調べてみます。ありがとうございます。
コード関数とは違い、半角クエスチョンと依存文字は、全部違うコード(数字?)なのでしょうか?
(うえの) 2013/12/19(木) 08:13

うえの様

>”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

(Mook)さま、(そばぼーろ) さま、(se_9)さま、ありがとうございます。できました。
変換できました。
(Mook)さま、(そばぼーろ) さま、どちらのコードも、完璧でした。

(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

(Mook)さま、遅くなりましたが、ACSW で調べてみました。
半角クエスチョンは 63、他の依存文字は、全て違うコードでした。ありがとうございました。

報告です。

 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

(Mook)さま、(みやほりん)さま、大変勉強になります。ありがとうございます。
宣言の仕方は、全く注意してなかったです。

> 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.