[[20031205173037]] 『つながった文字列を分ける方法』(よし) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『つながった文字列を分ける方法』(よし)

たとえば1234567という文字列を3と4で区切って別々のセルに表示させる簡単な方法は
ありますか


 どのような法則の元にわけるのでしょうか?
例えばなら =LEFT(A1,3)と=MID(A1,4,4)とか区切り位置ウィザードを使うとか
(ケン)


衝突ですm(_ _)m
初心者のくせに解答してみました!

=(LEFT,A1,3)
その横に
=(RIGHT,A1,4)

正解かな??

(藤本9)


 =LEFT(A1,3)と=RIGHT(A1,4)でしょう〜(^_^) (ケン)


住所禄を作っているのですが、最初に名前、続けて電話番号と住所が続いています。
名前のあとがスペースをあけずに電話番号(03〜とか)になっていて、数字のあとは同じくスペースなしで住所が続いています(東京都〜とか)。
うまく電話番号の前後で区切りたいのですが。上記の方法でできますか?


 そうなると話が違ってきますね。名前の文字数とか色々各セルで文字数が違うでしょうから・・・
答えになっていませんが・・・
やはり地道に名前、電話番号、住所の間にスペース等で区切り、区切り位置ウィザード
で区切るのが良いのではないでしょうか?ん〜、他にいい方法が有るかなぁ〜
検討中 (ケン)


ご指摘ありがとうです!!
勉強がんばりま〜〜す!!

(藤本9)


 こんな時こそユーザー関数や思いまんねんけどなぁ、ケンさん。最近なんぼユーザー
 関数書いてもVBAは分かりまへんっちゅうて肘鉄食らうばっかしで、腰が引けてきまし
 たわ。
 よしさん分かってくれまっしゃろか、ユ ー ザ ー 関数っちゅうのん。
 よしさん固有の関数の事で、普通の関数と全く同じに扱えます。
 もし、ご入用でしたらカキコしとっておくんなはれ。丁寧に説明してさしあげます。
    ほな...(弥太郎) 


 [弥太郎]さん、ぼやかない、ぼやかない。
 きっと、いいときもありますって。

 私はプログラマなのでどちらかというと、ユーザー関数ですっきり
 作るほうが好きです。

 でも、一般的にはまだまだユーザー関数やマクロは雲の上のもので、
 数式や標準関数を使う人が多いのは確かです。

 一番問題なのは、ユーザー関数にしても、それを作った人が
 どっか行っちゃったら、ブラックボックスになることです。
(kazu)

 はい!教えてちょ〜。一生懸命勉強します。
よしさん代理人(ケン)

 電話番号って市外局番から入力してあれば、必ず0始まりですよね?0から始まることを
前提にお話します。A列の名前、電話番号、住所が入力されているとします。B1に
=LEFT(A1,FIND("0",A1)-1)として下にコピー、C1に=MID(A1,FIND("0",A1),LEN(A1)-FIND("0",A1))
で下にコピーでB列に名前C列に電話、住所になります。B列とC列のコピーして形式を選択
して貼付けで値のみ貼付けC列を区切り位置ウィザードで電話番号と住所を区切ります。
但し、携帯番号などが含まれていると桁数が変わるので、この方法もダメです。
参考までに、です。弥太郎さんの出番を楽しみに待っててください。(ケン)

 ケンさん、Yosh!です。衝突しました。

 とりあえず数式を作ってみましたけど、電話番号の処理が難しいですね。
制限1:電話番号は 市外-市内-番号 の形式で必ず1つだけ入力。
制限2:国際電話や携帯電話など、特殊な電話番号は不可。
制限3:名前に 0が付く人,会社名等がない。※電話番号の始まりを0で探しているので
思いつくのはこれぐらいですが、他にもちゃんと動かない条件があるかもしれません。
その時は、やっぱり「ユ ー ザ ー 関数」の出番かもしれませんね。

 A1に元データがあるとします。
