Excel VBA質問箱 IV

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

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


5256 / 13644 ツリー ←次へ | 前へ→

【51750】住所を分けたい りんご 07/10/3(水) 15:26 質問[未読]
【51751】Re:住所を分けたい ひげくま 07/10/3(水) 16:24 発言[未読]
【51752】Re:住所を分けたい りんご 07/10/3(水) 16:48 質問[未読]
【51754】Re:住所を分けたい ハチ 07/10/3(水) 17:22 発言[未読]
【51755】Re:住所を分けたい りんご 07/10/3(水) 18:15 質問[未読]
【51756】Re:住所を分けたい ハチ 07/10/3(水) 18:31 発言[未読]
【51770】Re:住所を分けたい ハチ 07/10/4(木) 10:06 発言[未読]
【51823】Re:住所を分けたい りんご 07/10/6(土) 14:43 質問[未読]
【51824】Re:住所を分けたい G-Luck 07/10/6(土) 15:13 回答[未読]
【51825】Re:住所を分けたい りんご 07/10/6(土) 16:17 質問[未読]
【51826】Re:住所を分けたい G-Luck 07/10/6(土) 16:25 発言[未読]
【51827】Re:住所を分けたい じゅんじゅん 07/10/6(土) 16:40 発言[未読]
【51830】Re:住所を分けたい りんご 07/10/6(土) 17:22 質問[未読]
【51831】Re:住所を分けたい じゅんじゅん 07/10/6(土) 17:58 発言[未読]
【51832】Re:住所を分けたい じゅんじゅん 07/10/6(土) 18:05 発言[未読]
【51904】Re:住所を分けたい りんご 07/10/10(水) 15:43 お礼[未読]

【51750】住所を分けたい
質問  りんご  - 07/10/3(水) 15:26 -

引用なし
パスワード
   札幌市南区○○町1-1-1(または1丁目1-1)札幌アパート101
を住所とアパート名に分けたいのですがうまくいきません。

Public Sub jyuusyo01()
For i = 1 To 100
s = Cells(i, "M")
For j = 1 To 100
c = Mid(s, j, 1)
Select Case c
Case Is = IsNumeric(c)
flg = 1
Case "0"
Case "-"
Case "−"
Case Else
If flg = 1 Then
Cells(i, "O") = Mid(s, 1, j - 1)
Cells(i, "P") = Mid(s, j, 10)
flg = 0
GoTo p01
Else
flg = 0
End If
End Select
Next j
p01:
Next i
End Sub

番地の後ろにスペースはありません

【51751】Re:住所を分けたい
発言  ひげくま  - 07/10/3(水) 16:24 -

引用なし
パスワード
   ▼りんご さん:
こんにちは。

>札幌市南区○○町1-1-1(または1丁目1-1)札幌アパート101
>を住所とアパート名に分けたいのですがうまくいきません。

どのようにうまくいかないのでしょうか?

[F8]でステップ実行してみると、原因が解るかもしれませんよ。

【51752】Re:住所を分けたい
質問  りんご  - 07/10/3(水) 16:48 -

引用なし
パスワード
   ▼ひげくま さん:
>▼りんご さん:
>こんにちは。
>
>>札幌市南区○○町1-1-1(または1丁目1-1)札幌アパート101
>>を住所とアパート名に分けたいのですがうまくいきません。
>
>どのようにうまくいかないのでしょうか?
>
>[F8]でステップ実行してみると、原因が解るかもしれませんよ。

実行はできるのですが、札幌市南区○○町1と-1-1札幌アパート101となってしまったり、アパート名がないものがうまく反映できませんでした。

【51754】Re:住所を分けたい
発言  ハチ  - 07/10/3(水) 17:22 -

引用なし
パスワード
   ▼りんご さん:
>▼ひげくま さん:
>>▼りんご さん:
>>こんにちは。
>>
>>>札幌市南区○○町1-1-1(または1丁目1-1)札幌アパート101
>>>を住所とアパート名に分けたいのですがうまくいきません。
>>
>>どのようにうまくいかないのでしょうか?
>>
>>[F8]でステップ実行してみると、原因が解るかもしれませんよ。
>
>実行はできるのですが、札幌市南区○○町1と-1-1札幌アパート101となってしまったり、アパート名がないものがうまく反映できませんでした。

過去ログにいくつもありますよ。
こちらは参考になりませんか?
www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=41204;id=excel

【51755】Re:住所を分けたい
質問  りんご  - 07/10/3(水) 18:15 -

引用なし
パスワード
   ▼ハチ さん:
すいません、番地以降を取り出したいのですが、どこを参考にすれば?

【51756】Re:住所を分けたい
発言  ハチ  - 07/10/3(水) 18:31 -

