「教えて!ピックアップ」リリース!

(初めて質問させていただきます。失礼がありましたら申し訳ございません。)

ExcelのVBAで以下のことができないか模索しております。

(1)4文字以上の数字(整数)を”X”に変換する
 ⇒意図としては、セル内に含まれる電話番号の一部をマスキングしたいです。
(2)”様”の前の2文字を”X”に変換する
 ⇒意図としては、セル内に含まれる氏名の一部をマスキングしたいです。

マスキングツールの利用なども検討しましたが、職場PCの制限上できないことが多く、
ExcelのVBAで解決できるのではないかと思い始めました。

いずれもReplaceとForとIfを使うのかと思いますが、初心者のためうまく使いこなせません・・・
うまく適用する方法をご存じの方がいらっしゃいましたらご教示いただけないでしょうか?

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

  • ご回答ありがとうございます。個人情報を最低限マスクイングをした上で他部署に渡すことが目的でして、それほど精緻でなくとも問題ないため(「この様な」がマスキングされても問題ないため)VBAで対応できないかご相談させていただきました><

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/11/17 12:55
  • ご回答ありがとうございます。すべて1つのセル内に混在しておりまして、ご記載の通り文字数が合わないため単なるExcel関数では難しいと考えております・・・

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/11/17 12:58

A 回答 (8件)

No7です。



連投失礼します。
No7だと
 1234-01234567
等の様な、後ろに前出のものを包含するようなものがあると、一部ミスりますね。
Replaceの回数を制限しておけばよさそうなので、以下に訂正しておきます。

Sub Sample()
Dim reg, match, m
Dim s As String, c As Range

Set reg = CreateObject("VBScript.RegExp")
reg.Global = True

For Each c In Range(cells(1, 1), cells(Rows.Count, 1).End(xlUp))
 s = c.Text
 reg.Pattern = "[^\n]{2}様"
 s = reg.Replace(s, "XX様")

 reg.Pattern = "\d{4,}"
 Set match = reg.Execute(s)
 For Each m In match
  s = Replace(s, m.Value, String(Len(m), "X"), 1, 1)
 Next m
 c.Offset(, 1).Value = s
Next c
End Sub
    • good
    • 0
この回答へのお礼

遅れてしまいまして大変申し訳ございません、ご回答いただきありがとうございました!!ご教示いただいた内容で解決いたしました、本当に助かりました。ありがとうございました!!

お礼日時:2020/11/24 09:39

こんにちは


横から失礼します。

単純な置き換えで良いとのことのようなので別案です。

・連続する4文字以上の数字は、その文字数分の「X」に置き換えます。
・「〇〇様」はセル内改行を含まない文字列を「XX様」に置き換えます。
対象はA列とし、結果をB列に表示するのはNo6様と同様にしてあります。

以下ではいかがでしょうか?

Sub Sample()
Dim reg, match, m
Dim s As String, c As Range

Set reg = CreateObject("VBScript.RegExp")
reg.Global = True

For Each c In Range(cells(1, 1), cells(Rows.Count, 1).End(xlUp))
 s = c.Text
 reg.Pattern = "[^\n]{2}様"
 s = reg.Replace(s, "XX様")

 reg.Pattern = "\d{4,}"
 Set match = reg.Execute(s)
 For Each m In match
  s = Replace(s, m.Value, String(Len(m), "X"))
 Next m
 c.Offset(, 1).Value = s
Next c
End Sub
    • good
    • 0

#5です


補足を拝見するとやっつけで良いのですね。
電話番号の(1)4文字以上の数字(整数)を”X”に変換する
これは、4桁になったらXXXXにするでは、問題になりますでしょうか?
例えば6桁だとXXXX56となります。8桁だとXXXXXXXXです。
取敢えず、やっつけ感ありますが参考コードです。
総当たりなので、データ数が多いと少々時間がかかるかと、、
A列が対象になっていますので、必要個所を書き直してください。

Sub Sample1()
Dim i As Long, k As Long
Dim c As Range
Dim strA As String
For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
For i = 1 To Len(c)
If IsNumeric(Mid(c, i, 1)) Then
If k = 3 Then
strA = Left(strA, Len(strA) - 3) & "XXXX"
k = 0
Else
strA = strA & Mid(c, i, 1)
k = k + 1
End If
Else
If Mid(c, i, 1) = "様" Then
strA = Left(strA, Len(strA) - 2) & "XX様"
k = 0
Else
strA = strA & Mid(c, i, 1)
k = 0
End If
End If
Next i
c.Offset(, 1).Value = strA
strA = ""
Next c
End Sub

出力先は c.Offset(, 1).Value = strA でB列になっています。
同じセルに書き出す場合は、c.Value = strA です。
    • good
    • 0
この回答へのお礼

遅れてしまいまして大変申し訳ございません、ご回答いただきありがとうございました!大変勉強になりました。

お礼日時:2020/11/24 09:40

こんにちは、


>一部をマスキングしたい
>セル内に含まれる
セル内データがどの様なフォーマットで出来ているのか不明ですが、
セル内データを項目ごとに単セルに分ける事が出来るのなら、関数でもVBAでもバグのリスクは低くなるように思います。(C列 氏名 D列 電話番号みたいに)

多くの文字列の中から、ターゲットキーをシンボルキーにするとすでに回答にあるような事象が想定されますね。

単セル(カンマ区切りなど区切られたデータ)にシンプルなデータの場合で合っても、ご質問の場合などは、シンボルキーを設定するのではなく
文字数などで書き換えた方が無難だと思います。

(1)4文字以上の数字(整数)を”X”に変換する
ご質問の内容とは異なりますが、
単セルの場合、一例:(最後の4文字を書き換える)
A1セルの値の左から1文字目から全文字数から-4の文字数迄と "XXXX"を
つなげてB1セルに書き出します。

VBA
Range("B1") = Mid(Range("A1"), 1, Len(Range("A1")) - 4) & "XXXX"
Range("A1") =とすることで元データを書き換える事が可能

関数
= MID(A1, 1, LEN(A1) - 4) & "XXXX"
元データ自体を書き換えることは出来ません。
    • good
    • 0

どの程度できるんですかね?



https://atelierkobato.com/1moji/

これをベースに変換してください。

あと、一つのセルに電話番号も名前も入っているなら、まずはそれらを各列に分割してください。
そのあとにマスキング処理です。
    • good
    • 0
この回答へのお礼

遅れてしまいまして大変申し訳ございません、ご回答いただきありがとうございました!

お礼日時:2020/11/24 09:41

「様」を検索対象とした場合、


「この様な」とか 「様式」とか 
敬称としての文字でないものまでヒットさせてしまう為
難しいと言えるのではないでしょうか
この回答への補足あり
    • good
    • 0
この回答へのお礼

遅れてしまいまして大変申し訳ございません、ご回答いただきありがとうございました!

お礼日時:2020/11/24 09:41

規則性があるようで無いとも言えますので


完全自動に頼ると 落とし穴があると思います
いわゆる力業での処理ですので、結果の見直し行為は必要だと思います

見直しが必要なら 自動化は本末転倒のようにさえ思います・・

既にあるものをマスキングしたいのではない場合においては
(定型文) 作りこみを工夫する(いわゆる流し込み方式にする)
ほうが良いと思われます
    • good
    • 0

1、前の数文字をleft関数で取得して、Xを結合。


2、2文字取得してXと様を結合。

VBAでしなくてもできる。
マスキングなら、変換とか難しく考える必要はないと思います。
それとも、文字数を合わせないといけない?
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


人気Q&Aランキング