ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのエクセルの関数で

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんにちは。

当方XP、オフィス2003環境です。

関数に関して質問です。
住所などの、

「東京都◯◯区◯◯町3ー15ー22 エクセルマンション205」

のようなデータで、二桁数字のみ半角にしたいのですが、
ASC関数ですとカタカナや一桁の数字もなってしまいます。
「二桁以上の数字」限定で半角にできますでしょうか。
if関数などと絡める??

よろしくお願いします。

コメント(32)

私が思い浮かぶのはVBAで組んで半角にさせるとか
ユーザー定義関数を作成して使うとかですかね
間違えた。
どうしたいのか、もう少し具体的に書きましょう。

>「二桁以上の数字」限定で半角にできますでしょうか。
っていうか、もう半角になっているじゃん。
>それだとデータ扱いにくくないか?

良くこの質問理解出来たな…
エスパーか?
3−15ー22を
3−15ー22
にしたいってこと?


意図がよく分からんが、とりあえずその表を修正したいだけなら…

1 住所データのある列を選択しctrl+Hを押す
2 ー1と入力、置換後の欄にー1と入力
3 以下、ー2をー2…と続ける
4 次に、1ーと入力、置換後の欄に1ーと入力、以下、上記3のように続ける
5 1 ←(全角スペース)を入力し、置換後の欄に1 ←(全角スペース)を入力
6 最後に、これでも置き換えできなかった数字は手で直す


あんたにゃこれでいいだろ
たぶん
区切り位置使ってみたらどうでしょう。
?「ー」(長音?)を区切り文字に設定して各セルに分離
?それぞれif関数で10以下かどうかを判定し、10以上ならASC使用
?&で各セルを連結

面倒ですけど。
>ごまかしてもだめ

K氏もどきが増殖してるな…。
回答もせず、知ったか回答。
こいつは、質問も理解せず、他人の間違い探し。
質問が理解出来たなら、回答すれば良いのに…。
レス遅くなりました。

正規表現のような関数は無いようですね泣き顔
組版の世界では「二桁以上、等幅半角」が結構あり、エクセル入稿の時は困っていました。
皆様、お返事ありがとうございました。
マクロ(ユーザー定義関数を自作)でよいのなら、
RegExp(Microsoft VBScript Regular Expressions)を使えば楽ですね。
Lokiiiiiさん

正規表現のEXCEL関数はないので、やはりVBAを使ってユーザ関数を作った方が良いかと思います。
VBAだと正規表現のクラス(参照設定)を使えますので、細かな条件でも対応可能です。
必要ならユーザ関数を作成しましょうか?

確認ですが「数字1桁」は全角に変換するのですか?
たいらさんが関数作成してくださるとコメントされていますが
手が空いたのでたいらさんに恐縮ですが代わりに書いてみました。

頻繁に使用するのであれば「個人用マクロブック」に保存し、
以下の「ユーザー定義関数」を使用して変換された文字列を
コピー&値貼り付けして入稿するような運用にすると良いかもしれませんね。

ちなみに
> 確認ですが「数字1桁」は全角に変換するのですか?
は>>1の要件に書いてないので考慮していません。


'「VBE」で「標準モジュール」を挿入して、そこに記載
Option Explicit