・B1に =LEFT(A1,FIND("0",A1,1)-1)
・C1に =IF(ISNUMBER(MID(SUBSTITUTE(A1,B1,),12,1)*1),LEFT(SUBSTITUTE(A1,B1,),12),LEFT(SUBSTITUTE(A1,B1,),11))
・D1に =SUBSTITUTE(A1,B1&C1,)
(Yosh!)

 みなさんこんばんわ。
 なんやら超満員の観客席の待つステージに上っていくようで、顔がこわばってますわ。

 例によって
 Alt+F11でVBEを開く
 「挿入」→「標準モジュール」を選択
 真新しい画面に下のコードをコピペ
 Alt+Qでエクセルに戻る
 これで準備完了

 仮にA列にデータが並んどるとして、B1に=yosi(a1)と入力してみておくんなはれ。
 ご希望のデータが抽出されてまっしゃろ。=yosiはあなたのリングねーむですさかい
 気ぃに要らなんだら何とでも変えてもろてよろしゅうおまんねんで、えぇ。
 今日初めて仕事したわ、え〜気分。
   ほなら...(弥太郎)
 ややこしから削除しました。


 衝突したので前に書かしてもらいます。
 弥太郎さん参考にさせてもらいます。が、これ名前しか取り出せないですよね?
隠し玉早く出してくださいな。弥太郎先生っ
Yosh!さんもすごいですね。全部数式とは!(ケン)

 お〜ミステイク!
 これ、名前だけしか拾い出してまへんわ。早速作り直します、はい。
 なにがええ気分や、ホンマに。
    チョンボの(弥太郎)

 この関数大したことおまへんわ。
 どないかして=yosi(a1)だけで出してやろうと気張りましたんやけど、あきまへんわ。
 ギブアップ。関数2こ書くんやったら普通の関数と変わりまへんで。なんと情けない。
 とりあえずC1に=yose(a1)と入れて貰わなしょうおまへんなぁ。
 さっさと寝とったらよかった...。あ〜ぁ。Yosh!さんも一個IC頂だ〜い。
   しょんぼり(弥太郎)
 ココもややこしから削除。


 電話番号は色々な桁数が有ります。数式では正直難しいと思います。
そこで弥太郎さんにお願い名前は数式で何とかなりそうですが電話番号はどうなります?
私の半導体の剥がれたICを差し上げますのでおせ〜て。(ケン)
弥太郎さんの口からギブアップの言葉聞きたくないよ〜

 乱入します!
 マクロです。
 標準化されていないデータにはもうこの手しかないでしょう。

 【準備】
 シート名「TEMP」を追加して47都道府県名をA1:A47へ作成してください。
 名簿作成はシート名「Sheet1」、A1からで設定しています。
 「新規シート」を挿入、「Sheet1」に名前を変更し
 名簿のデータをA1から貼り付けます。
 これを作業シートとしてください。

 念のため元データは別シートでそのまま保持しておくことをお勧めします。
 電話番号は半角の0で始まることを前提にしています。

