• ベストアンサー

Excel VBAでの置換の方法について

Excelの各シートのA5:A104の列に文字列で「●着/●頭」というデータが入力されています。●は半角の1~2桁の数字になります。 例えば、 A5「5着/10頭」 A6「3着/12頭」 A7「6着/7頭」 といった文字列です。これを置換を使って「着」と「頭」を消して A5「5/10」 A6「3/12」 A7「6/7」 と表示されるようにしたいのですが、VBAで良いコードがありますでしょうか。シートは16ページあり、シート名は数字の1~16です。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

「置換」(VBA)でやってみました。 例データ A5:A7 質問例の通り、とする。 ーー 標準モジュールに Sub test01() For Each sh In Worksheets MsgBox sh.Name For Each cl In Range("A5:A104") If cl <> "" Then clw = cl.Value clw = Replace(clw, "着", "") clw = Replace(clw, "頭", "") cl.Value = "'" & clw End If Next Next End Sub これで文字列 5/10 3/12 6/7 になります。文字列ですから左詰めになります。右詰めにする書式はここでは省略。 ==== 同じ例データで Sub test01() For Each sh In Worksheets MsgBox sh.Name For Each cl In Range("A5:A104") If cl <> "" Then clw = cl.Value clw = Replace(clw, "着", "") clw = Replace(clw, "頭", "") cl.Value = clw End If Next Next End Sub で実行すると 5月10日 3月12日 6月7日 すなわちセルの値は、日付データすなわち、日付シリアル値がセットされます。 そして日付書式は、〇月〇日のタイプが既定される。 5/10とセルに入力すると(VBAでの入力でも)、/ があるお陰で、適格であれば、エクセルの日付データへの変換力は、強いので、日付と解釈されます。適格というのは、/ が入っていても、123/1のような例では、日付データに変換されません。 既出ご回答への、コメントにも応えようとして記述してます。

mzakom
質問者

お礼

大変シンプルでわかりやすいコードありがとうございます。 「'」を付けることで文字列扱いになることがわかったので勉強になりました。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率66% (1735/2605)
回答No.3

> どの部分で日付に変換されないようにしているのか教えていただければ幸いです。 先頭に'を入れると文字列として認識してくれるので tmp = "'" で先頭に'を入れてます。 セルを選択して数式バーを見ていただくと'5/10などになっているのがわかると思います。

mzakom
質問者

お礼

ありがとうございます。 先頭に「'」を付けることで文字列になるんですね。大変勉強になりました。

  • kkkkkm
  • ベストアンサー率66% (1735/2605)
回答No.2

No1の一部訂正です。 .Range("A5:A400") ↓ .Range("A5:A104")

  • kkkkkm
  • ベストアンサー率66% (1735/2605)
回答No.1

以下で試してみてください Sub Test() Dim c As Range, i As Long Dim myStr As String, tmp As String Dim Match As Object, Matches As Object With CreateObject("VBScript.RegExp") .Pattern = "[/0-9]" .Global = True tmp = "'" For i = 1 To 16 For Each c In Sheets(CStr(i)).Range("A5:A400") myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) For Each Match In Matches tmp = tmp & Match.Value Next Match Sheets(CStr(i)).Cells(c.Row, "A").Value = tmp tmp = "'" End If Next c Next i End With End Sub

mzakom
質問者

お礼

回答ありがとうございます。 コピペして動かしてみたら、無事やりたいことができました。ただ、1つ質問があるのですが、普通に置換をすると「1/10」などのデータは日付に勝手に変換されるのに、教えていただいたVBAコードだと、日付に変換されないで無事置換されるのはなぜでしょうか。 まだVBAは浅博なので後学のために、どの部分で日付に変換されないようにしているのか教えていただければ幸いです。

関連するQ&A

専門家に質問してみよう