Excel VBA質問箱 IV

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

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


3339 / 13646 ツリー ←次へ | 前へ→

【62841】文字の全角半角について 拝島 09/9/8(火) 15:37 質問[未読]
【62843】Re:文字の全角半角について 超初心者 09/9/8(火) 16:27 発言[未読]
【62844】Re:文字の全角半角について 拝島 09/9/8(火) 17:40 質問[未読]
【62845】Re:文字の全角半角について りおりお 09/9/8(火) 18:08 発言[未読]
【62846】Re:文字の全角半角について 拝島 09/9/8(火) 18:31 お礼[未読]
【62849】Re:文字の全角半角について kanabun 09/9/8(火) 22:30 発言[未読]
【62847】Re:文字の全角半角について 超初心者 09/9/8(火) 18:31 発言[未読]
【62852】Re:文字の全角半角について 拝島 09/9/9(水) 9:45 お礼[未読]

【62841】文字の全角半角について
質問  拝島  - 09/9/8(火) 15:37 -

引用なし
パスワード
   初めまして。
皆様のお知恵をお借りしたく、書き込みます。

エクセルの関数にJIS と ASC がありますが、これらを組み合わせて
全角・半角文字が混在するセル内容を以下のようにしたいです。

Ex.9月10日スケジュール表 → 9月10日スケジュール表

つまり、全角の英数字を半角にし、半角のカタカナを全角にしたいのです。
できればVBA内に組み込んでしまいたいです。


よろしくお願いします。

【62843】Re:文字の全角半角について
発言  超初心者  - 09/9/8(火) 16:27 -

引用なし
パスワード
   ▼拝島 さん:
ASC や JIS は使ってませんが。。。

Sub sample()
  Dim mySTR As String
  Dim myLooP As Long
  Dim myTmp As String
  
  Const myMOJI As String = "9月10日スケジュール表"
  
  For myLooP = 1 To Len(StrConv(myMOJI, vbWide))
    myTmp = Mid$(StrConv(myMOJI, vbWide), myLooP, 1)
    If IsNumeric(myTmp) Then
      mySTR = mySTR & StrConv(myTmp, vbNarrow)
    Else
      mySTR = mySTR & StrConv(myTmp, vbWide)
    End If
  Next myLooP
  
  Debug.Print myMOJI, mySTR
End Sub


myMOJIを引数化して SubではなくFunctionプロシージャにすれば
組み込むのも簡単?

一応、参考までに。

【62844】Re:文字の全角半角について
質問  拝島  - 09/9/8(火) 17:40 -

引用なし
パスワード
   超初心者 様

早速のレスありがとうございます。

ご提示頂きましたサンプルで試してみました。
例に挙げました値では無事望んだ動作をしたのですが
半角にする対象の英字が全角のままでした。

全角の英字を半角にするにはどうすればよいでしょうか?

重ねての質問、申し訳ありません。

【62845】Re:文字の全角半角について
発言  りおりお  - 09/9/8(火) 18:08 -

引用なし
パスワード
   Sub try()
Dim myReg As Object
Dim st1 As String, st2 As String
Dim v As Variant

Set myReg = CreateObject("VBScript.Regexp")
myReg.Pattern = "[0-9a-zA-Z]+"
myReg.Global = True

st1 = "ABC123アイウXYZ789カキク日本"
st2 = st1

st2 = StrConv(st2, vbWide)
For Each v In myReg.Execute(st2)
st2 = Replace(st2, v, StrConv(v, vbNarrow))
Next

Debug.Print st1, , st2

Set myReg = Nothing
End Sub

ご参考まで。

【62846】Re:文字の全角半角について
お礼  拝島  - 09/9/8(火) 18:31 -

引用なし
パスワード
   超初心者 様
りおりお  様

貴重なレスありがとうございます。
お陰さまで解決策が見出せました!

自分が扱ったことのない関数だったり、正規表現だったりと
無知との戦いですが、頑張ります。

本当にありがとうございました。

【62847】Re:文字の全角半角について
発言  超初心者  - 09/9/8(火) 18:31 -

引用なし
パスワード
   ▼拝島 さん:
英字は見落としてました m(_~_)m

少し変更

Sub sample2()
  Dim mySTR As String
  Dim myLooP As Long
  Dim myTmp As String
  
  Const myMOJI As String = "9月10日Aスケジュール表"
  
  For myLooP = 1 To Len(StrConv(myMOJI, vbWide))
    myTmp = Mid$(StrConv(myMOJI, vbWide), myLooP, 1)
    If myTmp Like "[0-9a-zA-Z]" Then
      mySTR = mySTR & StrConv(myTmp, vbNarrow)
    Else
      mySTR = mySTR & StrConv(myTmp, vbWide)
    End If
  Next myLooP
  
  Debug.Print myMOJI, mySTR
End Sub


こんな感じでいかがでしょう

【62849】Re:文字の全角半角について
発言  kanabun  - 09/9/8(火) 22:30 -

引用なし
パスワード
   ▼拝島 さん:
おじゃまします。

>自分が扱ったことのない関数だったり、正規表現だったりと

(1)ASC関数は Applicationオブジェクトのメソッドとして使うと、
  セル範囲をループしなくて一括で、半角化できます。
(2)半角カタカナの全角化は(どうも 一括でできる方法はなさそう)
  なので、正規表現を使ってセル単位でループして全角化します。

Sub Try1()
  Dim r As Range
  Dim vv, ss As String, s
  Dim regEx As Object
  Dim i As Long, j As Long
  
  Set r = Selection  '← ◆指定のセル範囲に変更してください

  '(1)全角の英数字を半角にし
  vv = Application.Asc(r)
  
  '(2)半角のカタカナを全角に
  Set regEx = CreateObject("VBScript.RegExp")
   '半角カタカナのUnicode範囲 : FF65-FF9F
  regEx.Pattern = "[\uFF65-\uFF9F]+"
  regEx.Global = True
  For i = 1 To UBound(vv)
   For j = 1 To UBound(vv, 2)
    ss = vv(i, j)
    If regEx.test(ss) Then
      For Each s In regEx.Execute(ss)
        ss = Replace(ss, s, StrConv(s, vbWide))
      Next
      vv(i, j) = ss
    End If
   Next
  Next
  r.Value = vv
  Set regEx = Nothing
End Sub

【62852】Re:文字の全角半角について
お礼  拝島  - 09/9/9(水) 9:45 -

引用なし
パスワード
   超初心者 様
りおりお 様
kanabun 様

皆様のお陰で望んだ結果が得られました;;
要領を得ない質問でしたが、ご親切に回答下さり本当にありがとうございましたm(_ _)m

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