Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : その他)
半角から全角に変換したい
投稿日時: 20/03/13 10:01:10
投稿者: ダフネ

企業情報を管理するファイルにて旧データと新データを突合する作業をしておりますが、
提出される企業によって半角と全角の入力がまちまちで、それを統一する作業に
日々大量の時間を割いておりますので是非皆様のお力をお借りしたいです。
 
統一したいのは、全ての文字と記号を半角⇒全角に変換する作業です。
 
A列(旧データ)とE列(新データ)に法人名が入力されています。
COUNTIF関数で削除・追加データをあぶりだしています。
このA列とE列のデータに上書きする形で、
半角文字と記号を全角に変換するマクロを作成したいです。
 
色々と検索してみましたが、特定のセルやシート全体に対するものは見つかったのですが、
特定の列を指定したものが見つからず、またマクロ初心者のため良く理解出来ず歯が立ちませんでした。
どうぞ宜しくお願い致します。

回答
投稿日時: 20/03/13 11:01:10
投稿者: WinArrow
投稿者のウェブサイトに移動

 
半角文字を全角文字に変換するだけならば、マクロは不要です。
  
例えば、A列が半角ということなので
空いている列(F列)に
=JIS(A1)
だけで全角に変換可能です。
数式は下へフィルコピーします。
  
 >COUNTIF関数で削除・追加データをあぶりだしています。
この意味はよく分かりませんが、
 変換したF列とE列を比較すれば、アンマッチがわかります。
 

投稿日時: 20/03/13 11:25:23
投稿者: ダフネ

今まで空いている列にJIS関数で対応していたのですが、
使い勝手が悪くマクロにて対応したい次第です。
実は企業名の隣に住所の列も存在していて、この2つをセットに突合しています。
他に条件付き書式(重複していないデータを色付)を設定しているので
フリーズしまくっている状況です。
JIS関数用に別シートを作ることも考えたのですが、
既に9000KB近い容量になって動きがもの凄く悪いので
マクロでの処理を希望しています。
 
 

WinArrow さんの引用:

半角文字を全角文字に変換するだけならば、マクロは不要です。
  
例えば、A列が半角ということなので
空いている列(F列)に
=JIS(A1)
だけで全角に変換可能です。
数式は下へフィルコピーします。
  
 >COUNTIF関数で削除・追加データをあぶりだしています。
この意味はよく分かりませんが、
 変換したF列とE列を比較すれば、アンマッチがわかります。
 

回答
投稿日時: 20/03/13 12:57:40
投稿者: WinArrow
投稿者のウェブサイトに移動

説明だけでは、状況がよく理解することが難しいので、
(説明不足もありますし・・・・)
具体的なアドバイスはできませんが、
JIS関数で変換した列は、一旦、「値」に変換すればよろしいかと思います。
 
Excelのバージョンg選択されていませんが、
数式が多いのではないかと思います。
 
 
 

投稿日時: 20/03/13 13:12:18
投稿者: ダフネ

今までもJIS関数で変換後に値に変換していましたが、
日々何度も同じ作業をおこなっており、
それを手間に感じているのでマクロにしたいと思っています。
Excelのバージョンはオフィス365です。
他の列の数式は削ることは出来ませんので、
半角から全角の変換をマクロで行いたいのです。
マクロの助言を頂きたいです。
 
 
 

WinArrow さんの引用:
説明だけでは、状況がよく理解することが難しいので、
(説明不足もありますし・・・・)
具体的なアドバイスはできませんが、
JIS関数で変換した列は、一旦、「値」に変換すればよろしいかと思います。
 
Excelのバージョンg選択されていませんが、
数式が多いのではないかと思います。
 
 
 

回答
投稿日時: 20/03/13 13:46:48
投稿者: simple

私もよく理解できていませんので、
材料だけ提示しますので、修正はそちらで実行してください。

Sub test()
    Dim lastRow As Long
    Dim k As Long
    lastRow = Cells(Rows.count, "A").End(xlUp).Row
    For k = 1 To lastRow
        If StrConv(Cells(k, "A"), vbWide) <> Cells(k, "B") Then Cells(k, "C") = "不一致"
    Next
End Sub

なお、
>実は企業名の隣に住所の列も存在していて、この2つをセットに突合しています。
とのこと。
企業名+住所の文字列で両者を比較しているのですか?そこが不明。
なのでそこは考えていません。文字列連結&を使う簡単なことなので、そちらで対応してください。
 
なお、JIS関数でやっていたとか、そうならそうと最初からきちんと説明されたほうがいいですよ。
後出しは余り歓迎されません。
 
この手の話で良く出てくるのは、
・カッコ株の取扱がまばらだとか、
・空白が入っていたりいなかったりを調整したいだとか、
・住所でも番地の書き方が不揃いだったりとか、色々話はあります。
その手の話がもしあれば、最初から言わないと、だらだら話が続くことになります。

投稿日時: 20/03/13 14:45:45
投稿者: ダフネ

説明不足ですみません・・・
 
弊社の取引先企業に、「関係会社一覧」を作成して頂いています。
内容変更があった場合に提出して貰っています。
なので、前回頂いたデータと新たに頂いたデータを突合して
変更している法人名や移転した住所を確認する作業を行っております。
 