【マクロの登録】

 弥太郎さんの方法拝借
 「例によって
 Alt+F11でVBEを開く
 「挿入」→「標準モジュール」を選択
 真新しい画面に下のコードをコピペ
 Alt+Qでエクセルに戻る」

 Sub TEST_20031206()

    Dim 都道府県(1 To 47) As String
    Dim MYCOUNT As Long
    Dim i As Long
    Dim C As Range

    Worksheets("Sheet1").Activate

    MYCOUNT = Worksheets("Sheet1").Range("A65536").End(xlUp).Row

    For i = 1 To 47
        都道府県(i) = Worksheets("TEMP").Cells(i, 1).Value
    Next i

    For Each C In Worksheets("Sheet1").Range("A1:A" & MYCOUNT)
        For i = 1 To 47
        C.Value = Application.WorksheetFunction.Substitute(C.Value, _
                都道府県(i), "," & 都道府県(i))
        Next i

        C.Value = Application.WorksheetFunction.Substitute(C.Value, "0", ",0", 1)

    Next C

    Columns("A:A").TextToColumns _
                    Destination:=Range("A1"), _
                    DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, _
                    Comma:=True, _
                    FieldInfo:=Array(Array(1, 1), Array(2, 2), Array(3, 1))

 End Sub

 【マクロ実行】
 上記の準備が全て済んだら、
 Alt+F8(マクロ実行)でTEST_20031206を選択して「実行」です。

 (KAMIYA)
 【付録】都道府県一覧
 行頭に半角スペースが入っているので置換などで半角スペースを
 取り除いてから使用してください。

 北海道
 青森県
 岩手県
 秋田県
 宮城県
 山形県
 福島県
 茨城県
 栃木県
 群馬県
 埼玉県
 千葉県
 東京都
 神奈川県
 山梨県
 長野県
 新潟県
 富山県
 石川県
 福井県
 静岡県
 愛知県
 岐阜県
 三重県
 滋賀県
 京都府
 大阪府
 兵庫県
 奈良県
 和歌山県
 島根県
 鳥取県
 岡山県
 広島県
 山口県
 香川県
 徳島県
 高知県
 愛媛県
 福岡県
 佐賀県
 長崎県
 大分県
 熊本県
 宮崎県
 鹿児島県
 沖縄県

 うわ〜、乱入者がえらいモン置いていきよりましたがな。
 昨日からマクロ付いてまんなぁ。私の地位を脅かす算段でんな。(笑い)

 私の大した事無い関数(一応電話番号の0以外でも対応)を使う場合はもうアノ=yose
 の方は削除しておくんなはれ。代わりにC1へ=MID(C1,IEN(A1)+1,69)でOKですわ。

 ケンさん、名前、電話番号、住所に三分割せよっちゅうことでっか?
   早朝から宿題出された(弥太郎)

 わしゃ何勘違いしとったんやろ、これ、初めから3分割せよと言う設問でッかぁ?
 アレまあ...。
    冴えに冴えてる(弥太郎)

 お待たせしました、ケンさん。
 これでどないやねん!

 A列にデータがあるとして
 B列に=yosi(a1)
 C列に=tel(a1)
 D列に=MID(C1,(LEN(H1)+LEN(I1)+1),69)

 どないかして2つの式にまとめようと思いましたんやけど、結局あきまへんでしたわ。
 これやったらユーザー関数っちゅうていばられしまへんわ。
 それに、細こう言うたら完璧ではおまへんねんで、えぇ。
 誰かが、手ぇ抜け言うてましたんでな。ここらへんで手ぇ打っときましたんで、アラ
 探したらあきまへんでぇ。にっこり(笑)。
   ほなら、アラ探してみてんか、言い訳用意しとるから(弥太郎)
 これもアラサガサレンウチに×。 


 >一番問題なのは、ユーザー関数にしても、それを作った人が
 どっか行っちゃったら、ブラックボックスになることです。
 それは言えまんなぁ。
 そのうち「このユーザー関数はどんな働きをするんですか?」っちゅうようなスレが
 登場するかも知れまへんわ。

 それといつかのスレにおましたように、やたら作ってしまうとそれこそどれがどれやら
 さっぱり分からんようになってしもうて、定義づけにやっきにならなアカン羽目に陥る
 やもしれまへんしなぁ。せいぜい2、3個に留めとくべきかもでんな。
    ほな...(弥太郎)


 こんにちは再び乱入者です。
 昨晩は「マクロしかありません」なんて書いてしまいましたが、
 一晩寝て冷静になってみると、気がつきました。
 ワークシート関数と区切り位置の調整しか使ってないんですよね。「あれ」。
 マクロじゃなくてもできるんじゃないだろうか?

 作業シートを用意して

 A2:Anへリストを張り付け。

 B1に「'0」と入力、C1:AW1に都道府県名を入力。
 B2へ

 =SUBSTITUTE(A2,B$1,CHAR(44)&B$1,1)

 としてコピー、 B2:AW2 へ貼り付け、
 B2:AW2を範囲選択してフィルハンドルをダブルクリック
 (リスト範囲へフィル)

 最右端の AW2:AWn をコピー、適当なセルへ値貼り付け、
 貼り付け後、「データ」→「区切り位置」

 「カンマやタブなどの・・・」にチェックして「次へ」
 「区切り文字」で「カンマ」にチェックして「次へ」
 電話番号の列を選択して「列のデータ形式」を「文字列」にして「完了」

 でマクロとまったく同じ作業を標準機能でやればよいはず・・・
 作業列はいっぱい使いますが、使っている数式は一つ。

 発言を訂正します。

「マクロじゃなくてもできます」

 教訓。
 ラブレターとVBコードはは深夜に書いてはいけない。
 乱入終わり。

 (KAMIYA)

 ユーザー関数でセミコロンを挿入します。
 =sep(A1)とか使います。
 あとは値をコピペして、区切り位置でやってくらはい。
 仕事中につき、未検証。
 (ramrun)

 Function sep(ByVal data As String) As String
 Dim n As Integer
 Dim ct As String, ca As Integer
 Dim flg As Integer
 data = StrConv(data, vbNarrow)
 flg = 0
 For n = 1 To Len(data)
    ct = Mid(data, n, 1)
    ca = Abs(AscW(ct))
    If flg = 0 And 48 <= ca And ca <= 57 Then
        sep = sep & ";" & ct
        flg = 1
    ElseIf flg = 1 And ca > 57 Then
        sep = sep & ";" & ct
        flg = 2
    Else
        sep = sep & ct
    End If
 Next n
 End Function

 大御所様の後塵を拝しまして。
 田舎の電話、携帯電話にも対応してございます。
 如何なものでしょうか。
 「文字列3分割コンペ 参加業者」(弥太郎kk)

 '------------------------------------
 これは、まあまあやけど新製品に比べたら落ちるんで削除
 '------------------------------------
 同じく×

 みなさん有難う御座います。今日は出張でお礼が遅くなりました。
今から皆さんの方法を試してみたいと思います。(ケン)

 >仕事中につき、未検証。
 未検証の報い。
 多摩川充;066-392-2238静;岡県横川市
 何で静岡だけ?未だ全部の県ははやってまへんけど...。
     未検証の検証者(弥太郎)

 へへぇ〜 私が悪ぅございました。お代官様。
 差し替えてやっておくんなせぇ。

 こんどはちょっとだけ、確認しやしたぜ(おぃ)。
 ほんとはユーザー関数にもう1つ引数を持たせて、
 1なら名前、2なら電話、3なら住所を返すようにしようかと思ったけど、
 それはケン坊にまかせます。

 (ramrun)帰ろう〜

 Function sep(ByVal data As String) As String
 Dim n As Integer
 Dim ct As String, ca As Integer
 Dim flg As Integer
 data = StrConv(data, vbNarrow)
 flg = 0
 For n = 1 To Len(data)
    ct = Mid(data, n, 1)
    ca = AscW(ct)
    If flg = 0 And 48 <= ca And ca <= 57 Then
        sep = sep & ";" & ct
        flg = 1
    ElseIf flg = 1 And (ca < 45 Or 57 < ca) Then
        sep = sep & ";" & ct
        flg = 2
    Else
        sep = sep & ct
    End If
 Next n
 End Function

 ヴォ〜!宿題が出てる!よ〜しガンバろっと。(ケン)

 必死に考えましたが、いい方法が思いつかず自分の無知さにがっかりだ〜!
