Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3940 / 13644 ツリー ←次へ | 前へ→

【59355】入力日の自動セット MM 08/12/8(月) 12:42 質問[未読]
【59357】Re:入力日の自動セット Jaka 08/12/8(月) 13:53 発言[未読]
【59361】Re:入力日の自動セット MM 08/12/8(月) 14:51 質問[未読]
【59363】Re:入力日の自動セット Jaka 08/12/8(月) 15:21 発言[未読]
【59366】【解決】Re:入力日の自動セット MM 08/12/8(月) 16:48 お礼[未読]

【59355】入力日の自動セット
質問  MM  - 08/12/8(月) 12:42 -

引用なし
パスワード
   EXCELである処理の実行結果を管理しており、実行結果を確認して、
例えば"H72"に署名(名前入力)すると、"H71"に署名した日付(MM/DD)が入るように
下記関数を作成してみたのですが、署名欄を選択して複数のセルを変更すると、
エラーが発生してしまいます。
(例)
   月曜日 火曜日 水曜日 木曜日 金曜日 土曜日 日曜日 月曜日 ・・・
結 果 ○   ○   ○   ○   ○   ○   ○   ○
確認日 12/01  12/02  12/03  12/04  12/05  
署 名 MM  MM  MM  MM  MM

金曜日の署名欄 MM をマウスで選択して、月曜日まで右に名前をコピーすると
エラーとなってしまう(土曜日から月曜日まで日付がセットされない)のですが、
回避する方法をご教示戴けますと幸いです。

尚、日付を自動セットしているのは、改ざん防止の為となっております。


Private Sub Worksheet_Change(ByVal Target As Range)
  
If Target.Row < 72 Then Exit Sub
If Target.Row = 73 Then Exit Sub
If Target.Row > 74 Then Exit Sub

If Target.Value = "" Then
  ActiveSheet.Unprotect
  Application.EnableEvents = False
  Target.Offset(-1, 0).Value = ""
  Application.EnableEvents = True
  ActiveSheet.Protect
ElseIf Target.Offset(-1, 0).Value <> "" Then Exit Sub
Else
  ActiveSheet.Unprotect
  Application.EnableEvents = False
  Target.Offset(-1, 0).Value = Format(Date, "mm/dd")
  Application.EnableEvents = True
  ActiveSheet.Protect
End If
   
End Sub

【59357】Re:入力日の自動セット
発言  Jaka  - 08/12/8(月) 13:53 -

引用なし
パスワード
   単に複数セルに対応させないのであれば、

If Target.count = 1 Then Exit sub
とか。

複数のコピペに対応させたいのなら、
コピー元の状況にもよっては、範囲ををループさせないとまずいでしょうし、
Target.cells(1).value
ですむ場合もあります。

なんにしても状況によって変わりますが。

貼り付けた範囲の数とTarget.cells(1).valueの中身の数が一致するかで、内容がばらばらかどうかの判断はできますけど。

【59361】Re:入力日の自動セット
質問  MM  - 08/12/8(月) 14:51 -

引用なし
パスワード
   ▼Jaka さん:
ご教示ありがとうございます。

>単に複数セルに対応させないのであれば、
>If Target.count = 1 Then Exit sub
>とか。
⇒こうしてもコピペ動作をやられるとエラーとなってしまいます。
 書き方、書く位置が悪いのでしょうか?(最初の行に追加)

>複数のコピペに対応させたいのなら、
>コピー元の状況にもよっては、範囲ををループさせないとまずいでしょうし、
>Target.cells(1).value
>ですむ場合もあります。
⇒コピペされた範囲を取得する方法を教えていただけますか?
 範囲取得できればループで処理できそうですが、範囲取得の方法が
 調べているのですが見つからず・・・
 ご教示宜しくお願い致します。

【59363】Re:入力日の自動セット
発言  Jaka  - 08/12/8(月) 15:21 -

引用なし
パスワード
   あっ、
>If Target.count = 1 Then Exit sub
  ↓
>If Target.count > 1 Then Exit sub
すみません。

>⇒コピペされた範囲を取得する方法を教えていただけますか?
> 範囲取得できればループで処理できそうですが、範囲取得の方法が
> 調べているのですが見つからず・・・
範囲って、Targetが全てです。

msgbox Target.Address

ってやってみればわかります。
こうもできるし
For Each xx in Target

next

コピペの場合、コピー元のセルが離れていても
コピー先のセルではくっつきます。

また、複数セルを選択して、
Ctrlを押しながら確定した場合は、全てのセルの中身は同じになります。

だから、
Target.Areas の1つ目のセルの値が範囲にいくつあるかを数えて
セルの個数と同じならば、コピペでなく複数同時入力したものと考えられます。
(コピペでも全て同じ値なら、同じような結果になります。)
個数が違うなら、間違いなくコピペです。

【59366】【解決】Re:入力日の自動セット
お礼  MM  - 08/12/8(月) 16:48 -

引用なし
パスワード
   ▼Jaka さん:
ご教示ありがとうございました<m(__)m>

>範囲って、Targetが全てです。
>msgbox Target.Address
⇒確認できました。

>For Each xx in Target
>next
⇒上記でrange.offset()を使いうまくできました。

今後とも宜しくお願い致します。

3940 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free