[[20170303141758]] 『Select Caseを使った方法』(yama) ページの最後に飛ぶ

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

 

『Select Caseを使った方法』(yama)

以下のマクロですがSelect Caseを利用した方法を
ご教授ください。よろしくお願いします。
Sub 書式切替()

    With ActiveSheet.Shapes(Application.Caller)
        If .Name = "コピー1" Then
            Range("A107:G126").copy Range("A62")
            .Name = "コピー2"
            Call 官庁
        ElseIf .Name = "コピー2" Then
            Range("A128:G147").copy Range("A62")
            .Name = "コピー3"
            Call 民間1
        ElseIf .Name = "コピー3" Then
            Range("A149:G168").copy Range("A62")
            .Name = "コピー1"
            Call 民間2
        End If
    End With
 End Sub

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


 普通に変換すると Sample1、中には Sample2 のように記述する人もいますが、あまり好きじゃありません。

Sub Sample1()

    With ActiveSheet.Shapes(Application.Caller)
        Select Case .Name
            Case "コピー1"
                Range("A107:G126").Copy Range("A62")
                .Name = "コピー2"
                Call 官庁
            Case "コピー2"
                Range("A128:G147").Copy Range("A62")
                .Name = "コピー3"
                Call 民間1
            Case "コピー3"
                Range("A149:G168").Copy Range("A62")
                .Name = "コピー1"
                Call 民間2
        End Select
    End With
 End Sub

 Sub Sample2()
    With ActiveSheet.Shapes(Application.Caller)
        Select Case .Name
            Case "コピー1": Range("A107:G126").Copy Range("A62"): .Name = "コピー2": Call 官庁
            Case "コピー2": Range("A128:G147").Copy Range("A62"): .Name = "コピー3": Call 民間1
            Case "コピー3": Range("A149:G168").Copy Range("A62"): .Name = "コピー1": Call 民間2
        End Select
    End With
 End Sub

(β) 2017/03/03(金) 15:03


 Select Case への置き換えは置き換えとして。

 なんだか、違和感のある処理ですねぇ・・・

 そもそもシート上には、このマクロが登録された図形がいくつあるのですか?

 なんとなく、最初は コピー1、コピー2、コピー3 の 3つがあるように思えるんですが。
 もし、そうなら、コピー1 がおされたら、そのオブジェクト名が コピー2 になる?
 そうすると、その段階ではコピー2 というオブジェクトがシート上に2つ存在することになり
 そのどちらを押しても、こんどは コピー3 になる。

 そもそも、オブジェクト名は、操作者からは見えにくい。
 今クリックしようとしている図形が、どんなオブジェクト名になっているのか、操作者はわかるんですか?

 キャプション変更ならわかりますけど。

(β) 2017/03/03(金) 15:24


>Select Caseを利用した方法

Sub test()

    Dim n As String
    Dim a As String
    Dim p As String

    With ActiveSheet.Shapes(Application.Caller)
        Select Case .Name
            Case "コピー1"
                n = "コピー2"
                a = "A107:G126"
                p = "官庁"
            Case "コピー2"
                n = "コピー3"
                a = "A128:G147"
                p = "民間1"
            Case Else
                n = "コピー1"
                a = "A149:G168"
                p = "民間2"
        End Select

        Range(a).Copy Range("A62")
        .Name = n
        Application.Run p
    End With
End Sub

Select Case だけの話でもないですが。。。
コピペとその後のコールするプロシージャと何か関係があるのかないのかで、
もうちょっとスマートにできないのかなぁ。。。と。
(なるのかならないのかよくわかりませんが^^;)
(まっつわん) 2017/03/03(金) 15:41


(β)さん
ありがとうございます。
> そもそも、オブジェクト名は、操作者からは見えにくい。
> 今クリックしようとしている図形が、どんなオブジェクト名になっているのか、操作者はわかるんですか?
> キャプション変更ならわかりますけど。

確かに、操作者からわかりにくいです。帳票の変化で判断するしかないのですが
キャプション変更は、どのようにすれば可能でしょうか?
現在図形に、マクロを登録しています。
(yama) 2017/03/03(金) 15:55


 その前に、シートに貼り付けてある図形は 3つ なんですか 1つなんですか?

 もし1つで、押すたびに次の処理を変えていくという仕様であれば、
 Range("A107:G126").Copy Range("A62") の処理の後は、泣いても笑っても Range("A128:G147").Copy Range("A62") になります。
 それ以外のことはできません。

 いいのですか?

 もし3つなら。
 なぜ、各ボタンを変更させていくのですか?
 コピー1 は、ずっと コピー1、コピー2 は、ずっとコピー2 でいいのではないですか?

(β) 2017/03/03(金) 17:07


>その前に、シートに貼り付けてある図形は 3つ なんですか 1つなんですか?
3つです。
図形というか名前を付けているsheet内の範囲 例:コピー1=(Range("A107:G126"))です。
>なぜ、各ボタンを変更させていくのですか?
Call XXの部分が替わります。
よろしくお願いします。

