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

いつもお世話になります。
WINDOWS7 EXCELL2010 です。

ご指導を仰ぎたいのは、
D2に顧客名(参照図では 田中) と入力したら B2に 今日の日付(2013/06/14)としたい。

追加する前のVBAは下記です。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then
Target.Offset(0, -1).Value = Date
End If


Dim c As Integer
If Target.Column <> 2 Then Exit Sub
If Target.Value = "" Then
c = 0
Else
On Error GoTo line
Select Case Month(Target.Value)
Case 1: c = 46
Case 2: c = 4
Case 3: c = 39
Case 4: c = 6
Case 5: c = 7
Case 6: c = 8
Case 7: c = 43
Case 8: c = 3
Case 9: c = 44
Case 10: c = 24
Case 11: c = 40
Case 12: c = 17
End Select
End If
Target.Offset(0, -1).Interior.ColorIndex = c
Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0)
Exit Sub
line:
Target.Offset(0, -1).Interior.ColorIndex = 0
Target.Offset(0, -1).Font.ColorIndex = 0
End Sub

上のマクロに下記のマクロを追加すると参照図のようなエラーが表示されます。
下記のマクロの何かが間違っていると考えています。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub

If ActiveCell = "" Then
ActiveCell = Date
Cancel = True
End If

End Sub

ご指導いただけるとうれしいです。

「D2に入力、B2に今日の日付のVBAを追」の質問画像

A 回答 (2件)

やりたいことを整理しませんか?



> Private Sub Worksheet_Change(ByVal Target As Range)
> If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then
変更されたセルが“2行目以降で”、かつ“C列の最終行と番地が一致”したら
=C列のセルが変更されたら・・・??
> D2に顧客名(参照図では 田中) と入力したら B2に 今日の日付(2013/06/14)としたい。
D列が変更されたら・・ではないんでしたっけ?

> Target.Offset(0, -1).Value = Date
> End If
まぁ、ここで「一つ左隣のセル」に入力しようとしてらっしゃるので、
C列で間違いないのかもしれませんが。
D列変更後・・なら、ココも間違ってますけどね。


その後のコードは「月ごとに色を変えたい」んでしょう。これは割愛。



> Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ダブルクリック時イベントですね。

> If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub
ダブルクリックしたセルが「D2:D100」に含まれないなら、処理中止。
=ダブルクリックしたセルが「D2:D100の範囲内なら」処理続行。
なるほど、D列をダブルクリックしたら走るんですね。

> If ActiveCell = "" Then
> ActiveCell = Date
フォーカスがあるセルが""(空白)だったら、セルに日付を・・・???
D列って、顧客名が入る列ではないのですか?
日付を入れちゃって良いのですか?




まぁ、つまり。
エラー云々の前に、どんな処理をしたいのかが一貫していないわけですね。
再考の余地がありそうです。

この回答への補足

早速ご指導頂きありがとうございます。

参考にそれぞれのセルには次のような関数が

A2 =IF(B2="","",TEXT(B2,"mm"))

B2 ユーザー定義で mm/dd

C2 =IF(COUNTIF(INDEX($F:$F,ROW()),"*?#*?◆*?◇*"),COUNT($C$1:INDEX($C:$C,ROW()-1))+1,"")

F2 =IF(OR(ISERR(1/DAY(INDEX($B:$B,ROW()))),INDEX($D:$D,ROW())=""),"",INDEX($D:$D,ROW())&" #"&IF(INDEX($H:$H,ROW())="",1,INDEX($H:$H,ROW()))&"◆"&TEXT(INDEX($B:$B,ROW()),"yyyy/mm/dd")&"◇"&IF(COUNTIF($F$1:INDEX($F:$F,ROW()-1),INDEX($D:$D,ROW())&" #"&IF(INDEX($H:$H,ROW())="",1,INDEX($H:$H,ROW()))&"◆"&TEXT(INDEX($B:$B,ROW()),"yyyy/mm")&"/*?◇"&"*?"),"","★"&COUNTIF($F$1:INDEX($F:$F,ROW()-1),"*?◆"&TEXT(INDEX($B:$B,ROW()),"yyyy/mm")&"/*?◇★*?")+1))