Public Function f_全角2桁以上数値to半角数値(ByVal strArg As String) As String
  Const REG_FORMAT As String = "[0-9]{2,}"
  Dim lngList() As Long
  Dim objRegExp As Object
  Dim objRegMc As Object
  Dim objRegMt As Object
  Dim i     As Long
  Dim j     As Long
  Dim lngTmp  As Long

  Set objRegExp = CreateObject("VBScript.RegExp")

  objRegExp.Global = True
  objRegExp.Pattern = REG_FORMAT
  Set objRegMc = objRegExp.Execute(strArg)

  If objRegMc.Count = 0 Then
    f_全角2桁以上数値to半角数値 = strArg
    Exit Function
  End If

  ReDim Preserve lngList(objRegMc.Count - 1)

  For Each objRegMt In objRegMc
    lngList(i) = StrConv(objRegMt.Value, vbNarrow)
    i = i + 1
  Next

  Set objRegMt = Nothing
  Set objRegMc = Nothing
  Set objRegExp = Nothing

  For i = LBound(lngList) To UBound(lngList) - 1
    For j = LBound(lngList) To LBound(lngList) + UBound(lngList) - i - 1
      If lngList(j + 1) > lngList(j) Then
        lngTmp = lngList(j)
        lngList(j) = lngList(j + 1)
        lngList(j + 1) = lngTmp
      End If
    Next j
  Next i

  For i = 0 To UBound(lngList) Step 1
    strArg = Replace$(strArg, StrConv(lngList(i), vbWide), lngList(i))
  Next i

  Erase lngList

  f_全角2桁以上数値to半角数値 = strArg
End Function

関数の使い方は画像参照。
個人用マクロブックを使用する場合なども含めて、
「ユーザー定義関数」は「関数ダイアログ」からの使用が楽です。

わからない用語などありましたらカッコ内の用語 + excel などでググって調べてみてください。

ご参考までに。

もうちょっとシンプルなロジックにしたかったけど・・・ならなかったな・・・(独り言)
まだ実験途中ですので、上手くいくか分かりませんが
こんな感じでも出来るかもしれません
参考までに・・・

Function 全角2桁以上数値半角変換(str As String) As String
For i = 1 To Len(str)
  If IsNumeric(Mid(str, i, 2)) Then
    For j = 2 To Len(str) - i + 1
      If IsNumeric(Mid(str, i, j)) = False Or StrConv(Mid(str, i + j - 1, 1), 8) = " " Then Exit For
    Next j
    j = j - 1
    Nstr = Nstr & StrConv(Mid(str, i, j), 8)
    i = i + (j - 1)
  Else
    Nstr = Nstr & Mid(str, i, 1)
  End If
Next i
全角2桁以上数値半角変換 = Nstr
End Function
よっちゃんさん
お手数をお掛けします。

よっちゃんさんのユーザ関数名やマッチングパターンをそのまま利用させて頂きました。
注)
 ※VBScript.RegExp参照設定をした方がプログラムは作りやすいかも知れません。
 ※必要なら数字1桁を全角にする、半角全角混在の対応する等々も必要かも?

Public Function f_全角2桁以上数値to半角数値(ByVal strArg As String) As String
 Dim I As Integer
 Dim oRe As Object
 Dim oMatches As Object
 Set oRe = CreateObject("VBScript.RegExp")
 oRe.Global = True

 oRe.Pattern = "([0-9]{2,})"
 Set oMatches = oRe.Execute(strArg)
 For I = 0 To oMatches.Count - 1
  strArg = Replace(strArg, oMatches(I), StrConv(oMatches(I), vbNarrow))
 Next I
 f_全角2桁以上数値to半角数値 = strArg
 Set oRe = Nothing
 Set oMatches = Nothing
End Function
>よっちゃんさん、たいらさん、マリ男さん

御丁寧にありがとうございます泣き顔
早速、本日試してみます!
たいらさん

> VBScript.RegExp参照設定をした方がプログラムは作りやすいかも知れません
コーディングはしやすいでしょうね。
私は掲示板などでの回答は参照設定を促すことはほとんどありません。
コードをコピペでそのまま使えるようにするため、
Early BindではなくLate Bindでコード提示するようにしています。
もちろん質問者がEarly Bindのコード提示してきて「わからん」という場合には
回答する際にはそれに合わせたコードにしますがw

たいらさんご提示のコードと私のコードの違いは置換の順番ですね。
正規表現でHITした順に処理しているので、HITした前半で
後半に含まれる全角2文字以上の数値があった場合に後半がうまく動かないかと。
「東京都◯◯区◯◯町3ー15ー22 エクセルマンション225」
  ↓