(yama) 2017/03/03(金) 17:38


 >>Call XXの部分が替わります。 

 それは見たらわかります。

 私が言っているのは コピー1のボタンを押せば、いつも、Call 官庁
 コピー2 のボタンをおせば いつも  Call 民間1 でしょ? ということです。
 淡々と各ボタンがおされたらそれぞれに紐付いた処理を実行すればいいわけで、
 なぜ、おされたボタンのオブジェクト名、ないしはキャプションを変更していかなければいけないのですか??

 ということです。

(β) 2017/03/03(金) 17:46


[[20170224191852]] 『ボタンを押す毎に切り替えるには』(yama)

この場合は、ボタンが一つだったのです。
今回も同じかはわかりませんが。

(マナ) 2017/03/03(金) 17:55


 >この場合は、ボタンが一つだったのです。 

 なるほど。

 今回は 『3つです。』と明言されているわけですので、そもそもの前トピの要件と、今回の要件が全く違っているということを
 理解していないか、あるいは、前トピの オブジェクト名をなぜ変えていくか、変えるとなぜできるようになるのかというあたりを
 本当は理解していなかった ということですかね。

 いずれにしても、今回の要件なら、各条件分岐の中で .Name を変更する部分を消しましょうね。

(β) 2017/03/03(金) 18:10


マナさん βさん
すみません。
ボタンは1つです 勘違いしてました。
その上でキャプションの変更が可能かどうか
回答お願いします。

よろしくお願いします。

(yama) 2017/03/03(金) 18:17


.Name
のかわりに
.TextFrame.Characters.Text
でしょうか

(マナ) 2017/03/03(金) 18:30


マナさん 返答ありがとうございます。
ネット検索したのですが良く理解できませんでした
使い方が? よろしくお願いします
 Sub Sample1()
    With ActiveSheet.Shapes(Application.Caller)
        Select Case .Name
            Case "コピー1"
                Range("A107:G126").Copy Range("A62")
                .Name = "コピー2"
                Call 官庁
(yama) 2017/03/03(金) 18:41

いくつかsheet上に図形が配置してあり
今回の図形の指定は、どのように名前を加工すればいいでしょうか
以下 ネット検索にて
Sub 図形にテキストを入力する()
 ActiveSheet.Shapes(1).TextFrame.Characters.Text = "サンプル文字列"
End Sub
(yama) 2017/03/03(金) 18:47

 >ボタンは1つです 勘違いしてました。

 であれば、マナさんから回答が出ていますが、Shape の DrawingObject の Text への値セットでも可能です。
 Characters経由より、効率もいいと思います。

 コード例は以下です。

 でも、1つですといいなおしていただいたのに、さらに

 >いくつかsheet上に図形が配置してあり 

 なぜ、この文章が登場するのか??? ですが、無視します。

Sub test()

    With ActiveSheet.Shapes(Application.Caller).DrawingObject
        Select Case .Text
            Case "コピー1"
                Range("A107:G126").Copy Range("A62")
                .Text = "コピー2"
                Call 官庁
            Case "コピー2"
                Range("A128:G147").Copy Range("A62")
                .Text = "コピー3"
                Call 民間1
            Case "コピー3"
                Range("A149:G168").Copy Range("A62")
                .Text = "コピー1"
                Call 民間2
        End Select
    End With
End Sub

(β) 2017/03/03(金) 19:20


Application.Callerがわからないのでしょうか?
これで、どのボタンが押されたかわかります。
http://www.k1simplify.com/vba/tipsleaf/callbuttonname.html

で、これが、ボタンの表示文字列です。
ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text

(マナ) 2017/03/03(金) 19:28


それとも理解できていないのは、
With〜End Withでしょうか?

http://kabu-macro.com/vba_apply/vba_with.html

(マナ) 2017/03/03(金) 19:47


マナさん
こんな感じでしょうか。動作出来ていますがちょっと不安
Sub Sample1()
    With ActiveSheet.Shapes(Application.Caller)
        Select Case .Name
            Case "コピー1"
                Range("A107:G126").copy Range("A62")
                .Name = "コピー2"
                ActiveSheet.Shapes("set").TextFrame.Characters.Text = "官庁"
                Call 官庁
            Case "コピー2"

βさん
>>いくつかsheet上に図形が配置してあり
これは別のマクロ用です。
提示頂いたtestで、いう.Textはどれのことを言っておられるのでしょうか?
理解が足りず申し訳ありません。またこのマクロで文字(キャプション)が変えられるのですか?
以下の部分でエラー
実行時エラー-2147352571(80020005)
指定したアイテムの名前が見つかりません
よろしくお願いします。

(yama) 2017/03/03(金) 19:51


現在のコードでは

ボタンの.Nameが
"コピー1" ならば、こんな処理…
"コピー2" ならば、あんな処理…

としていますが

ボタンの.TextFrame.Characters.Textが
"官庁"ならば、こんな処理…
"民間1" ならば、あんな処理…

