痔になりやすい生活習慣とは?

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列を修正。
上記の内容で処理するにはどうすれば良いでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>テストしてみまして、行の挿入・削除がなければでき>ました。



行の挿入・削除をしても最終行をきちんと指定すれば
ちゃんと動きましたよ。
もしかして最終行を固定にしてしまっているのでは?

>できればA1を入力したらE1に、B1を入力したらF1に自>動的に表示し、追加・削除にも対応させる事は可能で>しょうか。

入力時に自動で表示することはできますが、挿入・削除には対応できません。
VBAにはイベントというのがあって、シートやBOOOKに
何らかの変化があったときにマクロ(プロシージャ)を
実行することが可能です。でも、そのイベントの種類が限られています。挿入・削除のイベントは存在しません。下記に参考URLをいれましたのでイベントはそちらで確認してください。(せめてキーボードを押したときのイベントがあれば可能なのですが)

また、入力時に表示するとすれば、上から連番を取っているので毎回マクロが実行されなければならないでしょう。そうなると、データ量が多くなると、入力時の待ち時間がかかってちょっと鬱陶しいことになりますよ。

連番は何のために必要なのでしょうか?IDですか?
データはなんでもいいのでどういうシートを作りたいのかもうちょっと詳しく教えてください。

参考URL:http://park11.wakwak.com/~miko/Excel_Note/14-02_ …
    • good
    • 0

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ウィンドウを閉じる

この回答への補足

テストしましたが、行の挿入や削除をする場合、E,F列の値が変わると不都合な事がありまして、行の挿入や削除は考えないという前提で、E,F列の値は変わらないようにしたいと思います。
後、一行目はタイトルが入っていますので二行目から処理を行うようにしたいと思います。
処理するタイミングですがA2を入力したらE2、B2を入力したらF2(以下同じ)となるように出来ますでしょうか。

補足日時:2005/03/30 12:15
    • good
    • 0

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に自動的に表示し、追加・削除にも対応させる事は可能でしょうか。

補足日時:2005/03/29 17:54
    • good
    • 0

>(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で行いたいと思っています。

補足日時:2005/03/29 14:32
    • good
    • 0

(補足要求)



(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)
一行上になります。(行挿入、行削除した場合も)

補足日時:2005/03/29 13:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング