• 締切済み

エクセルで枝番

    A      B         C        D         E 1 都道府県  市    枝番1     町     枝番2 2 東京都  中野区   1-1     あ町    1-1-1 3                       い町    1-1-2 4                       う町    1-1-3 5        新宿区   1-2     か町    1-2-2 6        渋谷区   1-3     さ町     1-3-1 7        台東区   1-4     し町     1-4-1  8 神奈川県 横浜市   2-1 9        横須賀市  2-2    た町    2-2-1       上のような表の枝番1と枝番2のところに、関数を使って連番を入れたいと思っています。 C3、C4、E8のようなところは空白のままにしておきたいです。 「COUNTA」「&」「IF」「MID」「FIND」「LEN」などを使うのではないかと思うのですが、複雑すぎて 私の能力を超えています。 どなたか、C2とE2に入れる数式を教えていただけないでしょうか。 どうかよろしくお願いいたします。

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.5です! たびたびごめんなさい。 投稿した後で気になったのですが・・・ データの行数として一番多くなる列はD列になるのではないかと思いますので、 前回のコード内の >For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row の部分(2行あります)を >For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row に訂正してみてください。 ※ 2行目から最終データ行まで を表示したいので、「4」の部分が「D列」になります。 何度も失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんばんは! 横からお邪魔します。 データが1万行を超えるということなので・・・ VBAでの一例です。 1行目はタイトル行でデータは2行目からあるとします。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので、 ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, k As Long Dim buf As String Application.ScreenUpdating = False For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row If Cells(i, 1) <> "" And Cells(i, 2) <> "" Then k = 1 With Cells(i, 3) .NumberFormatLocal = "@" .Value = WorksheetFunction.CountA(Range(Cells(2, 1), Cells(i, 1))) & "-" & 1 End With ElseIf Cells(i, 1) = "" And Cells(i, 2) <> "" Then k = k + 1 With Cells(i, 3) .NumberFormatLocal = "@" .Value = WorksheetFunction.CountA(Range(Cells(2, 1), Cells(i, 1))) & "-" & k End With End If Next i For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row If Cells(i, 3) <> "" Then k = 1 buf = Cells(i, 3) End If If Cells(i, 3) <> "" And Cells(i, 4) <> "" Then With Cells(i, 5) .NumberFormatLocal = "@" .Value = Cells(i, 3) & "-" & k End With ElseIf Cells(i, 3) = "" And Cells(i, 4) <> "" Then k = k + 1 With Cells(i, 5) .NumberFormatLocal = "@" .Value = buf & "-" & k End With End If Next i Application.ScreenUpdating = True End Sub 'この行まで ※ 少数データでしか検証していませんので、ご希望通りの動きにならなかったら ごめんなさいね。m(_ _)m

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 確認したいのですが、都道府県名や市名、及び町名の表示は、関数によって別のデータから引っ張って来たものではなく、キーボード入力等により、セルに直接入力されているものなのでしょうか?  又、東京都や中野区といった、都道府県名や市名は、同じ名前は必ず1回ずつしか現れず、 例えば、神奈川県が入力されている8行目よりも下の行に、再び東京都が現れたり、 「あ町」が入力されている行だけではなく、「い町」や「う町」が入力されている行にも、「中野区」と入力されていたり、 といった事は無いと考えて宜しいのでしょうか?  もし、上記のルールが厳密に守られている場合は、配列変数を使わずとも、普通の関数で完全自動化を図る事が出来ます。  まず、C列の中の適当なセルに次の関数を入力してから、そのセルをコピーして、C列のその他のセルに貼り付けて下さい。 =IF(INDEX($B:$B,ROW())="","",COUNTIF(INDEX($A:$A,ROW($A$1)+1):INDEX($A:$A,ROW()),"*?")&"-"&COUNTIF(INDEX($B:$B,MATCH("゛",$A$1:INDEX($A:$A,ROW()),-1)):INDEX($B:$B,ROW()),"*?"))  次に、E列の中の適当なセルに次の関数を入力してから、そのセルをコピーして、E列のその他のセルに貼り付けて下さい。 =IF(INDEX($D:$D,ROW())="","",COUNTIF(INDEX($A:$A,ROW($A$1)+1):INDEX($A:$A,ROW()),"*?")&"-"&COUNTIF(INDEX($B:$B,MATCH("゛",$A$1:INDEX($A:$A,ROW()),-1)):INDEX($B:$B,ROW()),"*?")&"-"&COUNTIF(INDEX($D:$D,MATCH("゛",$B$1:INDEX($B:$B,ROW()),-1)):INDEX($D:$D,ROW()),"*?"))

mangaa
質問者

補足