現在設定されているマクロは例えば 6/1とB2に入力すればA2には6となります。
ここでマクロによりA2のセルは水色になるマクロです。

ここに追加として D2に入力したらB2に入力日をです。

補足日時:2013/06/14 15:51
    • good
    • 0

すっと答えを出してしまうのもアレかと思ったんですが・・


文章をまとめる力がないもので、かなり長くなりますが、ご容赦下さい。


問題のエラーメッセージについてです。
想像の域を出ませんが、単純に
「WorkSheet_Change」を2つ作ろうとしていませんか?
つまり、もともとあった
> Private Sub Worksheet_Change(ByVal Target As Range)
> If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then
> ~省略
を残したまま、
> ここに追加として D2に入力したらB2に入力日をです。
を、「別なプロシージャとして」作ろうとしていませんか?
同じブック内で同じ名前のプロシージャは認められないため、

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then
~省略
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
D列に対する処理
End Sub

としてしまうと、例のエラーメッセージが出ます。


今回のように、条件がいくつかある場合は、

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 3 Then
    C列が変更されたときの処理
    End If
    If Target.Column = 4 Then
    D列が変更されたときの処理
    End If
End Sub

といった具合に、Ifで分岐させてやるのが妥当です。



で、前の回答が通じなかったようなので、重ねておきますね。

C列に細くのような「式」が入っているのであれば、質問文中でご提示の
> Private Sub Worksheet_Change(ByVal Target As Range)
> If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then
コレはまったく無意味です。

> D2に入力したらB2に入力日をです。
としたいなら、せめて

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "D").End(xlUp).Address Then
        Target.Offset(0, -2).Value = Date
    End If
    ~以下省略
End Sub

とするべきですね。
もっとも、Ifの前半部分は意味をなしていないので、
    If Target.Address = Cells(Rows.Count, "D").End(xlUp).Address Then
だけでも良さそうな気もします。

要するに「追加する」必要は無くて、修正だけで事足りそうですね、ということです。
「C列が入力されたら」という処理は今回は必要ないのですから。
C列は「式の返り値が更新されることはあっても、セルの内容が書き換えられることは無い」のですから。
と、言うことは、「WorkSheet_Change」プロシージャはD列に関する一つで済みますから、
例のエラーメッセージも表示されることが無いわけです。

と、繋がっていくのです。


ダブルクリックの時の処理に関しても同様です。
(本来、コレは今回のエラーメッセージには「一切関わっていない」ところではありますが)
> Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
> If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub
としていますから、D2:D100の中にあるセルにしか、このプロシージャは反応しないですよね。
この後のコードを見ていくと、ダブルクリックしたセル(Target)に日付を入れる展開です。
でも、想定では
> D2に顧客名(参照図では 田中) と入力したら
なのですから、D列は「顧客名」を入力したい列なんですよね?
「ダブルクリックしたセルに日付を入力する」処理では辻褄が合わないのです。

ご理解いただけましたか?



つまり、どこのセルにどんな式が入っていようと「関係無い」のです。
「行いたい処理」と「書かれたコード」が噛み合っていませんよ、ということです。
そういう意味で、「やりたいことを整理しましょう」「再考の余地がある」と言ったのです。



ちなみに「VBA 名前が適切ではありません」で検索すると、
解説してくれているサイトが多数見つかります。
おそらく、ですがどこを見ても「プロシージャ名」に関する解説でしょう。
参考に、いくつかピックアップして一読されると良いと思いますよ。
「調べる癖」にも繋がりますから。
http://www.google.co.jp/#safe=off&sclient=psy-ab …
↑グーグルで検索した例です。
    • good
    • 0

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