Excel VBA質問箱 IV

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

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


3298 / 13645 ツリー ←次へ | 前へ→

【63039】セル内の文字の書き替え くまけん 09/10/3(土) 10:43 質問[未読]
【63040】Re:セル内の文字の書き替え kanabun 09/10/3(土) 11:14 発言[未読]
【63042】Re:セル内の文字の書き替え くまけん 09/10/3(土) 11:39 発言[未読]
【63043】Re:セル内の文字の書き替え kanabun 09/10/3(土) 12:02 発言[未読]
【63045】Re:セル内の文字の書き替え くまけん 09/10/3(土) 13:19 発言[未読]
【63044】Re:セル内の文字の書き替え kanabun 09/10/3(土) 13:12 発言[未読]
【63046】Re:セル内の文字の書き替え くまけん 09/10/3(土) 13:32 お礼[未読]

【63039】セル内の文字の書き替え
質問  くまけん  - 09/10/3(土) 10:43 -

引用なし
パスワード
   Sheet1のA列に所有者名称が記載されていますが、
その名称によって「所有者コード」に分類することになりました。
例えば、「株式会社 日本」や「日本寺」、「医療法人 日本会」、
「鳩山太郎」などが羅列していますので
個人名以外をあいまい検索を行って、B〜Dのコードに置き換えています。

コード入力時の「b〜d」以外は”Else”の部分となりますが、
b〜dを順番に処理を行うことで、残る所有者名称の列は、
1文字または1バイト以外が個人名ということになります。
そこを判断させた後に「A」に書き換えたいと思っていますが、
その場合の記述が分りませんし、何か良い方法はあるでしょうか。

わたしの分る範囲でVBAを書いてみました。
どうか宜しくお願い致します。

Option Explicit
Sub コード置き換え()
  Dim StrInput As String
  StrInput = InputBox("所有者コードを「小文字」で入力してください")
    ElseIf StrInput = "b" Then
      With Worksheets("Sheet1").Range("A2:A65536")
        .Replace What:="*寺*", Replacement:="B", _
          SearchOrder:=xlByColumns, MatchByte:=False
        .Replace What:="*宮*", Replacement:="B", _
          SearchOrder:=xlByColumns, MatchByte:=False
        .Replace What:="*神社*", Replacement:="B", _
          SearchOrder:=xlByColumns, MatchByte:=False
      End With
     ElseIf StrInput = "c" Then
      With Worksheets("Sheet1").Range("A2:A65536")
        .Replace What:="*会社*", Replacement:="C", _
          SearchOrder:=xlByColumns, MatchByte:=False
        .Replace What:="*(有)*", Replacement:="C", _
          SearchOrder:=xlByColumns, MatchByte:=False
        .Replace What:="*(株)*", Replacement:="C", _
          SearchOrder:=xlByColumns, MatchByte:=False
        .Replace What:="*(株)*", Replacement:="C", _
          SearchOrder:=xlByColumns, MatchByte:=False
      End With
    ElseIf StrInput = "d" Then
      With Worksheets("Sheet1").Range("A2:A65536")
        .Replace What:="*法人*", Replacement:="D", _
          SearchOrder:=xlByColumns, MatchByte:=False
      End With
    Else
'      ここにどのような記述をすれば良いのでしょう?
    End If
End Sub

【63040】Re:セル内の文字の書き替え
発言  kanabun  - 09/10/3(土) 11:14 -

引用なし
パスワード
   ▼くまけん さん:こんにちは。

よく分かりませんです。

A列に
1 所有者名称
2 寺田虎彦
3 宮田輝
4 矢神社人

とあって、InputBoxに "b" と入力したとたん
A列が
1 所有者名称
2 B
3 B
4 B

と置き換わってしまうのだとしたら、
それはとても危険な処理なのでは?

【63042】Re:セル内の文字の書き替え
発言  くまけん  - 09/10/3(土) 11:39 -

引用なし
パスワード
   >kanabunさんへ 

回答をありがとうございます。お世話さまになります。
kanabunさんがおっしゃる通り、
その文字を含んでいた場合は一気に置き換わってしまうため、
A列をB列にコピーしております。

お叱りを受けるのは当然ですが、
数万行の複数のシートを処理しなくてはいけないため、
変更後はA列とB列を見直すことでチェックも出来るからと
わたしが考えた苦肉の策です。申し訳ありません。

【63043】Re:セル内の文字の書き替え
発言  kanabun  - 09/10/3(土) 12:02 -

引用なし
パスワード
   ▼くまけん さん:

