• 締切済み

D2に入力、B2に今日の日付のVBAを追加したいが

いつもお世話になります。 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 ご指導いただけるとうれしいです。

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

すっと答えを出してしまうのもアレかと思ったんですが・・ 文章をまとめる力がないもので、かなり長くなりますが、ご容赦下さい。 問題のエラーメッセージについてです。 想像の域を出ませんが、単純に 「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&q=vba+%E5%90%8D%E5%89%8D%E3%81%8C%E9%81%A9%E5%88%87%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&oq=vba+%E5%90%8D%E5%89%8D%E3%81%8C%E9%81%A9%E5%88%87%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&gs_l=hp.3..0j0i7j0i7i30l4j0i5i30j0i7i5i30.155.7971.0.8803.28.24.0.0.0.10.1102.9824.2-4j4j4j5j2j1.20.0...0.0...1c.1j4.17.psy-ab.N2SdurrxGMc&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47883778,d.dGI&fp=70989c7ad1b914a&biw=944&bih=946 ↑グーグルで検索した例です。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

やりたいことを整理しませんか? > 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列って、顧客名が入る列ではないのですか? 日付を入れちゃって良いのですか? まぁ、つまり。 エラー云々の前に、どんな処理をしたいのかが一貫していないわけですね。 再考の余地がありそうです。

dorasuke
質問者

補足

早速ご指導頂きありがとうございます。 参考にそれぞれのセルには次のような関数が 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に入力日をです。

関連するQ&A