• ベストアンサー

Excelの関数でできますか?

列Dと列Eを比較して、DにあってEにない値を列Eにあるデータの一番下に追加するという作業を関数で自動処理させたいのですが、どのようにすればよいのでしょうか?  関数について調べてみたのですがどれを使ってよいのか見当がつかなかったので、詳しい方のお力を頂ければと思います

質問者が選んだベストアンサー

  • ベストアンサー
  • jindon
  • ベストアンサー率43% (50/116)
回答No.6

jindonです >D列にデータを入力し、E列に重複のないデータを自動抽出 E列の元データに重複が無ければ私のコードで機能するはずです。 提示したコードは、D列の1行目から空白行までのループです。1行目、又は途中に空白があるとその時点で終了してしまいます。E列は制約を受けませんので、E列に不在のデータはE列にデータの入った最終行の1行下に追加されます。 次の方法ですとD列にデータを入力した時点で機能します。 使用方法: 下のコードを、 該当シートのシートタブを右クリック -> コードの表示 -> 右側空白部分にコードを貼り付ける -> Xをクリックしてエクセルが面に戻る。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, lastE As Long With Me If Not Intersect(Target, .Range("d:d")) Is Nothing Then i = 1 Do While .Cells(i, 4).Value <> "" If WorksheetFunction.CountIf(.Range("e:e"), .Cells(i, 4)) = 0 Then lastE = .Range("e65536").End(xlUp).Row .Cells(lastE + 1, 5).Value = .Cells(i, 4).Value End If i = i + 1 Loop End If End With End Sub

kamatama
質問者

お礼

一晩寝て落ち着いてよく見ながら手順どうりにやるとできました!どうもありがとうございました。

その他の回答 (5)

  • jindon
  • ベストアンサー率43% (50/116)
回答No.5

こんなのもありますね。 Sub test() Dim i As Long, lastE As Long With ActiveSheet i = 1 Do While .Cells(i, 4).Value <> "" If WorksheetFunction.CountIf(.Range("e:e"), .Cells(i, 4)) = 0 Then lastE = .Range("e65536").End(xlUp).Row .Cells(lastE + 1, 5).Value = .Cells(i, 4).Value End If i = i + 1 Loop End With End Sub 使用方法: エクセル画面のメニューバーの左端のエクセルアイコンを右クリック -> コードの表示 -> 右側の空白部分に上記コードを貼り付けて、X をクリックしてエクセル画面に戻る。 ツール -> マクロ -> マクロ -> Thisworkbook.test を選択して、実行

kamatama
質問者

補足

皆さんに頂いた回答を試そうと思いましたが理解力不足で出来ずでした(涙)本当にすいません。改めて詳しくやりたいことを書いてみます。 例 D列 TCP(135) UDP(137)TCP(445) TCP(2683) TCP(2689)  ←今回追加するデータ E列 TCP(445) TCP(135) UDP(137) TCP(139) ←入力済 D列にデータを入力し、E列に重複のないデータを自動抽出。F列でE列の値を元に、Count関数でD列にある個数を数えよう思っています。 上の例の場合、今回追加するデータの中でTCP(2683) TCP(2689)以外は既に入力済なので、新たにTCP(2683) TCP(2689)だけをE列に追加出来ないかと考えています。 度々のお願いで申し訳ありませんが、アドバイスをお願いします m(_ _)m

  • matrix4
  • ベストアンサー率16% (118/704)
回答No.4

DとEが、違う値ということでしょうか? D  E 4  5 よって      D   E      4   5          5 例 no D E 1 4 1 2 2 23 3 3 3 4 4 4 5 5 5 6 6 61 7 5 2 8 5 3 9 5 4 10 2 511 11 6 23 12 9 2 13 4 3 14 5 4 15 5 5 16 5 5 17 3 5 18 4 5 19 4 5 20 1 21 23 ------------------------------ 1 1 2 23 3 4 5 6 61 7 2 8 3 9 10 511 11 23 12 2 13 3 14 4 と別枠で、表示はできます。 エンターキー毎に、下に、追加されるのは 分かりませんが・・、 =IF(EXACT(B1,C1),"",OFFSET(C1,0,0,1,1))を ---下の、表示列に、入れます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

(例データ)D1:F10 (第1行目は空白にしている。F1だけは空白であること。) D列  E列   F列 a b 1  (第2行目) b c c x d f 2 f g g h h w y k (関数式) F2に =IF(ISERROR(VLOOKUP(D2,$E$2:$E$10,1,FALSE)),MAX($F$1:F1)+1,"") と入れて、下に複写する。 結果は上記F列のとおり。 E11(上記kの次)に =INDEX($D$1:$D$10,MATCH(ROW()-10,$F$1:$F$10,0),0) といれ、F列の最大数行分の行数を下方向に複写する。 E11:E12にa,dが入ります。

  • kumadayo
  • ベストアンサー率31% (9/29)
回答No.2

すいません。作っちゃいました。暇なもので^-^; Option Explicit Public Sub Aaaaaa() Dim sht1 As Worksheet Set sht1 = ThisWorkbook.Sheets(1) Dim I As Integer Dim J As Integer I = 1 Do Until sht1.Cells(I, 1) = "" J = 1 Do Until sht1.Cells(J, 2) = "" If sht1.Cells(J, 2) = sht1.Cells(I, 1) Then Exit Do '同じのが見つかったらループを抜ける J = J + 1 Loop '同じのが見つからなかったとき If sht1.Cells(J, 2) = "" Then sht1.Cells(J, 2) = sht1.Cells(I, 1) End If I = I + 1 Loop End Sub ↑ ALT+F11でエディタを開いて プロジェクトエクスプローラーのところで標準モジュールを1個追加して、上の内容にします。 ほんでもってマクロの実行(ALT+F8)でAaaaaというのを実行してください。 A列 B列 いぬ ライオン ねこ シマウマ おさる ねこ キリン キリン ゾウさん おうまさん ↓ いぬ ライオン ねこ シマウマ おさる ねこ キリン キリン ゾウさん おうまさん いぬ おさる ゾウさん

回答No.1

サンプルデータを提示すると回答が得られますよ