>A列をB列にコピーしております。
>数万行の複数のシートを処理しなくてはいけないため、
>変更後はA列とB列を見直すことでチェックも出来るからと

では、とりあえず、こんなふうに 確実なものだけB列に出力して
みてはいかがでしょう?
(B列にコピーしておく必要はありません)

Sub 所有者コード判別()
 Dim 範囲 As Range
 Dim v As Variant
 Dim i As Long
 
 Set 範囲 = Range("A2", Cells(Rows.Count, 1).End(xlUp))
 v = 範囲.Value
 For i = 1 To UBound(v)
   Select Case True
     '確実なものから 仕分けする
     Case v(i, 1) Like "*会社*": v(i, 1) = "C"
     Case v(i, 1) Like "*(株)*":  v(i, 1) = "C"
     Case v(i, 1) Like "*(株)*": v(i, 1) = "C"
     Case v(i, 1) Like "*(有)*": v(i, 1) = "C"
     Case v(i, 1) Like "*会社*": v(i, 1) = "C"
     Case v(i, 1) Like "*法人*": v(i, 1) = "D"
     Case v(i, 1) Like "*神社*": v(i, 1) = "B"
     Case v(i, 1) Like "*寺*":  v(i, 1) = "B?"
     Case v(i, 1) Like "*宮*":  v(i, 1) = "B?"
   End Select
 Next
 範囲.Offset(, 1).Value = v
 MsgBox "判別不能な名称はA列のままです。編集してください"
End Sub

【63044】Re:セル内の文字の書き替え
発言  kanabun  - 09/10/3(土) 13:12 -

引用なし
パスワード
   ▼くまけん さん:

>変更後はA列とB列を見直すことでチェック

上のサンプルコードにちょっと追加してみました。
判別できなかったものは 「A?」「B?」などとB列に出力しますから
出力後、B列にフィルタをかけ
「B列の文字列が2文字以上」ある行だけ表示します。

Sub 所有者コード判別ex()
 Dim 範囲 As Range, 条件範囲 As Range
 Dim v As Variant
 Dim i As Long
 If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
 Set 範囲 = Range("A1", Cells(Rows.Count, 1).End(xlUp))
 v = 範囲.Value
 v(1, 1) = "所有者コード"
 For i = 2 To UBound(v)
   Select Case True
     '確実なものから 仕分けする
     Case v(i, 1) Like "*会社*": v(i, 1) = "C"
     Case v(i, 1) Like "*(株)*":  v(i, 1) = "C"
     Case v(i, 1) Like "*(株)*": v(i, 1) = "C"
     Case v(i, 1) Like "*(有)*":  v(i, 1) = "C"
     Case v(i, 1) Like "*(有)*": v(i, 1) = "C"
     Case v(i, 1) Like "*法人*": v(i, 1) = "D"
     Case v(i, 1) Like "*神社*": v(i, 1) = "B"
     Case v(i, 1) Like "*寺*":  v(i, 1) = "B?"
     Case v(i, 1) Like "*宮*":  v(i, 1) = "B?"
     Case Else:         v(i, 1) = "A?"
   End Select
 Next
 範囲.Offset(, 1).Value = v
 
 Set 条件範囲 = [E1:E2]
 条件範囲.ClearContents
 条件範囲.Item(2).Formula = "=LEN(B2)>1"
 範囲.Resize(, 2).AdvancedFilter xlFilterInPlace, 条件範囲
 
 MsgBox "編集してください"
End Sub

【63045】Re:セル内の文字の書き替え
発言  くまけん  - 09/10/3(土) 13:19 -

引用なし
パスワード
   >kanabunさんへ

なるほど!、このような方法もあるんですね。
これだとA列とB列を見比べることもできます。
歓心しました。ありがとうございます。

しかし、残りの修正も結構な量があるんで、
ちょっと考えさせられます。
自分には分らないので、ネット等を探して
Elseの「1バイトまたは1文字以上なら”A”」って処理を
引き続き考えてみたいと思います。

【63046】Re:セル内の文字の書き替え
お礼  くまけん  - 09/10/3(土) 13:32 -

引用なし
パスワード
   >kanabunさんへ

これはまた感激です!。
いろいろと考えて頂き、本当にありがとうございます。
この仕様だと、2文字以上だけが残り、
編集もより簡単になります。

今のわたしはkanabunさんの足元にも及ばないどころか
5m以内にも近付けないですが、
これからはkanabunさんや他の方々の力量を見習い、
勉強したいと思っています。

これからもお世話になるだろうと思いますが
宜しくお願い致します。
ありがとうございました。

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