みたいな感じにするのです。
で、ボタンをクリックするごとに、官庁→民間1→民間2→官庁…にしたいのですよね?

(マナ) 2017/03/03(金) 20:14


マナさん
>で、ボタンをクリックするごとに、官庁→民間1→民間2→官庁…にしたいのですよね?
その通りです。
伝わっていませんでしたか。
マナさんに紹介頂いた
                ActiveSheet.Shapes("set").TextFrame.Characters.Text = "官庁"
こちらで出来ています。
ただ、βさんが提示してくれたtestをいろいろ試しているのですが
結果が出ていません こちらを確認したくて質問しました。
(yama) 2017/03/03(金) 20:26

いえ、Nameを使わなくてよいということです。
βさんの方法だとこんな感じです。

 Sub test2()

    With ActiveSheet.Shapes(Application.Caller).DrawingObject
        Select Case .Text
            Case "官庁"
                Range("A107:G126").Copy Range("A62")
                .Text = "民間1"
                Call 官庁
            Case "民間1"
                Range("A128:G147").Copy Range("A62")
                .Text = "民間2"
                Call 民間1
            Case Else
                Range("A149:G168").Copy Range("A62")
                .Text = "官庁"
                Call 民間2
        End Select
    End With

 End Sub

(マナ) 2017/03/03(金) 20:44


 >>以下の部分でエラー 
 >>実行時エラー-2147352571(80020005) 
 >>指定したアイテムの名前が見つかりません 

 以下の部分って、どの部分ですか??

 それと、このマクロは図形に登録し、図形をクリックして実行するんですけど、それはいいですよね?
 (まさか、直接、このマクロを実行している?)

 あと、コードではキャプションとして コピー1 とか コピー2 とかがあるというサンプルですが
 これが、官庁 とか 民間1 といったものなら、当然、そこはあわせてもらってますね?

 まぁ、船頭が多いと yamaさんも混乱するかもですね。
 あとはマナさんにお任せして、ROMに回ります。

(β) 2017/03/03(金) 22:44


マナさん
何度もありがとうございました。
やっと色々調べてわかりました。
なるほどですね・・・
冷静に考えればわかりますね焦ってました。

βさん
ちぐはぐな質問で、混乱させてしまいすみません。
納得です。
ありがとうございました。
(yama) 2017/03/04(土) 00:52


Option Explicit

Sub test()

    Dim shp As Shape
    Set shp = ActiveSheet.Shapes(Application.Caller)
    Application.Run shp.TextFrame.Characters.Text
    Call シートの初期化(shp)
End Sub

Sub シートの初期化(ByVal shp As Shape)

    Dim vList As Variant
    Dim vAddress As Variant
    Dim i As Long

    vList = Split("官庁,民間1,民間2", ",")
    vAddress = Split("A107:G126,A128:G147,A149:G168", ",")
    i = WorksheetFunction.Match(shp.TextFrame.Characters.Text, vList, 0) _
        Mod (UBound(vList) + 1)

    shp.TextFrame.Characters.Text = vList(i)
    shp.Parent.Range(vAddress(i)).Copy Range("A62")
End Sub

Sub 官庁()

    MsgBox "官庁です"
End Sub

Sub 民間1()

    MsgBox "民間1です"
End Sub

Sub 民間2()

    MsgBox "民間2です"
End Sub

得られた文字列で実行する案はボツかぁ。。。。。
分かり難いですかね。。。

(まっつわん) 2017/03/04(土) 09:14


(まっつわん)さん
ありがとうございます。
回答頂いておりましたこと気がつきませんでした。
すみません。
2017/03/04(土) 09:14
新規bookで試してみたのですがエラーがでます
    Set shp = ActiveSheet.Shapes(Application.Caller)
準備としては図形を用意すればよろしいのですか?

(yama) 2017/03/04(土) 14:17


準備としては図形を用意すればよろしいのですか?

あれ?図形にマクロを登録して、表示のテキストを押すたびに変えたいんだと思いましたが。。。

(まっつわん) 2017/03/04(土) 15:06


(まっつわん)さん
ありがとうございました。
了解です。OKです
いろいろ方法があるのですね。
(yama) 2017/03/04(土) 15:34

余計なことかもしれませんが。
 
そもそもですが、ボタンを一つに限定する目的はなんでしょうか。
ボタンを3つそれぞれ表示しておいて押させるのでは、だめなんですか?
普通の順序を示したければ、ボタンとボタンの間に矢印を入れて順序を示すとか。
 
ボタンのキャプションを書き換えることが、
こうした場合の暗黙の前提であるかのように錯覚していないでしょうか。
複数個のボタンを表示しておくほうがむしろ普通な気がしますけど。
 
順序が固定されていて、それ以外はだめということなら、
むしろ3つを一括処理したほうがよいのでは?
それに、処理2を実行したあとで条件の間違いに気づいて、
処理2を再実行などということはないのですか?
また、処理の全体像がわかりにくいということもあります。

 
(γ) 2017/03/05(日) 13:08


コメント返信:

[ 一覧(最新更新順) ]


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