引用なし
パスワード
   ▼りんご さん:
>▼ハチ さん:
>すいません、番地以降を取り出したいのですが、どこを参考にすれば?

質問を勘違いしてました。
「番地付きの住所」 と 「その他」
に分けたいということですね。

さっきのレスは無視してください。

【51770】Re:住所を分けたい
発言  ハチ  - 07/10/4(木) 10:06 -

引用なし
パスワード
   ▼ハチ さん:
>▼りんご さん:
>>▼ハチ さん:
>>すいません、番地以降を取り出したいのですが、どこを参考にすれば?
>
>質問を勘違いしてました。
>「番地付きの住所」 と 「その他」
>に分けたいということですね。

このデータで100%の精度を求めることは無理があると思います。
すべての住所情報(番地まで)を網羅した
データベースがあるならできるかもしれませんけど・・

最後の文字からチェックしていくほうが、多少マシかなと思い、
なんとなく考えてみました。

なんとなくなので、バグがあるかもしれません。

Option Explicit

Sub Test()
  Dim Str As String
  
  Str = "札幌市南区○○町1-1-1札幌アパート101"
  MsgBox Mid(Str, func_Spt_Len(Str))
  
  Str = "札幌市南区○○町1番地1-10札幌マンション1012"
  MsgBox Mid(Str, func_Spt_Len(Str))
  
  Str = "札幌市南区○○町1-1-1"
  MsgBox Mid(Str, func_Spt_Len(Str))
  
End Sub

Private Function func_Spt_Len(ByVal Str As String) As Long
  Dim i As Long
  Dim j As Long
  Dim all_len As Long
  Dim buf As Variant
  
  all_len = Len(Str)
  '最後から←に2文字づつチェックして -x の位置
  For i = all_len - 1 To 1 Step -1
    buf = Mid(Str, i, 2)
    If buf Like "-?" Then
      Exit For
    End If
  Next
  j = i + 1  ' - の分 +1
  '数値ではなくなるまで→に移動
  For i = j To all_len
    buf = Mid(Str, i, 1)
    If IsNumeric(buf) = False Then
      Exit For
    End If
  Next
  
  func_Spt_Len = i

End Function

【51823】Re:住所を分けたい
質問  りんご  - 07/10/6(土) 14:43 -

引用なし
パスワード
   すいません。質問の仕方が悪かったようですね。
住所は例えで、住所の中には区がないものもあります。

例  札幌市中央区中央町1丁目1-1
   小樽市小樽町1-1-1小樽マンション111
などが1000件ほどあります。
これを番地以降のマンション111に分けたかったのです。
わかりにくくてすいません。

【51824】Re:住所を分けたい
回答  G-Luck  - 07/10/6(土) 15:13 -

引用なし
パスワード
   ▼りんご さん:
はじめまして、G-Luckといいます。
下記のようなのでどうでしょうか?
仮定:マンション名に "-"が使われていない。
        「○○マンション-P1 105号室」は不可
   番地の最後は、-○○ となっている。
         ○番地○丁目○番は不可

Option Explicit

Public Sub jyuusyo01()
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim buf As Variant
  Dim s As String
  Dim flg As Integer
  
  For i = 1 To 100
    s = Cells(i, "M")
    n = InStrRev(s, "-")
    For j = 1 To 100
      buf = Mid(s, n + j, 1)
      If Not (IsNumeric(buf)) Then
        Cells(i, "O") = Mid(s, 1, n + j - 1)
        Cells(i, "P") = Mid(s, n + j)
        GoTo P01
      End If
    Next j
P01:
  Next i
End Sub

【51825】Re:住所を分けたい
質問  りんご  - 07/10/6(土) 16:17 -

引用なし
パスワード
   G-luckさんありがとうございます。
だいぶできました。

質問なんですが、例えば
元データ"L" 住所取り出し"P" アパート"Q"としたのですが、

アパート名のない住所までQ列に表示されてしまいました。
(住所はほかと変わらないのですが)
いろいろやってみましたが、そこはうまくできませんでした。

【51826】Re:住所を分けたい
発言  G-Luck  - 07/10/6(土) 16:25 -

引用なし
パスワード
   ▼りんご さん:
よろしければ、どんなプログラムを組んだ示してください。
また、結果も示していただければ幸いです。

【51827】Re:住所を分けたい
発言  じゅんじゅん  - 07/10/6(土) 16:40 -

引用なし
パスワード
   ▼りんご さん:
>すいません。質問の仕方が悪かったようですね。
>住所は例えで、住所の中には区がないものもあります。
>
>例  札幌市中央区中央町1丁目1-1
>   小樽市小樽町1-1-1小樽マンション111
>などが1000件ほどあります。
>これを番地以降のマンション111に分けたかったのです。
>わかりにくくてすいません。

