[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『色を変えずに全角数字のみを半角にしたい』(どこどん)
事前に選択したセル内の全角数字のみを半角にするVBAを作りましたが、元の数字は赤色と黒が混同しているのに変換後は全て黒になってしまいます。
他のサイトのコードも参考にしましたが全て色が変わってしまいました。
どうしたら元のフォント色を変えずに、全角英数のみを半角にできるでしょうか
< 使用 Excel:Excel2016、使用 OS:Windows10 >
そのコードを示してみてくれないか? (ねむねむ) 2017/12/12(火) 15:22
こんなのではどうか。 Sub tst() Dim WK_RANGE As Range Dim CHAR_CNT As Integer Dim WK_CHAR As String
For Each WK_RANGE In Selection With WK_RANGE For CHAR_CNT = 1 To Len(.Value) WK_CHAR = .Characters(CHAR_CNT, 1).Text If WK_CHAR >= "0" And WK_CHAR <= "9" Then .Characters(CHAR_CNT, 1).Text = StrConv(WK_CHAR, vbWide) End If Next End With Next
End Sub
(ねむねむ) 2017/12/12(火) 16:18
セルの文字列全部を一度にセットすると、文字毎の色指定なんて全部消えて当たり前ですよね。貼った文字列が元と同じかどうかなんて、いちいち判定されませんから。
なので、色を残したいならば、1文字ずつ入れ替えるのがコードは簡単になります(何文字連続して同色か、なんて調べるのが面倒なので)。範囲指定後、右クリックすると、数字だけ1文字ずつ半角変換する例なぞ。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim R As Range Dim i As Long
For Each R In Selection.SpecialCells(xlCellTypeConstants) For i = 1 To Len(R.Value) If Mid(R.Text, i, 1) Like "[0-9]" Then R.Characters(i, 1).Insert StrConv(Mid(R.Text, i, 1), vbNarrow) End If Next i Next R
Cancel = True End Sub (???) 2017/12/12(火) 16:24
???さんありがとう。 どこどんさんすまない、 >If WK_CHAR >= "0" And WK_CHAR <= "9" Then > .Characters(CHAR_CNT, 1).Text = StrConv(WK_CHAR, vbWide) を >If WK_CHAR >= "0" And WK_CHAR <= "9" Then > .Characters(CHAR_CNT, 1).Text = StrConv(WK_CHAR, vbNarrow) としてくれ。 (ねむねむ) 2017/12/12(火) 16:28
頂いたコードは試しに文字を並べて動かしたところ無事綺麗に動作しました。
しかし実際の表にてマクロを動かすと実行時エラー1004が出ます。
問題があるのは
WK_CHAR = .Characters(CHAR_CNT, 1).Text
の部分なのですが、何がどう問題なのかさっぱりな状態です。関数や書式設定が引っかかったりするんでしょうか……
???さんありがとうございます。
頂いたコードを試そうとしましたが、私の知識不足なのか全く上手く動かせず……お力を頂いたのに全く活かせず大変申し訳無い結果になってしまいました。
数日勉強しただけでは中々上手くいかないものですね。
(どこどん) 2017/12/13(水) 17:45
正規表現で
Sub test() Dim r As Range, m As Object With CreateObject("VBScript.RegExp") .Global = True .Pattern = "[0-9]+" For Each r In Selection For Each m In .Execute(r.Text) r.Characters(m.firstindex + 1, m.Length).Text = StrConv(m.Value, vbNarrow) Next Next End With End Sub
Range.Characters.Text はセル内の文字数が255を超えると機能しません。 (seiya) 2017/12/13(水) 23:00
(γ) 2017/12/14(木) 00:52
コードで使われている命令を検索するとか、ヘルプで確認すると判るのですが、私のコードは、数式はわざと変換しないように考えたものです。だって、数式は事前に仕込むものであり、それが全角なのは入力ミスではなく、故意だと思いますから。
数式を変えたいならば、xlCellTypeConstants を xlCellTypeFormulas に変えて同様のループを追加し、元のやり方でFormulaプロパティを丸ごと置換するよう変えてみてください。
そして、他のセルを参照していて、そっちが全角な場合、数式を壊して固定値に変えるか、元データを直すかしないと駄目ですよ?
(???) 2017/12/14(木) 09:08
式があった場合にエラーにならないように修正。 >For CHAR_CNT = 1 To Len(.Value) > WK_CHAR = .Characters(CHAR_CNT, 1).Text > If WK_CHAR >= "0" And WK_CHAR <= "9" Then > .Characters(CHAR_CNT, 1).Text = StrConv(WK_CHAR, vbNarrow) > End If >Next の前に If .Text = .Formula Then 後ろに End If を入れてみてくれ。
(ねむねむ) 2017/12/14(木) 09:28
???さん、ありがとうございます。
非常に感動して変な笑いが出てしまいました。マクロのモチベーションが上がりました。
今回は別の担当者が投げてくる大量のExcelシートを校正するためのマクロだったのですが、別の部分に応用で使わせていただきます。新しいゲームに触れるような嬉しさがあって楽しかったです
seiyaさん、ありがとうございます。
何も問題なく動作した上に、データ量がかなり多くなった場合でも非常にスムーズでした。
助かりました、ありがとうございます。
γさん、大変失礼いたしました。
恐らく私の「式がエラー原因かもしれない」という文章に対しての指摘だと思いますが、一部に式があるだけで式の結果が全角になっているわけではないのです。
誤解させるような文章にお手間割かせてしまい申し訳ございませんでした。
ねむねむさん、ありがとうございます。
図らずもコード修正の遍歴を確認することでとても良い勉強になりました。
実装に関してはどなたのを使うのか決めては居ないのですが、知識としてお力になっていただき非常に助かりました。これからの糧にさせていただきます。
皆様のおかげで無事に解決いたしました。お力添え頂きありがとうございました。
(どこどん) 2017/12/14(木) 11:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.