- 締切済み
エクセルで連番をつける
A B・・・ E F・・・ AAA 111 1 1 AAA 222 1 2 BBB 333 2 3 CCC 444 3 4 CCC 555 3 5 入力はA,B列だけです。 (1)A1を入力するとE1は1を表示。B1を入力するとF1は1を表示。 (2)A2を入力した時に、A1と同じ名前ならばE2は1、違う場合は2を表示。以下同条件。 (3)F列は1~連番になります。 (4)途中で行挿入、行削除を行っても自動的にE、F列を修正。 上記の内容で処理するにはどうすれば良いでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- fly_moon
- ベストアンサー率20% (213/1046)
>テストしてみまして、行の挿入・削除がなければでき>ました。 行の挿入・削除をしても最終行をきちんと指定すれば ちゃんと動きましたよ。 もしかして最終行を固定にしてしまっているのでは? >できればA1を入力したらE1に、B1を入力したらF1に自>動的に表示し、追加・削除にも対応させる事は可能で>しょうか。 入力時に自動で表示することはできますが、挿入・削除には対応できません。 VBAにはイベントというのがあって、シートやBOOOKに 何らかの変化があったときにマクロ(プロシージャ)を 実行することが可能です。でも、そのイベントの種類が限られています。挿入・削除のイベントは存在しません。下記に参考URLをいれましたのでイベントはそちらで確認してください。(せめてキーボードを押したときのイベントがあれば可能なのですが) また、入力時に表示するとすれば、上から連番を取っているので毎回マクロが実行されなければならないでしょう。そうなると、データ量が多くなると、入力時の待ち時間がかかってちょっと鬱陶しいことになりますよ。 連番は何のために必要なのでしょうか?IDですか? データはなんでもいいのでどういうシートを作りたいのかもうちょっと詳しく教えてください。
- matsu_jun
- ベストアンサー率55% (146/265)
1行空いてしまったところをどうするかによって処理方法が変わってきます。 1行空いている場合も他と同様に考えるのか(E、F列に数字を入れるのか)、 1行空いた場合はE、F列も空欄にするのかです。 後者の場合は特に何も処理の必要が無いことから考えると、恐らく前者でしょう。 というわけで、 'ここから--------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error GoTo ERREND Application.EnableEvents = False Application.ScreenUpdating = False Range("E:F").Clear EndRowA# = Range("A65536").End(xlUp).Row EndRowB# = Range("B65536").End(xlUp).Row ColEVal# = 1 ColFVal# = 1 For i# = 1 To EndRowA If i > 1 Then If Cells(i - 1, 1).Value <> Cells(i, 1).Value Then ColEVal = ColEVal + 1 End If Cells(i, 5).Value = ColEVal Next i For i = 1 To EndRowB Cells(i, 6).Value = ColFVal ColFVal = ColFVal + 1 Next i ERREND: Application.ScreenUpdating = True Application.EnableEvents = True End Sub 'ここまで--------------------------------------------------------- をシートのモジュールに貼り付ければOKです。(貼り付け方は後述します) もしも後者(空欄はE、F列に何も記載しない)であれば、 'ここから--------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error GoTo ERREND Application.EnableEvents = False Application.ScreenUpdating = False Range("E:F").Clear EndRowA# = Range("A65536").End(xlUp).Row EndRowB# = Range("B65536").End(xlUp).Row ColEVal# = 1 ColFVal# = 1 For i# = 1 To EndRowA If Cells(i, 1).Value <> Empty Then If i > 1 Then If Cells(i - 1, 1).Value <> Cells(i, 1).Value Then ColEVal = ColEVal + 1 End If Cells(i, 5).Value = ColEVal End If Next i For i = 1 To EndRowB If Cells(i, 2).Value <> Empty Then Cells(i, 6).Value = ColFVal ColFVal = ColFVal + 1 End If Next i ERREND: Application.ScreenUpdating = True Application.EnableEvents = True End Sub 'ここまで--------------------------------------------------------- を貼り付ければOKです。行挿入、行削除の瞬間は値は変わりませんが、別のセルを クリックした瞬間にデータが入れ替わります。 ただし、この処理は、任意のセルをクリックするたびに発生するイベントであり、 且つ毎度E、F列を全削除して後、1行目からデータを入れ直す処理を行っているため データが増えると大変動作が遅くなるのでご注意ください。 貼り付け方と実行の仕方 1) 本処理を行いたいシートのタブを右クリックし、「コードの表示(V)」を選択 2) 表示された「Microsoft Visual Basic」ウィンドウの右側の空欄に 上のどちらかを選択してコピー、貼り付け 3) Microsoft Visual Basicウィンドウを閉じる
- fly_moon
- ベストアンサー率20% (213/1046)
ty001さんのやりたいことが、 A列の条件で E列に分類(番号) F列にデータ数(連番) を入力する ということと解釈しましたがよかったですか? その場合、入力のタイミングで分類と連番は必要ですか?必要なときにE,F列にマクロ実行で入力していく方法でよければVBAを開いて、標準モジュールを追加し、 Sub TEST() Dim i As Long Dim str As String Dim StartRow As Integer Dim EndRow, bunrui, renban As Long Dim joukenretsu, bunruiretsu, renbanretsu As String '*Start----------------------------------------- 'データのある行 StartRow = 2 '始まりの行(1行目がタイトルの場合) EndRow = InputBox("最終行を指定") '最終行数値で指定 '列の指定 joukenretsu = "A" '条件にする列 bunruiretsu = "E" '分類にする列 renbanretsu = "F" '連番の列 '分類と連番の最初の番号 renban = 1 bunrui = 0 '*End------------------------------------------- '処理開始 str = "" For i = StartRow To EndRow If Range(joukenretsu & i) = str Then Else bunrui = bunrui + 1 str = Range(joukenretsu & i).Value End If Range(bunruiretsu & i).Value = bunrui Range(renbanretsu & i).Value = renban renban = renban + 1 Next End Sub を貼り付けて'*Startから'*Endまでの各値をカスタマイズしてマクロを実行すれば毎回実行のたびに分類と 連番を上から作成してくれます。 入力ごとに行うとすると、削除時の処理と入力時の処理に分ける必要があります。ちょっと大変になりそうな予感・・・・・ 参考になるでしょうか?
補足
テストしてみまして、行の挿入・削除がなければできました。 できればA1を入力したらE1に、B1を入力したらF1に自動的に表示し、追加・削除にも対応させる事は可能でしょうか。
- Wendy02
- ベストアンサー率57% (3570/6232)
>(4)途中で行挿入、行削除を行っても自動的にE、F列を修正。 行挿入の場合は、式がなくなるのでVBAになると思います。 上の行から、ドラッグしてコピーしてください。 E1: =IF(A1<>"",1,"") E2: =IF(A2="","",IF(COUNTIF($A$1:A2,A2)>1,MAX($E$1:E1),MAX($E$1:E1)+1)) ドラッグ・コピーで下に F1: =IF(B1<>"",ROW(),"") ドラッグ・コピーで下に というところでは? 以上のような条件では、 6行目 A B E F DDD 666 4 6 7行目 AAA 777 4 7 となります。 違っていたら、詳しい説明をもう一度してください。
補足
E7はA6とA7が異なる為、5になります。F列は大丈夫です。 この一連の処理をVBAで行いたいと思っています。
- harukabcde
- ベストアンサー率15% (94/610)
(補足要求) (1) A1 B1 A2 B2 A3 B3 A5 B5 が入力されたときの (4行目に挿入直後の状態と捉えても可) E5 F5の値は? また、4行目が入力されたときの E5 F5の値は? (2) CCC 444 3 4 CCC 555 3 5 E4 E5は、なぜ3なのですか? E列は、1or2のみでは? (3) E列の判定で比較するのは、 1行上なのか、常にA1($A$1)なのか
補足
(1) E5はA5の入力の名前によって変わります。A4と同じならばE4と同じ。違う場合はE4の次の番号になります F5はF1~連番になりますので5になります。 (2) E列も基本的に連番(1~)になりますが、A列の名称が同じ場合は上記のように3になります。 (3) 一行上になります。(行挿入、行削除した場合も)
補足
テストしましたが、行の挿入や削除をする場合、E,F列の値が変わると不都合な事がありまして、行の挿入や削除は考えないという前提で、E,F列の値は変わらないようにしたいと思います。 後、一行目はタイトルが入っていますので二行目から処理を行うようにしたいと思います。 処理するタイミングですがA2を入力したらE2、B2を入力したらF2(以下同じ)となるように出来ますでしょうか。