全然進歩のない答えですが・・・
Function sep(ByVal data As String, typ As Integer) As String
 Dim n, i As Integer
 Dim ct As String, ca As Integer
 Dim flg As Integer
 data = StrConv(data, vbNarrow)
 flg = 0
 For n = 1 To Len(data)
    ct = Mid(data, n, 1)
    ca = AscW(ct)
    If flg = 0 And 48 <= ca And ca <= 57 Then Exit For
 Next n
 For i = n To Len(data) - n
    ct = Mid(data, i, 1)
    ca = AscW(ct)
    If flg = 0 And 48 <= ca And ca <= 57 Then
        flg = 1
    ElseIf flg = 1 And (ca < 45 Or 57 < ca) Then
        Exit For
    End If
 Next i
 If typ = 1 Then
    sep = Left(data, n - 1)
 ElseIf typ = 2 Then
    sep = Mid(data, n, i - n)
 ElseIf typ = 3 Then
    sep = Mid(data, i, Len(data) + 1)
 End If
 End Function
 他には今の私の知識のすべてを試しましたがダメでした。相当試したのですが・・・
でも、StrConv、Ascはためになりました〜m(_ _)m本当はiの値に納得してない〜
(ケン)


 もっと簡単に考えてくるかと思ってたけど、
 なかなかチャレンジャーだね。
 では簡単バージョン。

 A1にデータがあるときにB1に
 =sep($A1,COLUMN()-1)
 C1,D1へドラッグした後、そのままフィルハンドルをダブルクリック。

 Function sep(ByVal data As String, typ As Integer) As String
 Dim n As Integer
 Dim ct As String, ca As Integer
 Dim flg As Integer
 data = StrConv(data, vbNarrow)
 flg = 0
 For n = 1 To Len(data)
    ct = Mid(data, n, 1)
    ca = AscW(ct)
    If flg = 0 And 48 <= ca And ca <= 57 Then
        sep = sep & ";" & ct
        flg = 1
    ElseIf flg = 1 And (ca < 45 Or 57 < ca) Then
        sep = sep & ";" & ct
        flg = 2
    Else
        sep = sep & ct
    End If
 Next n
 Select Case typ
    Case 1
        sep = Mid(sep, 1, InStr(1, sep, ";", vbTextCompare) - 1)
    Case 2
        sep = Mid(sep, InStr(1, sep, ";", vbTextCompare) + 1, _
            InStrRev(sep, ";", , vbTextCompare) - 1 - InStr(1, sep, ";", vbTextCompare))
    Case 3
        sep = Mid(sep, InStrRev(sep, ";", , vbTextCompare) + 1, 100)
    Case Else
 End Select
 End Function

 ケン坊のならこれでいいかな。
 まだ条件がよく読み取れてないようだけど、
 80点あげよう。
 (ramrun)

 Function sep(ByVal data As String, typ As Integer) As String
 Dim n, i As Integer
 Dim ct As String, ca As Integer
 data = StrConv(data, vbNarrow)

 For n = 1 To Len(data)
    ct = Mid(data, n, 1)
    ca = AscW(ct)
    If 48 <= ca And ca <= 57 Then Exit For
 Next n

 For i = n To Len(data)
    ct = Mid(data, i, 1)
    ca = AscW(ct)
    If ca < 45 Or 57 < ca Then
        Exit For
    End If
 Next i

 If typ = 1 Then
    sep = Left(data, n - 1)
 ElseIf typ = 2 Then
    sep = Mid(data, n, i - n)
 ElseIf typ = 3 Then
    sep = Mid(data, i, Len(data) + 1)
 End If

 End Function

  でけたあああぁぁぁぁっ!!
 やっとイメージしとったやつがでけました。
 もう前のんはややこしくなるから消しときまっせえ。

 Alt+F11でVBEを開く
 Sheet1を選択
 F7でシートモジュールを開く
  Private Sub Worksheet_....
 っちゅうコードをコピペ

 「挿入」→「標準モジュール」を選択
 真新しい画面に下の test のコードをコピペ
 Alt+Qでエクセルに戻る
 これで準備完了

 後は出力したいセルに yosi と入力しておくんなはれ。
 メッセージボックスのOKをクリックすると、ほ〜ら、出てきまっしゃろ?
 どないでっか?気にいってくれました? Explictで確認済み
   ほな...(弥太郎)
 親方〜っ。AutoFitの複数の列をするばあい、Columns("A:I")と言った案配やなしに
 Columns(3:5)と列番で指定する事はでけしまへんのんでっか?

 '--------------------
  Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    If Target.Value = "yosi" Then
        test
    End If
    Application.EnableEvents = True
 End Sub
 '------------------------
 Sub test()
    Dim t As String, j As String, data As String
    Dim tc As Integer, nc As Integer, x As Integer, b As Integer, i As Integer
    Dim tr As Long, nr As Long, p As Long
    Dim n

    t = InputBox("どのセルのデータから始めますか?")
    If Range(t) = "" Then
        MsgBox "セルの選択が間違っています"
        Exit Sub
    End If
    MsgBox "yosiのセルから右へ 「名前」 「TEL No」 「住所」でよろしいか?"
    On Error Resume Next
    If ActiveCell.Value <> "yosi" Then
        ActiveCell.Offset(-1, 0).Activate
    End If
    j = ActiveCell.Address
    tr = Range(t).Row
    tc = Range(t).Column
    nr = Range(j).Row
    nc = Range(j).Column

    n = ""
    For p = tr To Cells(tr, tc).End(xlDown).Row

        data = Cells(p, tc)
        data = StrConv(data, vbNarrow)
        x = Len(data)
        For i = 2 To x
            n = Mid(data, i, 1) * 1
            If n <> "" Then
                Cells(nr, nc) = Left(data, i - 1)
                n = ""
                For b = i + 1 To x
                    n = Mid(data, b, 1) * 1
                    If n = "" Then
                        n = Mid(data, b, 1)
                        If n <> "-" Then
                            Cells(nr, nc + 1) = Mid(data, i, b - i)
                            Cells(nr, nc + 2) = Mid(data, b, 69)
                            nr = nr + 1
                            Exit For
                        End If
                    End If
                    n = ""
                Next b
                Exit For
            End If
            If Cells(nr, nc + 2) <> "" Then Exit For
        Next i
        n = ""
    Next p
    On Error GoTo 0
  ActiveSheet.Columns(Chr(64 + nc) & ":" & Chr(64 + nc + 2)).AutoFit   

 End Sub

 >複数の列をするばあい、Columns("A:I")と言った案配やなしに列番で指定する

 えぇ〜い。女々しいキャツめ。ダメなもんはダメなんやっ(笑)。
 しゃーないなぁ。
 これでDoや。

 ActiveSheet.Columns(Chr(64 + nc) & ":" & Chr(64 + nc + 2)).AutoFit

 どうせならSheet1に限定しないほうがいいと思いますた。
 (ramrun)

 ヒャッホ〜ッ、デンキュウ!
 とれとれの知識、早速上のコードに適用しますた。(アレ?最近舌の回りがおかしくな
 てきたナ)
 >どうせならSheet1に限定しないほうがいいと思いますた
 仰せの通りで...。
 AscWはまだようつこうとりまへん。
  もう1回、ヒャッホ〜!(弥太郎)

 疲れた〜!出張終わり!お〜80点もらってる〜!そっか〜。ふむふむ。
何か、またyosiVBAがグレードアップしてる〜、ふむふむ?分からん?
後で検証してみよ〜。とりあえず、ramrunさん、弥太郎さん、有難う御座います。
(ケン)

 弥太郎さん、確認しましたで〜。列幅まで変わり、面白いですね。
有難う御座います。(ケン)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.