「東京都◯◯区◯◯町3ー15ー22 エクセルマンション225」



マリ男さん

まだ実験途中とのことですが完成はしましたでしょうか。
IsNumericの判定ですと、「2.」などもTrueとなりますね。
そうなると、少しだけ改修する必要がありそうです。
今のままでは全角ピリオドなども半角に変換されてしまいます。
「東京都◯◯区◯◯町3ー15ー22 エクセルマンション2.25」
  ↓
「東京都◯◯区◯◯町3ー15ー22 エクセルマンション2.25」

とはいえ、とてもシンプルなロジックになりましたね^^
マリ男さんのコードをいじって文字列の置換を
Midステートメントなどで行えは最速・最軽量になりそうな気がします。
よっちゃんさん
ご指摘ありがとうございます。

Replaceの関数を以下の訂正すれば問題はなくなるかと思います。
strArg = Replace(strArg, oMatches(I), StrConv(oMatches(I), vbNarrow), , 1)

> …参照設定を促すことは…
> Early BindではなくLate Bindでコード…

そうですね。
VBAを使用する人は参照設定を覚えてもらいたいですが、中々そこまで理解している人は少ないような気がします。
質問者に大してシンプルに説明できる方が良いので「参照設定」をしない方が正解かも知れませんね。
>22
>IsNumericの判定ですと、「2.」などもTrueとなりますね。
確かにそうですね
かなり無理矢理ですが修正してみました

Function 全角2桁以上数値半角変換(str As String) As String
For i = 1 To Len(str)
  If Len(Mid(str, i, 2)) = 2 And IsNumeric(Mid(str, i, 2)) And InStr(StrConv(Mid(str, i, 2), 8), ".") = 0 Then
    For j = 2 To Len(str) - i + 1
      If IsNumeric(Mid(str, i, j)) = False Or StrConv(Mid(str, i + j - 1, 1), 8) = " " Or InStr(StrConv(Mid(str, i, j), 8), ".") <> 0 Then Exit For
    Next j
    j = j - 1
    Nstr = Nstr & StrConv(Mid(str, i, j), 8)
    i = i + (j - 1)
  Else
    Nstr = Nstr & Mid(str, i, 1)
  End If
Next i
全角2桁以上数値半角変換 = Nstr
End Function


>24,25は修正していないコードを貼り付けてしまったので
削除しました、すみません
たいらさん

前に友人に依頼されてファイルや文字列の暗号化ツールを作って送ったのですが
中で使用しているCAPICOM.DLLというMS製のモジュールが友人のPCになくて
コンパイルエラーでコードが1行も動かないなんてことありました。

参照設定すると動作が速いし組み込み定数が使えたりで
それはそれは恩恵が大きいのですけどね^^;
マクロは初心者だけど、作ってみた。
大量にある場合は、一気に変換できそう。
住所なので、三桁までとしたけど、自由に変更可能。
「半角数字→全角変換」を実行すれば、戻して何度でも試せる。

Sub 二桁以上全角数字→半角変換()
  For i = 999 To 10 Step -1
    Cells.Replace What:=StrConv(i, 4), Replacement:=i
  Next i
End Sub

Sub 半角数字→全角変換()
  For i = 0 To 9
    Cells.Replace What:=i, Replacement:=StrConv(i, 4)
  Next i
End Sub
これ一発で何桁でも行けるかも?

Sub 二桁以上全角数字→半角変換2()
  For i = 10 To 99
   Cells.Replace What:=StrConv(i, 4), Replacement:=i
  Next i
  For i = 0 To 9
   For j = 0 To 9
    Cells.Replace What:=StrConv(i, 4) & j, Replacement:=i & j
    Cells.Replace What:=j & StrConv(i, 4), Replacement:=j & i
   Next j
  Next i
End Sub

ログインすると、残り9件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。