No.8ベストアンサー
- 回答日時:
#5、7、cjです。
私のが一番ダメっていうか、
ただ混乱させてしまったようで
すみません m(__)m
そのまま放置するのも無責任な気がするので、
一応No.5の関数は直したものを上げますが、
RefExpを使ったものの方がいいと思っています。
申し訳ないです。
Sub Re8037230j()
Dim moji As String
moji = StrConv("あああア123イAAAアイウ", vbNarrow)
Debug.Print moji
Debug.Print Kana2Wide(moji)
moji = StrConv("ハ マ オ(4)パパa(32)マンマk(29)オジ(37)オジジ(62)", vbNarrow)
Debug.Print moji
Debug.Print Kana2Wide(moji)
End Sub
Function Kana2Wide(ByVal sSrc As String) As String
Dim sBuf As String
Dim nLen As Long
Dim nSt As Long
Dim i As Long
Dim flg As Boolean
nLen = Len(sSrc)
nSt = 1
flg = Asc(sSrc) > 165 And Asc(sSrc) < 224
For i = 1 To nLen + 1
If (Mid$(sSrc, i, 1) Like "[" & Chr$(166) & "-" & Chr$(223) & "]" Xor flg) Or i > nLen Then
If flg Then
sBuf = sBuf & StrConv(Mid$(sSrc, nSt, i - nSt), vbWide)
Else
sBuf = sBuf & Mid$(sSrc, nSt, i - nSt)
End If
flg = Not flg
nSt = i
End If
Next i
Kana2Wide = sBuf
End Function
No.7
- 回答日時:
#6さん、こんにちは。
わざわざスミマセン。
ありがとうございます。
バ_パ
の問題は、正義表現での処理ではなくて、
専ら、【一文字ずつ置換する場合】のこと、を言っています。
例外処理をする手間を考えたら、
一文字ずつ置換する方が却って難しそう、という話でした。
私が#5で提示したコードにある2種類のサンプル文字列について、
ア_アイ の イ
という例で、イが全角になるかどうかを問題にして、
Replace()関数の第5引数(Count)を1に指定することで
1ヶ所ずつ置換していく方がロスもなく確度があがるかな、
と思ったのですけれど(寧ろ速くなるでしょうし)。
如何思われますでしょう。
マ_マンマ の ン
とか
オ_オジ の ジ
とか(左側にオがない場合の)
オジ_オジジ の右端の ジ
とか。
この問題と濁・半濁の問題を合わせると
ハ_バ の バ は 全角の ハ と 半角濁点
になっちゃいませんか?
TextCompare は仰る通りまったく関係ないです。
説明が下手だったみたいでスミマセン。
手軽に書けて扱い易く情報も多いという点で、
また、他の手段で実現するのが比較的難しいという点で
RegExpを奨めるのは有力だと私も考えていますので。
一応、第5引数の提案、についての補足として、以上です。
お邪魔しました。
No.6
- 回答日時:
#5様の「半角カタカナの濁点付き、半濁点付き文字について」
これに関しては、一括にして、変換(StrConv)を掛けると、きちんと全角にまとまります。
これは、日本語版独特の仕様なのかもしれません。
ただし、これは、Excelに関してだけで、Accessでも、同様の質問があったはずですが、確か、違う反応がしたような記憶があります。
入力文字数は、半角の「パパ」は、文字数 4文字が、最後のMsgBoxでは、2文字の全角に変わっています。つまり、正規表現で半角文字のチャンク(塊)を取り出して変換を掛けるという所がミソです。
MsgBox moji & " " & Len(moji)
>正規表現を使ったサンプルは、Replace()関数の第5引数を1に指定するものなのではないかと、、
それは、第6引数のコンペアモードのことをおっしゃっているかとは思いますが、それを、TextCompare モードだということだと思います。それは、変換対象に対して、全角・半角モードを等価値にするという意味ですから、例えば、全角・半角の空白を対象する時に使うもので、今回の場合は、特に必要ないと判断しました。
もし不具合があれば、こちらも検討はします。Chiebukuro側のものは、無意味な部分がありますから、どこかのコードを真似しただけでしょうが、今回の質問は、あちこちで比較的何度も出てきて、私自身も書いたことがあります。当然、今回のような1文字ずつの変換の問題についても、検証した覚えがありますので、あえて、何もコメントも加える必要もない思って#3に掲示しました。
No.5
- 回答日時:
こんにちは。
素通りしようかと思ってたけれど、気になることがあったので。
#最初に。
#このサイトでは半角カナは全角で表示されてしまいます。
#以下投稿文中のカナはすべて半角のカナです。読み替えてください。
私が気になったのは、まず、
バ パ
とか、、、
半角カナでは2文字ですから、一文字ずつ置換するのは(文字化けして)難しそう。
それと、
正規表現を使ったサンプルは、Replace()関数の第5引数を1に指定するものなのではないかと、、、。
ア_アイ
とか
ハ_バ
とか、、、
一旦置換したカナを含む一連のカナがうまく置換できなかったりしますね。
私も書いてみました。
難しすぎず簡単すぎずなるべく軽く、という意図で書いた関数です。
やばそうな文字列サンプルを考えて地道な方法を選んだのですけれど、
漏れがないかとか少し不安になる空気ですね。
検証はお任せします。
Sub Re8037230j()
Dim sSrc As String
sSrc = "あああア123イAAAアイウ"' カナはすべて半角の意味
Debug.Print sSrc
Debug.Print Kana2Wide(sSrc)
sSrc = "ハ マ オ(4)パパa(32)マンマk(29)オジ(37)オジジ(62)"' カナはすべて半角の意味
Debug.Print sSrc
Debug.Print Kana2Wide(sSrc)
End Sub
' ' Re8037230
' ' 文字列を引数に、半角カナだけを全角に置換
Function Kana2Wide(ByVal sSrc As String) As String
Dim sBuf As String
Dim nLen As Long
Dim nPos As Long
Dim nSt As Long
Dim i As Long
Dim flg As Boolean
nLen = Len(sSrc)
sBuf = Space$(nLen + 1)
nPos = 1
nSt = 1
flg = Asc(sSrc) > 165 And Asc(sSrc) < 224
For i = 1 To nLen + 1
If (Mid$(sSrc, i, 1) Like "[" & Chr$(166) & "-" & Chr$(223) & "]" Xor flg) Or i > nLen Then
If flg Then
Mid(sBuf, nPos) = StrConv(Mid$(sSrc, nSt, i - nSt), vbWide)
Else
Mid(sBuf, nPos) = Mid$(sSrc, nSt, i - nSt)
End If
flg = Not flg
nSt = i
nPos = InStr(nPos + 1&, sBuf, " ")
End If
Next i
Kana2Wide = Left$(sBuf, nPos - 1)
End Function
No.3
- 回答日時:
'//
Sub Test1()
Dim moji As String
Dim Re As Object
Dim Matches As Object
Dim Match As Object
Dim Temp As String
moji = "あああイイイ123AAAアアア<>()"
Temp = moji
With CreateObject("VBScript.RegExp")
.Pattern = "[\uFF66-\uFF9F]+"
.Global = True
Set Matches = .Execute(Temp)
For Each Match In Matches
Temp = Replace(Temp, Match, StrConv(Match, vbWide))
Next Match
End With
moji = Temp
MsgBox moji
End Sub
なお、With ~ End With で、Reのオブジェクトは終わっています。
No.2
- 回答日時:
No.1
- 回答日時:
こんばんは!
1文字ずつの置換になりますが・・・
Sub Sample1()
Dim k As Long, str As String, moji As String
moji = "あああ123AAAアアア<>()"
For k = 1 To Len(moji)
str = Mid(moji, k, 1)
If str Like "[ア-ン]" Then '←画面上では全角になると思いますが、半角のカタカナに!
moji = Replace(moji, str, StrConv(str, vbWide))
End If
Next k
MsgBox moji
End Sub
こんな感じではどうでしょうか?
他に良い方法があればごめんなさいね。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- Excel(エクセル) EXCELでの文字・数字入力の基本について教えてください。 2 2023/05/29 23:17
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 文字に半角が含まれて...
-
英数字のみ全角から半角に変換
-
エクセルにMicrosoft Barcode C...
-
Accessのテキストボックスの入...
-
全角入力
-
ACCESS VBA でのバイナリデー...
-
よくアカウント等に使われる 半...
-
全角英数字の必要性が理解できない
-
いまスマホからカードの申込み...
-
住宅にカナを入力する際に丁目...
-
VBAの文字列の中に”(全角のダブ...
-
VBA 「,」・空白・カタカナ等...
-
VBAでシングルクオート(8217)を...
-
改行のないテキストを指定バイ...
-
[Excel VBA] ODBCによる外部デ...
-
Pythonにおける全角括弧の正規表現
-
IEからEdgeへの移行に伴うIMEの...
-
ExcelVBA:KeyCode「半角/全角...
-
明細書の英数字の全角・半角に...
-
LaTeXで半角カンマと全角カンマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
VBA 文字に半角が含まれて...
-
Accessのテキストボックスの入...
-
word差し込み印刷 半角カタカ...
-
COBOL・全角判定
-
全角入力
-
VB.net、テキストボックス入力...
-
COBOLでの全角文字の判定をした...
-
CString Format にて全角空白文...
-
メモ帳の段落の揃え方
-
ダブルコーテーションの置換
-
正規表現で、全角文字を半角文...
-
VBで、String型のデータが、...
-
よくアカウント等に使われる 半...
-
エクセルでの”々”の扱い
おすすめ情報