ご回答ありがとうございます。 A、B、D列のデータは、全て独立したものです。また、若い列にあるデータが、それ以降の列に出てくることはありません。ただ、B列やD列の行の中に、読み方は違うが漢字にすると同じ漢字になってしまうというもの、または、漢字は同じだが読み方は違うものがあるのですが、その場合は教えていただいた数式は使えないのでしょうか? 配列変数を使わずに済むということは、それだけ処理速度が速いと言うことですね。 すでにこの表にはいくつもの関数や条件付書式が入っていて、データも1万件を超えているため、1行ずらすだけで1分以上処理に時間がかかるということもあります。ですから軽いに越したことはありません。 本当にありがとうございます。 エクセルがここまでできる人ってほんと尊敬します。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

以下の数式でご希望のデータを表示できます。 ただし配列数式ですので、大量のデータを処理するときは、再計算に時間がかかるので、計算方法を手動にして、最後に表示させるときにF9キーで再計算させるなどの対応をしたほうが良いかもません。 C2セル =IF(B2="","",COUNTA($A$2:A2)&"-"&COUNTA(INDEX(B:B,MAX(INDEX(($A$2:A2<>"")*ROW($A$2:A2),))):B2)) E2セル =IF(D2="","",COUNTA($A$2:A2)&"-"&COUNTA(INDEX(B:B,MAX(INDEX(($A$2:A2<>"")*ROW($A$2:A2),))):B2))&IF(D2="","","-"&COUNTA(INDEX(D:D,MAX(INDEX(($B$2:B2<>"")*ROW($B$2:B2),))):D2))

mangaa
質問者

お礼

ありがとうございます!!! それにしてもすごすぎます。 まさかこれほど複雑になるとは思っていませんでした。 おかげで何十時間も節約することができます。 本当にありがとうございます。

  • -9L9-
  • ベストアンサー率44% (1088/2422)
回答No.2

まず相互の関連性の法則を明らかにしてください。法則のないものを数式化することは不可能です。

mangaa
質問者

補足

分かりづらくてすみません。 私はあるもののデータベースを現在作成しています。 A列は数が決まっているので固定番号をつけています。 しかしC列については、今後どんどん新たなデータが入ってきます。 そのたびに枝番2を手作業で変更するのはかなりの負担ですし、上記のような枝番を振ることができれば、まとまったデータを今後追加するとき、ソートによって入れたい場所にそのデータを入れることができるのではないかと思いました。 ソートをかける際に、あ町~う町の順番を崩さず、その後に続くようにしたいのです。 D列は実際にはあいうえお順に並んでいるのではなく、更に右にある列によってその順番が決まっています。 これで答えになっていますでしょうか?

noname#204879
noname#204879
回答No.1

セル E5 が「1-2-1」でなくて「1-2-2」になっているのは なぜ?

mangaa
質問者

補足

すみません。 私の入力ミスです。 正しくは「1-2-1」です。