>元データ"L" 住所取り出し"P" アパート"Q"としたのですが
横から失礼します。

○○番地○号でも対応できるように考えてみました。

Sub Test()
Dim Rexp As Object
Dim st As String, st1 As String
Dim Match As Object, Matches As Object
Dim i As Long
Set Rexp = CreateObject("VBScript.Regexp")
Rexp.Pattern = "-[0-9,0-9]+[^-]|号"

For i = 1 To Range("L" & Rows.Count).End(xlUp).Row
   st = Range("A" & i).Value
   Set Matches = Rexp.Execute(st)
     For Each Match In Matches
       If Match.Value = "号" Then
        st1 = Right(st, Len(st) - (Match.Length + Match.FirstIndex))
       Else
        st1 = Right(st, Len(st) - (Match.Length + Match.FirstIndex - 1))
      End If
      Exit For
     Next Match
   Range("P" & i).Value = Left(st, Len(st) - Len(st1))
   Range("Q" & i).Value = st1
Next
End Sub
ご参考になれば。

【51830】Re:住所を分けたい
質問  りんご  - 07/10/6(土) 17:22 -

引用なし
パスワード
   >じゅんじゅんさん
すいません、せっかく教えていただいたんですが、ここでエラーが・・・・
Range("P" & i).Value = Left(st, Len(st) - Len(st1))
内容もちょっと理解できなくて。VBA初心者ですいません((+_+))

>G-Luckさん
いただいたものをそのまま使った物です。
結果は
L:登別市登別町1−1−1 (実際の番地ではありません)
P:登別市登別町
Q:1-1-1
また 虻田郡虻田町虻田町111はQ列にそのまま入ってしまいます。

Public Sub jyuusyo01()
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim buf As Variant
  Dim s As String
  Dim flg As Integer
 
  For i = 1 To 1000
    s = Cells(i, "l")
    n = InStrRev(s, "-")
    For j = 1 To 100
      buf = Mid(s, n + j, 1)
      If Not (IsNumeric(buf)) Then
        Cells(i, "p") = Mid(s, 1, n + j - 1)
        Cells(i, "q") = Mid(s, n + j)
        GoTo p01
      End If
    Next j
p01:
  Next i
End Sub

【51831】Re:住所を分けたい
発言  じゅんじゅん  - 07/10/6(土) 17:58 -

引用なし
パスワード
   ▼りんご さん:
>>じゅんじゅんさん
>すいません、せっかく教えていただいたんですが、ここでエラーが・・・・
> Range("P" & i).Value = Left(st, Len(st) - Len(st1))
>内容もちょっと理解できなくて。VBA初心者ですいません((+_+))

テスト時のそのままを載せてしまいました。
以下を修正願います。
> st = Range("A" & i).Value
st = Range("L" & i).Value

実際目で見ているのとは違いますから、完全に分けるのは難しいかと思います。

【51832】Re:住所を分けたい
発言  じゅんじゅん  - 07/10/6(土) 18:05 -

引用なし
パスワード
   ▼じゅんじゅん さん:
>▼りんご さん:
>>>じゅんじゅんさん
>>すいません、せっかく教えていただいたんですが、ここでエラーが・・・・
>> Range("P" & i).Value = Left(st, Len(st) - Len(st1))
>>内容もちょっと理解できなくて。VBA初心者ですいません((+_+))

すいませんけども、こちらに差し替えお願いします。

Sub Test2()
Dim Rexp As Object
Dim st As String, st1 As String
Dim Match As Object, Matches As Object
Dim i As Long
Set Rexp = CreateObject("VBScript.Regexp")
Rexp.Pattern = "-[0-9,0-9]+[^-]|号"

For i = 1 To Range("L" & Rows.Count).End(xlUp).Row
   st = Range("L" & i).Value
   Set Matches = Rexp.Execute(st)
     For Each Match In Matches
       If Match.Value = "号" Then
        st1 = Right(st, Len(st) - (Match.Length + Match.FirstIndex))
       ElseIf Match.Length > 0 Then
        st1 = Right(st, Len(st) - (Match.Length + Match.FirstIndex - 1))
      End If
      Exit For
     Next Match
   Range("P" & i).Value = Left(st, Len(st) - Len(st1))
   Range("Q" & i).Value = st1: st1 = ""
Next
End Sub

【51904】Re:住所を分けたい
お礼  りんご  - 07/10/10(水) 15:43 -

引用なし
パスワード
   ▼じゅんじゅん さん:

いろいろありがとうございました。番地なしなどいろいろな問題もありましたが
なんとかできました。
(日にちかかりすぎですよね。)
また、よろしくお願いします。

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