プロが教える店舗&オフィスのセキュリティ対策術

シート(1)の指定セルに名前を入力すると、シート(2)とシート(3)の中から入力されている名前を探してくるマクロを教えて頂きたいのですが、今のところシート(2)のみ検索されるマクロまで出来ています。

(補足)検索された時間をC2に表示される設定です

Private Sub Worksheet_Change_1(ByVal target As Range) '
Dim c As Range
If target.Address = "$A$2" Then
If target <> "" Then
Set c = Worksheets("sheet2").Range("A:A").Find(What:=target, LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
With c.Offset(, 3)
.Value = Format(Now, "m/d hh:mm")
End With
End If
End If
End If
End Sub '

よろしくお願いします

A 回答 (2件)

こんにちは。



すでに、入力してあった場合は、書き換えないようにしました。
以下のように、Array関数を使うと、複数のシートの検索が可能になります。

Private Sub Worksheet_Change(ByVal Target As Range) '
 Dim c As Range
 Dim sh As Worksheet
 If Target.Address <> "$A$2" Then Exit Sub
  If Target = "" Then Exit Sub
  For Each sh In Worksheets(Array("Sheet2", "Sheet3"))
   Set c = sh.Range("A:A").Find(What:=Target, LookIn:=xlValues, lookat:=xlWhole)
   If Not c Is Nothing Then
    With c.Offset(, 3)
     If .Value = "" Then '書き換えをストップ
     .Value = Format(Now, "m/d hh:mm")
     End If
    End With
   End If
  Next sh
End Sub
    • good
    • 0

こんにちは



よくわからないところがいくつかありますが…

基本的には、 Worksheets("sheet2").とsheet2と指定しているところをsheet3に置き換えれば同じ処理がsheet3に対しても行われます。

一つの方法として、シート名を変数にしておいて繰り返すという方法が考えられます。
例えば簡単にやるなら、
For i = 2 To 3
 Set c = Worksheets("sheet" & i).Range("A:A")~~~.
 ' 以下必要な処理
Next i
のような感じです。
ちゃんとやるなら、シート名を配列にしておいて、そのシートに対して検索するのが宜しいです。

あるいは、コード自体が短いので、同じものをコピペしてシート名の部分を変えて、連続して処理させるようにしてもよいですね。


ただし、上記の方法だと一部分で、ご提示のコードと機能が異なってしまう可能性があります。
ご提示のコードでは、対象列(A:A)内に該当するセルが複数あっても、最初のものだけが処理されるようになっています。
逆に言うと、sheet2、sheet3のA列で重複する名前がないという前提が成立するなら、上記の方法でも結果的に同じ処理になると言えます。
それぞれのシート内では重複はないけれど、同じ氏名がsheet2、sheet3に一つずつ存在し、両方とも処理したいという場合でも、上記の方法で対応可能です。
通常は、該当するもの全部を処理したりする場合も考えられるのですが、その場合は記述方法を変える必要があります。

また、
>補足)検索された時間をC2に表示される設定です
検索された列(A列)に対して、Offset(, 3)としているので、「C2」では無くて「該当する行のD列」に日付と時間が記入されると思いますけれど…?
    • good
    • 0

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