関連するQ&A

  • Excel 住所分け市区郡

    ここで教えて頂いた式なのですが セルB1に =IF(MID(A1,4,1)="県",LEFT(A1,4),LEFT(A1,3)) セルE1に =MID(A1,LEN(B1)+1,150) セルC1に =IF(ISERROR(FIND("大和郡山市",E1))=FALSE,"大和郡山市",IF(ISERROR(FIND("四日市市",E1))=FALSE,"四日市市",IF(ISERROR(FIND("廿日市市",E1))=FALSE,"廿日市市",IF(ISERROR(FIND("郡山市",E1))=FALSE,"郡山市",IF(ISERROR(FIND("市原市",E1))=FALSE,"市原市",IF(ISERROR(FIND("郡上市",E1))=FALSE,"郡上市",IF(ISERROR(FIND("蒲郡市",E1))=FALSE,"蒲郡市",IF(ISERROR(FIND("小郡市",E1))=FALSE,"小郡市",IF(ISERROR(FIND("市川市",E1))=FALSE,"市川市",IF(ISERROR(FIND("郡",E1))=FALSE,LEFT(E1,FIND("郡",E1)),IF(ISERROR(FIND("市",E1))=FALSE,LEFT(E1,FIND("市",E1)),IF(ISERROR(FIND("区",E1))=FALSE,LEFT(E1,FIND("区",E1)),IF(ISERROR(FIND("町",E1))=FALSE,LEFT(E1,FIND("町",E1)),IF(ISERROR(FIND("村",E1))=FALSE,LEFT(E1,FIND("村",E1)),"")))))))))))))) セルD1に =SUBSTITUTE(SUBSTITUTE(A1,B1,"",1),C1,"",1) 大阪府大阪市西淀川区福町3丁目1-50→大阪府 大阪市 西淀川区福町3丁目1-50 兵庫県神戸市兵庫区芦原通1丁目2番26号→兵庫県 神戸市 兵庫区芦原通1丁目2番26号 となります。これを 大阪府大阪市西淀川区福町3丁目1-50→大阪府 大阪市西淀川区 福町3丁目1-50 兵庫県神戸市兵庫区芦原通1丁目2番26号→兵庫県 神戸市兵庫区 芦原通1丁目2番26号 と市と区は同じセルに分けたいです。郡も同じで市と同じセルに分けたいです。 分ける区分は都道府県  市区郡  町名・番地と三つに分けます。

  • エクセルの並び替えの仕方を教えてください

    質問番号:5465291で関数で文字分離ができずに困っていますと質問し、分離はうまくいきましたが、結果に対して並び替えが思うようにできません。どなたか教えてください。 回答は、 A1に値が入っているとして、 B1に =IF(ISERROR(FIND("-",A1)),A1,MID(A1,1,IF(FIND("-",A1)>0,FIND("-",A1)-1,LEN(A1)))) C1に =IF(ISERROR(FIND("-",A1)),"",MID(A1,IF(FIND("-",A1)>0,FIND("-",A1)+1,LEN(A1)),9999)) でした。 1 12 2 2111 3 という順番になってしまいます。

  • エクセル関数で住所から丁目番地、建物名を抽出したい

    エクセルで関数を使って、住所から、都道府県、市区町村、丁目番地、建物名をそれぞれ抽出するにはどうしたらよいですか? いま、C列に住所が入っています。 D列に、=LEFT(C3,4-SUM((MID(C3,3,1)={"都","道","府","県"})*1))という関数で都道府県を抽出しました。 F列に、=IF(E2="東京都", IF(COUNT(FIND({"東村山","武蔵村","羽村市"},LEFT(I2,3))), LEFT(I2,FIND("市",I2)), LEFT(I2,MIN(FIND({"市","区","町","村"},I2&"市区町村",2))) ), IF(COUNT(FIND({"今市市","四日市","八日市","廿日市"},LEFT(I2,3))), LEFT(I2,FIND("市",I2,FIND("市",I2)+1)), IF(IF(COUNT(FIND({"蒲郡市","大和郡","小郡市"},LEFT(I2,3))),"市",IF(COUNT(FIND({"余市郡","高市郡"},LEFT(I2,3))),"郡",MID(I2,MIN(FIND({"市","郡"},I2&"市郡",2)),1)))="市", IF(COUNT(FIND({"札幌市","仙台市","千葉市","横浜市","川崎市","名古屋","京都市","大阪市","神戸市","広島市","北九州","福岡市"},LEFT(I2,3))), LEFT(I2,FIND("区",I2)), LEFT(I2,FIND("市",I2,2)) ), IF(COUNT(FIND({"佐波郡玉村","恵那郡岩村","東宇和郡野","杵島郡大町","北松浦郡鹿"},LEFT(I2,5))), LEFT(I2,FIND("郡",I2)+3), LEFT(I2,MIN(FIND({"町","村"},I2&"町村",FIND("郡",I2)+2))) ) ) ) ) という関数を使って市区町村を抽出しました。 あとは、丁目番地と建物名を別々のセルに抽出したいです。 よきアドバイスをお願いいたします。 区切りに半角空いてるとかいうことはありません。 膨大な住所録を処理したいので、例外が多いのは使えません。 なかなか厳しい質問だとは思いますが、どうぞご教授くださいませ。よろしくお願いいたします。

  • エクセル複数条件の並べ替えについて

    こんばんは。 いつもお世話になり、ありがとうございます。 現在、エクセル2007を利用しております。 現在、並べ替えが上手くいかず、頭を抱えています。 -------------------------------------------------------    A    B    C    D    E 1 区名  町名  丁目  番地  枝番 2 ●区  △△町 05    200   005 3 ●区  △△町 01    300   004 4 ●区  ○○町 03    900   008 5 ●区  ○○町 00    315   200           ・           ・           ・ ------------------------------------------------------- 上記のような表を 町名ごとでまとめ、C列(丁目)・D列(番地)・E列(枝番)の番号を若い数字順に並べ替えたいと思っています。 並べ替えで、 ・町名 ・丁目 ・番地 ・枝番 の優先順位で並べ替えをしてみたのですが、枝番だけ若い数字順なりません。 4条件が揃うような並べ替えの方法というのはあるのでしょうか。 ちなみに、△△町・○○町共各数百行はあります。 ご存知の方がおられましたら、どうかご教授下さいますと助かります。 どうぞよろしくお願いします。

  • エクセルの住所文字列操作について

    東京都板橋区新町2-3-4のような住所の”区”や埼玉県川越市新町1-2-3のような”市”から後ろをとりだしたいとかんがえております。=RIGHT(E3,LEN(E3)-FIND("区",E3)) 区の取り出しには成功しました。これを区でも市でもとりだせるように変更したいのですが、どのようにしたらよいでしょうか?

  • EXCELのマクロ :再帰的式を使って書き換える

    次のEXCELのマクロ プログラムを再帰的式を使って シンプルにするにはどんな風にすればよういのでしょうか。よろしくお願いします。 Public Sub p() Dim c, base As Range Dim str As String Dim i1, i2, i3 Dim c1, c2, c3 Dim o1, o2, o3 Set base = Range("A1") c = 0 str = "ABCD" For i1 = 1 To Len(str) c1 = Mid(str, i1, 1) o1 = Replace(str, c1, "")    For i2 = 1 To Len(o1)    c2 = Mid(o1, i2, 1)    o2 = Replace(o1, c2, "")      For i3 = 1 To Len(o2)      c3 = Mid(o2, i3, 1)      o3 = Replace(o2, c3, "")      base.Offset(c).Value = c1 & c2 & c3 &       c4 & c5 & o5      c = c + 1      Next    Next Next End Sub

  • Excel 住所分け

    A1 大阪府泉南市信達童子畑20 埼玉県吉川市中野338 東京都足立区鹿浜6-26-10 B1        C1      D1  大阪府       泉南市    信達童子畑20 埼玉県       吉川市    中野338 東京都       足立区    鹿浜6-26-10 都道府県/市区郡/町名・番地 と三つに分けたいです。 どうやったらできますか。

  • 宅配便の届け先住所に不備がありました。

    ヤマト運輸の宅配便です。 インターネットで商品を申し込んだ際、届け先住所の不備に気付かずに申し込んでしまいました。 詳しく説明しますと、郵便番号、都道府県、市、枝番(条・丁目)、番地は記入したのですが、 ○○区、○○(町や村の地名に相当するのでしょうか)が漏れてしまっていました…。 市までわかっていて、また郵便番号で区・枝番がわかっているなら、はたして荷物は届くのでしょうか? そもそもしっかり確認しなかった私が悪いのですが、無事届くかどうか気になります… どうかご回答よろしくお願いします。

  • 前後の入替(区切りが2回出現する場合)

    B4セル下記のようなファイル名だとして  01 - Home Wide - Number.mp3 それをD4に   01 - Number - Home Wide.mp3 のように前から2番めの「 - 」の前後で前後を入れ替えた形に整形したいのですが 「 - 」が2回出現するので上手く処理できないでいます。 どのような関数になりますか ? 1回なら、 C4:=Left(B4,Len(B4)-4) D4: =RIGHT(C4,LEN(C4)-FIND("-",C4))&" - "&LEFT(A1,FIND(" - ",A1)-1)&".mp3" で処理できますが、 2回出現する場合の考え方が分かりません。 --------------------------- できれば、VBAでのコードも教えてもらえれば  余分な列(C列)を作らなくて良いので嬉しいです。

  • EXCELで郵便番号を入力すると住所を表示するようにしたい

    IMEの機能のみを使った住所入力を作ってみました。   A    B               C      D    E 1 郵便番号 郵便番号入力          補助住所入力 都道府県 市町村 2 047-0028 北海道小樽市相生町       4-4-4  北海道  小樽市相生町 3 334-0001 埼玉県鳩ヶ谷市桜町       1-2    埼玉県  鳩ヶ谷市桜町    :          : 9 602-0001 京都府京都市上京区竹園町    大マンション 京都府  京都市上京区竹園町 上のように   A列 郵便番号表示(算式)   B列 郵便番号入力   C列 補助住所入力   D列 都道府県表示(算式)   E列 市町村表示 (算式) としてみます。B列に郵便番号を入力、C列には補助住所を入力します。 郵便番号は、IMEをONの状態(日本語入力オン)で全角で『047-0028』のように入力して変換します。 A2には 式 =IF(NOT(ISERROR(PHONETIC(B2))),ASC(PHONETIC(B2)),"") をセット。 D2には 式 =LEFT(B2,MAX(MIN(FIND({"都","道","府","県"},B2&"都道府県")),3)) をセット。 E2には 式 =MID(B2,MAX(MIN(FIND({"都","道","府","県"},B2&"都道府県")),3)+1,1000) をセット。 *************** 以前の回答から上の方法で試してみたのですが、 この関数で郵便番号‐(ハイフン)なし、 市町村の後に番地まで同じセルで表示させる事は可能ですか。 できなかったら、他にうまくいく方法はありませんか? 詳しくないので、分かりやすく解説していただくと助かります。

専門家に質問してみよう