Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


535 / 13645 ツリー ←次へ | 前へ→

【79828】セルの関数で使用している文字列を半角にしたい りか 18/4/24(火) 11:52 質問[未読]
【79831】Re:セルの関数で使用している文字列を半角... マナ 18/4/24(火) 18:57 発言[未読]
【79832】Re:セルの関数で使用している文字列を半角... 亀マスター 18/4/24(火) 20:50 回答[未読]
【79855】Re:セルの関数で使用している文字列を半角... γ 18/4/30(月) 9:49 発言[未読]

【79828】セルの関数で使用している文字列を半角に...
質問  りか  - 18/4/24(火) 11:52 -

引用なし
パスワード
   セルに
=関数("文字列",シート1!A1)
のように関数があるシートがあります。
(関数、文字列と参照先はセルによってバラバラです)

この関数の文字列の部分だけを半角(英数字とカナ)にし、
セル参照のシート名はそのままにすることはできませんでしようか?

上司かシートに記入してある文字をすべて半角にできるものは
半角にしろと言われていて、置換ではやってられないので、
マクロに一気に処理したいのです。
直接文字が入力してあるだけのセルはValueをStrConvで変換すればよいのですが、
関数のセルのFormulaLocalをStrConvで変換すると、
参照している範囲の名称やシートの名前まで変換されてエラーとなってしまい
困っています。

【79831】Re:セルの関数で使用している文字列を半...
発言  マナ  - 18/4/24(火) 18:57 -

引用なし
パスワード
   ▼りか さん:
>セルに
>=関数("文字列",シート1!A1)
>のように関数があるシートがあります。
>(関数、文字列と参照先はセルによってバラバラです)
>
>この関数の文字列の部分だけを半角(英数字とカナ)にし、
>セル参照のシート名はそのままにすることはできませんでしようか?
>

半角にした結果、そのセルを計算に使っているセルの結果が変わる
あるいは、えらーになるといった心配はありませんか。

【79832】Re:セルの関数で使用している文字列を半...
回答  亀マスター  - 18/4/24(火) 20:50 -

引用なし
パスワード
   マナさんのおっしゃるように、エラーの可能性はあります。
特に、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

【79855】Re:セルの関数で使用している文字列を半...
発言  γ  - 18/4/30(月) 9:49 -

引用なし
パスワード
   Microsoftのフォーラム
ht tps://social.msdn.microsoft.com/Forums/ja-JP/52f7099a-6290-493b-9014-c4094f5e5033?forum=vbajp
で解決したようですが、こちらは正解が提示されているのに放置でしょうか?

マナーを守ってくださいね。

(本サイトの基本方針から引用)
> マルチポストについて
> 別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。当質問箱では、マルチポストは原則認めています。つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。
>
> しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。質問しっぱなし、というのはモラルに反します。「解決したからいいや」というのではありません。

----------
ところで、あちらの解決しましたというコードについて言えば、
カタカナが1文字でも含まれているものに限定していますね。
カタカナは含まない場合の、全角の英数字が全角のまま残ってしまっています。
また、繰り返しのなかで何度もCreateObject("VBScript.RegExp")している点も改善すべきでしょう。

一方、亀マスタさん作成のコードは、漏れなく半角に変換されます。
正規表現を持ち出すまでもないということですね。


----------
ちなみに、
>セル参照のシート名はそのままにすることはできませんでしようか?
実は、
  For Each rTarget In Sht.UsedRange
    rTarget.FormulaLocal = StrConv(rTarget.FormulaLocal, vbNarrow)
  Next
とすれば、
シート名に全角カタカナが使われていて、シート名を半角に変換したものを
入力しても、「Excelが気を利かせて自動的に元の全角と認識してくれる」ようですね。
ですから、関数部分もシート名の部分も含め、
単純に上の処理でも結果オーライになっていたはずです。

これはやってみないと中々気づかない点ですな。

----------
なお、半角カタカナを求める指示そのものに違和感があります。
いまやビジネス現場でも半角カタカナは余り使用されないはずです。

535 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free