いつもお世話になります。
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
ご指導いただけるとうれしいです。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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列って、顧客名が入る列ではないのですか?
日付を入れちゃって良いのですか?
まぁ、つまり。
エラー云々の前に、どんな処理をしたいのかが一貫していないわけですね。
再考の余地がありそうです。
この回答への補足
早速ご指導頂きありがとうございます。
参考にそれぞれのセルには次のような関数が
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に入力日をです。
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&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) エクセル VBAについて 2 2022/05/16 16:33
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの入力規則で2列表示したい
-
複数の文字列のいずれかが含ま...
-
別のセルに値が入力されたら、...
-
エクセルでセルの値分の個数の...
-
エクセルのsumifでかけ算してか...
-
エクセルで1列全部10倍したい
-
列の数字に100をかけたい
-
Excel上でのデータ数字が連番で...
-
【EXCEL】指定したセルの値を他...
-
エクセル セル内の文字数を超え...
-
数式が入ったセルを含めて、数...
-
Excelにて、セルをダブルクリッ...
-
Excelでセル同士のうちで、一部...
-
OpenOfficeでウインドウの固定...
-
エクセル:横長の表を改行して...
-
エクセルで2行まとめて並び替...
-
エクセル 関数(カウント?)...
-
エクセルで特定の文字を含むセ...
-
VBA 同一シート内での転記の仕方
-
「Exel」で、指定した列が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数の文字列のいずれかが含ま...
-
Excelの入力規則で2列表示したい
-
SUMに含まれる範囲から特定のセ...
-
数式が入ったセルを含めて、数...
-
Excel上でのデータ数字が連番で...
-
列の数字に100をかけたい
-
スペースとスペースの間の文字...
-
別のセルに値が入力されたら、...
-
エクセルで表示されている数字...
-
エクセルでセルの値分の個数の...
-
エクセル:横長の表を改行して...
-
[関数について]わかる方教えて...
-
エクセル関数に詳しい方教えて...
-
エクセルで、毎日の走行距離(...
-
エクセルのsumifでかけ算してか...
-
HYPERLINKとADDRESSとMATCHの組...
-
エクセルで曜日に応じた文字を...
-
入退社日より各月末の在籍者数...
-
エクセルで1列全部10倍したい
-
エクセルで小数を含む数値の抽出
おすすめ情報