|
マナさんのおっしゃるように、エラーの可能性はあります。
特に、If関数などは条件が崩れると思いますよ。
それでもというなら、私なら以下のようにします。
(もっといい方法もあるかもしれませんが)
関数の中で文字列はダブルクォーテーションで囲んでいるはずなので、
これをVBAのInStrで検出し、2つのダブルクォーテーションで囲まれた
範囲だけを対象にStrConvで変換する・・・という考え方です。
これなら、参照しているシート名などはそのまま残ると思います。
Sub test()
Dim Rng As Range
Dim Pos1 As Long, Pos2 As Long
Dim tempStr As String, halfStr As String
For Each Rng In Selection
'式があるかどうかを確認
If Rng.HasFormula Then
tempStr = Rng.FormulaLocal
Pos2 = 0
Do
'ダブルクォーテーションの位置を検索
Pos1 = InStr(Pos2 + 1, tempStr, """")
'見つからなければループを抜ける
If Pos1 = 0 Then
Exit Do
End If
'次のダブルクォーテーションの位置を検索
Pos2 = InStr(Pos1 + 1, tempStr, """")
'ダブルクォーテーションで挟まれた文字列を抜き出し、半角に変換
halfStr = StrConv(Mid(tempStr, Pos1 + 1, Pos2 - Pos1 - 1), vbNarrow)
'変換後の文字列を元の位置に差し込む
tempStr = Mid(tempStr, 1, Pos1) & halfStr & Mid(tempStr, Pos2)
Loop '次の位置のダブルクォーテーションが見つからなくなるまでループ
'最終的に得られた数式を元のセルに戻す
Rng.FormulaLocal = tempStr
End If
Next Rng
End Sub
|
|