重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!gooアプリ版

ExcelのVBAでLine Inputで取得した内容について、
いくつかの処理を行いたいのですが記述が分かりません。

どうか教えて頂きたく思います。

Sub test()
Dim buf As String
Open "D:\test.txt" For Input As #1
Do Until EOF(1)
Line Input #1, buf

「ここに入る処理の記述」

Loop
Close #1
End Sub

知りたい記述の処理内容

Bufの中を先頭から1文字1文字確認して…

1.もしBufの先頭と行末にスペースがあれば、スペースを削除(全角・半角・タブを対象)
2.もしBufに2文字以上の連続スペースがあれば、それが1文字になるまで削除(1文字だけは残す)
3.もしBufに半角英大文字があれば半角英小文字にする(または半角英小文字を半角英大文字にする)
4.もしBufに全角数字があれば、半角数字に置換する
5.もしBufに全角漢字(都道府県市区町村名等)しか無かった場合、特定の文字の後に全角スペースを入れる(県と市)
6.もしBufに数字の後に続く半角ハイフンがあった場合(2-5-301号室等)ハイフンを全角にする
7.もしBufに"郵便番号"或いは"〒"の文字があった場合、該当する文字のみを削除
8.もしBufに"東京都""沖縄県""大阪府""北海道""福岡県"以外の文字があった場合、該当する文字以外を削除
9..もしBufが47都道府県以外の文字で始まった場合、Bufの先頭に"都道府県名エラー"と加える

全て別々の処理として教えて頂きたく思います。
分かる部分だけで構いませんので、どうぞ宜しくお願い致します。

A 回答 (4件)

思いつくまま作って見ました。


住所録等で使用するのでしたら市町村名など、色々と考慮すべき事があるはずですがそれらはまったく考えていませんので注意して使ってください。

【A1】
buf = " abcde "
sAns1 = LTrim(RTrim(buf)) '「abcde」


【A2】正規表現を使用
Dim oRegExp As Object
Set oRegExp = CreateObject("VBScript.RegExp")
buf = "a b c de "
With oRegExp
  .Global = True
  .Pattern = "\s+"
  sAns2 = .Replace(buf, " ") '「a b c de」
End With


【A3】半角だけってのが難しい。半角・全角全て小文字化なら
buf = "aBCde "
sAns3 = StrConv(buf, vbLowerCase) '「abcde」


'【A4】ループを回して置換
buf = "123 "
sAns4 = buf
For i = 0 To 9
sAns4 = Replace(sAns4, Chr(Asc("0") + i), Format(i, "0"))
Next i '「123」


'【A5】全角のみかをチェックしてから置換。でも、「市川市」とかどうするの?
buf = "あああ県いいい市うう町"
sChk = StrConv(buf, vbFromUnicode)
If Len(buf) * 2 = LenB(sChk) Then
  sAns5 = Replace(buf, "県", "県 ")
  sAns5 = Replace(sAns5, "市", "市 ")
End If '「あああ県 いいい市 うう町」


'【A6】例では全角ハイフンが半角と見分けづらいのでダッシュを使用
buf = "2-5-201号室等"
sAns6 = buf
For i = 0 To 9
  sAns6 = Replace(sAns6, i & "-", i & "―")
Next i '「2―5―201号室等」


'【A7】
buf = "〒123-4567"
sAns7 = Replace(buf, "郵便番号","")
sAns7 = Replace(sAns7, "〒","")'「123-4567」



'【A8】正規表現を使用
Dim oRegExp As Object
Set oRegExp = CreateObject("VBScript.RegExp")
buf = "a福岡県aaa東京都港区沖縄県那覇市"
With oRegExp
  .Pattern = "[^東京都|沖縄県|大阪府|北海道|福岡県]"
  sAns8 = .Replace(buf, "") '「福岡県東京都沖縄県"」
End With


'【A9】正規表現を使用。(中略)の所には都道府県名をずらずらと登録のこと
Dim oRegExp As Object
Set oRegExp = CreateObject("VBScript.RegExp")
buf = "a青森県"
With oRegExp
  .Pattern = "^[北海道|青森県|(中略)|沖縄県]"
  sAns9 = buf
  If .Match(buf) = False Then
    sAns9 = "都道府県名エラー" & sAns9
  End If '「都道府県名エラーa青森県」
End With
    • good
    • 0

変換ロジックとチェックロジックとあるので分ける。

チェックなんてのは答は出るでしょう。

いかに効率よく変換、整形するか。

今ある機能要件をプログラムレベルのロジックに砕いて下さい。
それができてからコードを書く。

コードを書いて要件が合わないから書き直し、は時間の無駄になりかねない。
    • good
    • 0

うーん、質問内容としては、初歩的な内容も含まれていますから、そのレベルだと、おそらく、元のコード自体も修正したりできないのではないかと思います。

できるだけ、自分で調べて解決できる部分は、してほしいものです。

1. Trim 関数とReplace関数で出来るような気がします。
 a = " 123 "
 a = Replace(a, Space(1), Space(1), , , 1) 'TextCompare モードで、半角スペースに置換
 a = Replace(a, vbTab, Space(1), , , 1)
 b = Trim(a)
2.
 a = "12 345" 'すでに半角空白にしてあることが前提
 Do
  i = Len(a)
  a = Replace(a, Space(2), Space(1))
  j = Len(a)
 Loop While i > j
3.初級レベル
 a = "ABcDeF"
 b = StrConv(a, vbLowerCase) '小文字, 大文字は、vbUpperCase

4.3に準じます。初級レベルにつき割愛
全角数字があれば、半角数字に置換する
 vbNarrow

5.
 a = "宮崎県宮崎市日出町"
 If Not a Like "*[!一-龠]*" Then
  a = Replace(a, "県", "県 ") '後ろに全角空白
  a = Replace(a, "市", "市 ")
 End If
  b = a

6.初級レベル
 a= Replace(a,"-","-") 'デフォルト・BinaryCompareモード

7.初級レベル
 a = Replace(a,"郵便番号", "")
 a = Replace(a,"〒", "")
8.
 "東京都""沖縄県""大阪府""北海道""福岡県"以外の文字があった場合該当する文字以外を削除
  質問の意味がよく理解できません。
  例えば、「都内千代田区」「府内船場」
  というようなことでしょうか。ただ、9番と論理矛盾、もしくは、兼ねているように思います。都内・府内という特定の単語を削除するというのは可能でも、不特定の単語を削除は文字の切れ目がありませんから、掲示板上で簡易に公開する方法はないと思います。
 
9.
 Const PREFECT_LIST = "北海道,青森県,岩手県,秋田県,宮城県,山形県,福島県,新潟県,富山県,石川県,福井県, 長野県,茨城県, 栃木県, 群馬県, 埼玉県,千葉県, 神奈川県, 山梨県, 東京都,岐阜県,静岡県,愛知県,三重県," & _
 "滋賀県,京都府,兵庫県,奈良県,和歌山県,大阪府,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県,沖縄県"
 Prefects = Split(PREFECT_LIST, ",")
 '
 a = "千代田区丸の内"
 For Each c In Prefects
  If Not a Like c & "*" Then
   flg = True
   Exit For
  End If
 Next c
 If flg Then
  b = "都道府県名エラー!" & a
 End If
    • good
    • 0

バイト数をLENで求め、FOR文で繰り返しで間のスペースはとれる。

関数化とか。
UCASEとか大文字小文字扱う関数はみておく。


数字置き換えは10文字、10ケースしかない。

TABや全角スペースを一旦半角スペースにして半角スペースがいくつか並んだところを1つにするのがよさそう。
処理順番は工夫です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!