A列       B列    C列     D列    
法人名(旧)  住所(旧) 法人名検証 (旧) 住所検証 (旧)
 
 
E列     F列     G列           H列     I列
法人名(新) 住所(新)     法人名検証 (新) 住所検証 (新)    追加・削除あり
 
 
A,B,E,F列にそれぞれ旧新のデータを貼り付けています。
C,D,G,H列にCOUNTIF関数を利用して重複していないデータに削除と追加の文字を表記させています。
I列には追加、削除の行にフラグを付ける関数を入力しています。
 
企業によって法人名のみ突き合わせる場合と、法人名と住所を突き合わせる場合があります。
法人名は法人名で突合し、住所は住所で突合させます。
(法人名と合体させることはしていません)
 
提出されたデータに統一性がない場合が多く、
半角データを全角に置換して突き合わせを行いたいということです。
 
ですので正確には、A,B,C,D列の半角データをそのまま同列に上書きする形で
マクロで置換したいと思っています。
 
仰る通り、(株)がまばらですし、空白や、都道府県がないとか番地が不揃いで
都度、置換で変更して出来るだけ揃えてあとは目検で行っている状況です。
 
社員も含めマクロが理解出来る人がおりませんので、
先ずは半角⇒全角変換のマクロに挑戦してみようとした次第です。
 
投稿頂いた下記のモジュールを試してみましたが、上手く変換出来ませんでした。
どこを修正したら良いのか全く分かりませんので、今までのJIS関数にて行おうと思います。
ありがとうございました。
 
 
 

simple さんの引用:
私もよく理解できていませんので、
材料だけ提示しますので、修正はそちらで実行してください。
Sub test()
    Dim lastRow As Long
    Dim k As Long
    lastRow = Cells(Rows.count, "A").End(xlUp).Row
    For k = 1 To lastRow
        If StrConv(Cells(k, "A"), vbWide) <> Cells(k, "B") Then Cells(k, "C") = "不一致"
    Next
End Sub

なお、
>実は企業名の隣に住所の列も存在していて、この2つをセットに突合しています。
とのこと。
企業名+住所の文字列で両者を比較しているのですか?そこが不明。
なのでそこは考えていません。文字列連結&を使う簡単なことなので、そちらで対応してください。
 
なお、JIS関数でやっていたとか、そうならそうと最初からきちんと説明されたほうがいいですよ。
後出しは余り歓迎されません。
 
この手の話で良く出てくるのは、
・カッコ株の取扱がまばらだとか、
・空白が入っていたりいなかったりを調整したいだとか、
・住所でも番地の書き方が不揃いだったりとか、色々話はあります。
その手の話がもしあれば、最初から言わないと、だらだら話が続くことになります。

回答
投稿日時: 20/03/13 15:15:52
投稿者: WinArrow
投稿者のウェブサイトに移動

話は、分かりました。
内容から察するに、目視でも困難ではないか???・・・・
要はルールが存在しない同士のデータを照合するわけですよね?
マクロならなんでもできると、勘違いしていませんか?
マクロがわかる/わからない・・・という問題でもないようなきがします。
 
データ入力する際のルールをきちんとしなければ、
永遠に続く問題です。

回答
投稿日時: 20/03/13 15:18:15
投稿者: simple

引用:
ですので正確には、A,B,C,D列の半角データをそのまま同列に上書きする形で
マクロで置換したいと思っています。

Sub test()
    Dim lastRow As Long
    Dim k As Long
    Dim j As Long
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    For k = 1 To lastRow
        For j = 1 To 4
            Cells(k, j).Value = StrConv(Cells(k, j).Value, vbWide)
        Next
    Next
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

薄くてよいので、ExcelVBAの基礎的な本を購入して学習することをお薦めします。
こうした場でコードを得ても、それを活かすには学習が必要です。頑張ってください。
 
なお、配列利用はあえて避けています。

回答
投稿日時: 20/03/13 15:32:48
投稿者: WinArrow
投稿者のウェブサイトに移動

>A,B,C,D列の半角データをそのまま同列に上書きする形
 
この方法は、とても危険です。
元の状態を残しておかないと、正しく変換できたか検証ができない・・・と思う。
 
まあ、、何事も勉強なんで、苦労してみてください。

投稿日時: 20/03/13 16:03:32
投稿者: ダフネ

simpleさん
 
お忙しい所ありがとうございました!
とても助かりました!!!
大感謝です。
<(_ _)>
 
入力を間違えてE,F列をC,D列と記載してしまったのですが、
何とか自分なりに修正出来ました。
少しずつ勉強していきたいと思います。
 
本当にありがとうございました!
 
 
 

simple さんの引用:
引用:
ですので正確には、A,B,C,D列の半角データをそのまま同列に上書きする形で
マクロで置換したいと思っています。

Sub test()
    Dim lastRow As Long
    Dim k As Long
    Dim j As Long
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    For k = 1 To lastRow
        For j = 1 To 4
            Cells(k, j).Value = StrConv(Cells(k, j).Value, vbWide)
        Next
    Next
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

薄くてよいので、ExcelVBAの基礎的な本を購入して学習することをお薦めします。
こうした場でコードを得ても、それを活かすには学習が必要です。頑張ってください。
 
なお、配列利用はあえて避けています。

トピックに返信