[[20200715165749]] 『マクロボタン』(小波) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロボタン』(小波)

sheet1の表には複数のマクロボタンが配置されてます。
例えばD5セルにボタンがあったとしますね。
D5の上のセル(D4)に何か入力されたらマクロが実行する
というような事は出来ますか?
検索の方法がまずいのか中々解決にいたりません。
そもそも可能なのかさえも分からず質問させていただきました。
どなたか分かる方よろしくお願います。

< 使用 Excel:Excel2007、使用 OS:Windows10 >


 その「マクロボタン」は何で作ったものですか?
(OK) 2020/07/15(水) 17:29

 簡単なのは、コードをコマンドボタンのイベントなどに直接
 書き込むのではなく、Callするようにすることです。
(OK) 2020/07/15(水) 17:31

 ボタンの種類と言うかなんて呼ぶのか考えた事もないので知らないけど

 フォームコントロールの場合

 With Sheets("Sheet1").Shapes(Application.Caller).OLEFormat.Object
    MsgBox "コマンドボタンがあるセル範囲" & vbLf & Range(.TopLeftCell, .BottomRightCell).Address(0, 0)
 End With

 後は自分で色々試して研究してください。
(BJ) 2020/07/15(水) 17:41

OK様 BJ様返信ありがとうございます。
ボタンは図形にマクロを登録したものです。
書き込むのではなく,callするのですとはどう言う事でしょうか?
コードでcallを使うことはありますが、
コードを書きこまないで呼び出すって事が出来るのですか?
詳しく教えていただけないでしょうか?
よろしくお願いします
BJ様の教えてくださったコードで色々試してみます。
(小波) 2020/07/15(水) 17:51

 すみません。

 >D5の上のセル(D4)に何か入力されたらマクロが実行する

 これを理解してませんでした。
 私のは、ボタンを押した場合。
(BJ) 2020/07/15(水) 17:56

今は例のようにD4を入力したらボタン押してマクロを実行してますが、
これを自動化できないかなーと思ったのですが。
ボタン押せばすむ話しなんですが、色々ためしてみたくて質問しました。
(小波) 2020/07/15(水) 18:02

 シェイプにtestというマクロを登録してるのなら、
 シートのイベントでCallするだけです。

 Private Sub Worksheet_Change(ByVal Target As Range)
  Call test
 End Sub

 ↓のように書くこともできます。

 Private Sub Worksheet_Change(ByVal Target As Range)
  test
 End Sub
(OK) 2020/07/15(水) 18:21

 イベントを起動させるセルを限定するのは↓が参考になると思います。

[[20200708185113]] 『複数のWorksheet_Change』(S) 
(OK) 2020/07/15(水) 18:25


 もしかして、D4セルの内容が変更されたらD5に配置してあるシェイプに登録してある
 マクロを起動、E4セルの内容が変更されたらE5に配置してあるシェイプに登録してある
 マクロを起動、とかですか?

 難易度がグッと上がりそうですが。
(OK) 2020/07/15(水) 18:28

OK様返信ありがとうございます。
ご指摘のように
D4セルの内容が変更されたらD5に配置してあるシェイプに登録してある マクロを起動、E4セルの内容が変更されたらE5に配置してあるシェイプに登録してあるマクロを起動なんですが、マクロ自体は同じものです。
D4に何か入力されたらボタンで行を挿入するようにしてます。
コードはこれです。
Sub test()
    Dim nRow
    nRow = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
    Rows(nRow).Insert Shift:=xlDown
End Sub
それで教えていただいたコードで試してみたのですが、単純にそのまま該当のシート先にコードを入れても指定したアイテムの名前が見つかりませんと言うエラーが出たのですがやり方が間違ってるんですよね?

(小波) 2020/07/16(木) 08:33


Private Sub Worksheet_Change(ByVal Target As Range)
'シートモジュール
    Dim nRow
    nRow = Target.Offset(1).Row
    Application.EnableEvents = False
    Rows(nRow).Insert Shift:=xlDown
    Application.EnableEvents = True
End Sub
(mm) 2020/07/16(木) 09:11

 衝突しましたがそのままアップします。

 要するに、セル内容が変更されたら、一行下に行挿入、
 ということですか?

 ボタンとか全く使ってないです。

 Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Row <> 4 Then Exit Sub
  Target.Offset(1).EntireRow.Insert
 End Sub
(OK) 2020/07/16(木) 09:13

 >指定したアイテムの名前が見つかりません
 図形は作成すると自動的に番号が番号が振られます。
 この番号を指定する事で取得が可能です。
 次のように記述します。
 ActiveSheet.Shapes(1)
 図形を名前で指定する方法は次のように記述します。
 ActiveSheet.Shapes("正方形/長方形 1")
 図形の名前を確認したい場合は、次のような手順で簡単に確認する事ができます。
 名前を確認したい図形をクリックします。
 左上の名前ボックス部分に、クリックされている図形の名前が表示されます。

 nRow = ActiveSheet.Shapes(※)(Application.Caller).TopLeftCell.Row
 ※に実際に使用する図形の番号または名前を指定します。
(KLY) 2020/07/16(木) 09:48

OK様,mm様,KLY様ありがとうございます。
このコードだとD列のどのセルでも内容が変更されると行が挿入されますよね?
でもこれはこれで希望の事が出来そうです。
追加質問でごめんなさい。
行挿入する場合数式も引き継ぐようにしたいので
Private Sub Worksheet_Change(ByVal Target As Range)
Rem 数式コピー
Dim c As Range
Application.EnableEvents = False
If Target.Columns.Count = Columns.Count And Target.Rows.Count = 1 Then
For Each c In Target
If c.Offset(-1, 0).Formula Like "=*" Then
c.Offset(-1, 0).Resize(2, 1).Formula = c.Offset(-1, 0).Formula
End If
Next c
ElseIf Not Intersect(Target, Range("ab:ab")) Is Nothing Then
For Each c In Intersect(Target, Range("ab:ab"))
If c.Value = "" Then
c.Offset(0, -22).Clear
Else
c.Offset(0, -22).Value = Date
End If
Next
End If
Application.EnableEvents = True
End Sub
としているのですが、
Private Sub Worksheet_Changeを複数入れる場合コードをひとつにまとめるのですよね?
間違ってたらごめんなさい。
Ok様の過去ログ参照してるのですがどのように繋げたらいいのかうまくいきません。
つなげ方の規則とか決まりを調べてるのですが・・・・
教えていただけたら幸いです。
時間ありましらお願いします

(小波) 2020/07/16(木) 10:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.