
エクセル2016を使っております。
あるファイルで氏名でVLOOKUP関数を使い値を取得したいのですが、旧字体・異字体が混ざっており、適切に値が取得できません。
VBAで一括変換したく、ネットで調べながら以下のコードをThisworkbookのモジュールに書いて実行したのですが、動きません。
いろいろとおかしいと思うので、ご教示願います。
Sub macro1()
Dim str As String
Call ChangeName
End Sub
Function ChangeName() As String
strName = Replace(strName, " ", "") '全角空白を半角空白に変換
strName = Replace(strName, "髙", "高")
strName = Replace(strName, "邊", "辺")
strName = Replace(strName, "邉", "辺")
strName = Replace(strName, "愼", "慎")
strName = Replace(strName, "將", "将")
strName = Replace(strName, "聰", "聡")
ChangeName = strName
End Function
No.4ベストアンサー
- 回答日時:
>他の列にも対応させるには、
でコードを書いていらっしゃいますが、基本的にも考え方も間違っていません。
フリーズの要素は、別にあるのだと思います。それがなんなのかが分かりませんので、あえてジャンプ機能を使って(定数かつ文字列)であるなら、置換を試みる方法でやってみます。範囲の選択は不要です。
SpecialCells(xlCellTypeConstants, xlTextValues).Cells
'//
Sub Macro2()
Dim c As Variant
Application.ScreenUpdating = False
For Each c In ActiveSheet.UsedRange. _
SpecialCells(xlCellTypeConstants, xlTextValues).Cells
c.Value = ChangeName(c.Value)
Next c
Application.ScreenUpdating = True
End Sub
もし、これで不具合が出るようですと、ひとつずつエラーになった原因を突き止めなくてはなりません。それと、元のソースが、ネットやWindows系以外のものですと、
ユーザー定義関数に渡す前に、
c.Value = ChangeName(c.Value)
↓
c.Value = ChangeName(Application.Clean(c.Value))
と、Clean 関数で、エスケープシーケンス等のバイナリコードを取り去ったほうがよい場合があります。
>「今の規模(100文字程度まで)なら、そのままでよいのですが、異字・旧字置き換え対象候補すべてで、1,400文字×2ぐらいが必要です。」の部分が理解できませんでした。
異字体、旧字の登録されているのが、調べてみると1083個、
元 |旧字・異字
------------
亜 |亞
唖 |啞 瘂
1083 →それぞれを展開させるので、
↓
上記から置換リストを作ります。(右:検索語, 左:置換語)
亜 |亞 ↓このように展開します。唖 は、2行になります。
唖 |啞
唖 |瘂
ざっと、1400漢字(内ダブリあり) 元の漢字に集約させるために、2行ないし3行にしてやる必要があります。検索語と置換語を併記して2列になります。それは、私にとってはあまりありがたくない話で、それは、今までのユーザー定義関数の方法ではおそらくダメだと思います。それにかなり気が滅入る作業の気がします。というよりも、私の集中力が落ちているせいなのですが。
ただ、私がこういうことに興味を持ったのは、Windowsが出る前のことで、今調べてみると、そんなに大きく変わっていないようです。その際は、前述で書いたようにbregexp.dll または、Basp21 をお薦めすることになります。
No.3
- 回答日時:
こんにちは。
>一つ目のコードで実行したところ、開いているシートにおける置換はうまくできたのですが、それ以外のシートには動いていないようでした。
簡単にどこでも使えるようにするには、「Personal.xlsb(マクロの記録の時に、『個人用マクロブック』と出てくる場所」の標準モジュールに同じように登録(貼り付け)します。名称は、Sub Macro1 ではなく、Sub 旧漢字変換() とでも分かりやすい名前がよいでしょう。ユーザー定義関数とセットにして貼り付けてください。
ファイル-オプション-クイックアクセスツールバー
で、「個人用マクロブック」で、Subプロシージャ名を選んであげれば、どこでも使えるようになります。「個人用マクロブック」は、プロシージャを貼り付けた時点で、Ctrl + Sで上書きすると、終了時にスムーズに終われます。
そのコード中で、
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
ただ、この部分は、
For Each c In Selection
にして、マウスで選択させるようにすればよいです。
それと、私がこの質問で気にしている部分は、どの程度の規模になるかということです。
確かに、今の規模(100文字程度まで)なら、そのままでよいのですが、異字・旧字置き換え対象候補すべてで、1,400文字×2ぐらいが必要です。
途中までリストは作ってみたものの、もし、そのぐらいの規模になれば、アドインにしなくてはならないことになります。
その場合は、再度、改めてコードを書き直します。(以前、同じような質問で、中途になってしまったものが開発中のままになっています。)
>2つ目のコードはインストールの部分が理解できずに諦めました。
かつては、bregexp.dll 一般のVB系プログラム本にも紹介されている公的なツールとして筆頭に挙げられたものです。Excelで正規表現を本格的に使うようであれば、インストールだけぐらいでしたら教えてさしあげてもよいのですが、ここの掲示板で、それを言っているのは私ぐらいでしかありません。
ありがとうございます。
おっしゃるとおり、「For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))」の部分は1列目でないと動作しないコードですね。
複数の様式の異なるシートにおいて動作させたいため、マウスで範囲選択するのは大変です。
他の列にも対応させるには、
For Each c In Range("C1", Cells(Rows.Count, 3).End(xlUp))
c.Value = ChangeName(c.Value)
Next c
For Each d In Range("G1", Cells(Rows.Count, 7).End(xlUp))
d.Value = ChangeName(d.Value)
Next d
For Each e In Range("B1", Cells(Rows.Count, 2).End(xlUp))
e.Value = ChangeName(e.Value)
Next e
というように追記すればよいのでしょうか?
(これで実行したところ、2回中、2回フリーズしましたが)
また、申し訳ないのですが、「今の規模(100文字程度まで)なら、そのままでよいのですが、異字・旧字置き換え対象候補すべてで、1,400文字×2ぐらいが必要です。」の部分が理解できませんでした。
No.2
- 回答日時:
#1で書いた通り
''標準モジュールに登録/ThisWorkbook モジュールではありません。
注意書きが書かれてもなお、Thisworkbookを使おうというのは、それが癖になっていませんか?
Excelでは、一般的に標準モジュールを使うようになっています。
Excelの表画面から、Alt + F11 -> Alt + I -> m (標準モジュール-挿入)
Excelでは、標準モジュールとそれ以外のオブジェクトモジュール(シート・Thisworkbook, Userform, Class) と別れます。後者は特別なイベント型のマクロを乗せます。Thisworkbook の本格的な使い方は、難易度がかなり高いです。
二つ目も当然、標準モジュールを使いますが、これは、Basp21 というツールをインストールしないと使えません。インストールができないのでしたら、諦めてください。
遅くなってすみません。
ボケていたようで、わざわざ標準モジュールと書いていただいていたのに、失敗していました。
申し訳ありませんでした。
一つ目のコードで実行したところ、開いているシートにおける置換はうまくできたのですが、それ以外のシートには動いていないようでした。
アクティブにしているシートだけではなく、このコードを書いたエクセルファイル全体に対して動かすことは可能ですか?
2つ目のコードはインストールの部分が理解できずに諦めました。
No.1
- 回答日時:
まず、掲示板のマクロコードの修正
''標準モジュールに登録/ThisWorkbook モジュールではありません。
'//
Sub macro1()
Dim c As Variant
Application.ScreenUpdating = False
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
c.Value = ChangeName(c.Value)
Next c
Application.ScreenUpdating = True
End Sub
Function ChangeName(ByVal strName As String) As String
If strName <> "" Then
strName = Replace(strName, Space(1), Space(1), , , vbTextCompare)
strName = Replace(strName, "髙", "高")
strName = Replace(strName, "邊", "辺")
strName = Replace(strName, "邉", "辺")
strName = Replace(strName, "愼", "慎")
strName = Replace(strName, "將", "将")
strName = Replace(strName, "聰", "聡")
ChangeName = strName
End If
End Function
'//
c.Value = Replace(buf1, Space(1), Space(1), , , vbTextCompare)
このコードは、テキストコンペアモードで、スペースを比較して、全角スペースを半角にするというコードです。デフォルトは、バイナリコンペアモードです。
人名漢字で、どの程度、旧漢字や異字体が出現するかにも依存しますが、
実際の表では、Perl やRuby などのほうが良いような気がします。
以前、Perl のExcel アドインがあると聞いたので、ずっと探したのですが、見当たりません。Perl もどきで、以下のような書き方が可能です。
http://www.hi-ho.ne.jp/babaq/basp21.html
2007/06/29版をインストール または、BREGEXP.DLL 単独をインストール(コードが変わります)このように書くことは可能になります。ただし、全ての旧漢字・異字体をカバーできるとは思えません。
'//
Sub BTranslateTest()
Dim bobj As Object
Dim c As Variant
Dim buf As String, buf1 As Variant '(Variant のみ)
Dim ret As Long
Set bobj = CreateObject("Basp21")
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
buf = c.Value
ret = bobj.Translate("tr/髙邊邉愼將聰/高辺辺慎将聡/kg", buf, buf1)
c.Value = Replace(buf1, Space(1), Space(1), , , vbTextCompare)
Next c
End Sub
ありがとうございます。
しかし、最初に書いていただいたプロシージャをthisworkbookに貼り付けて実行しようとしても、動きませんでした。。
また、2つめのSubプロシージャについても同様に実行しようとしたのですが、動きませんでした。
私の操作が違うのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
このQ&Aを見た人はこんなQ&Aも見ています
-
違う字体の漢字をエクセルのVLOOKUP関数で一致させる。
Excel(エクセル)
-
Excel上でどれが外字か調べたい
その他(コンピューター・テクノロジー)
-
VBAによる第3、4水準文字の判定について
Visual Basic(VBA)
-
-
4
UNICODE文字が含まれているかのチェック
Visual Basic(VBA)
-
5
アクセスで外字を探す方法
Access(アクセス)
-
6
Access2010のVBAで異体字の記述
その他(データベース)
-
7
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
8
Excel上に旧漢字を入力したい
Excel(エクセル)
-
9
VBAにて読み込みが出来ない環境依存文字 ㉖ の文字コードを教えて下さい。
Excel(エクセル)
-
10
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザー定義関数に#NAME?が返...
-
初歩的な質問ですがよろしくお...
-
vba userFormのSubを標準モジュ...
-
モジュールとクラスの違いって...
-
Excel VBA 定義されたプロージ...
-
【vba】フォームに書いてあ...
-
フォーム内のテキストボックス...
-
Excel VBA 『Call』で呼び出す...
-
VBのフォームモジュールと標準...
-
SendKeysの使い方について
-
ベースモジュールって?
-
Excelシート内セル記述の違いに...
-
現在アクティブなフォーム名を...
-
acwzlibとは?
-
Excelで時刻になったら知らせて...
-
VBAで別モジュールへの変数の受...
-
KAKASI[変換ソフトをperlで使う...
-
vba 標準モジュールインポート...
-
エクセルVBAで標準モジュー...
-
プログラムでノッチフィルタの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
ユーザー定義関数に#NAME?が返...
-
vba userFormのSubを標準モジュ...
-
Excel VBA 定義されたプロージ...
-
モジュールとクラスの違いって...
-
モジュールの最大数はいくつな...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
【vba】フォームに書いてあ...
-
SendKeysの使い方について
-
モジュールからフォームのボタ...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとは何ですか
-
ExcelでTelnetを動かしたい
-
標準モジュールを削除したい。(...
-
VBA This Workbookモジュール...
-
Access VBA標準モジュールにつ...
おすすめ情報