次の方法で共有

textboxの開始番号を指定できませんか

Anonymous
2013-02-11T11:29:47+00:00

win7でexcel2010のマクロでグラフ領域に、テキストボックスを作りデータを入れようとしています。幸い皆様のご協力で入力できるようになりました。有難うございました。

ですが困った問題に直面しています。

 グラフのある範囲より、ずっと上部に仕様条件入力セルがあります。ここに仕様を変えてマクロボタンを押すとグラフが変更され、グラフの上部の仕様条件がテキストボックスに入っているのでこれも変更されます。

 ここまではと良いのですが、この仕様が入ったテキストボックスにはそれぞれ番号がついてきます。仕様条件入力セルを変更後、マクロボタンを押す毎にテキストボックスの番号が大きくなってしまいます。

 入力条件を変えていろいろ確かめてみたい場合には、どんどん大きくなってしまいます。別に構わないのですがあまり気持ちの良いものではありません。

そこで下記はできないのでしょうか?

Q1.マクロボタンを押すごとに、テキストボックスを作るが、このはじめの番号を"1"から始めるようにする。

   それ以後のテキストボックスの番号は"2"、"3"、"4"、"5"、"6"、"7"、"8"、"9"、、、、とする。

 以上よろしくご教示お願いいたします。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2013-02-17T01:45:42+00:00

シート選択を変えた時にActionをさせるのはWorksheet_Activate() で正しいです。

ただし、初めに表示されるシートは元々Activeですからイベントが発生しないわけです。

ブックを開いた時に何かやりたいときは

Private Sub Workbook_Open()

End Sub

をThisWorkBookのコードに入れます。

ただ、ここでWorksheet_Activate()と同じものをいれてしまうと、二重に実行されかねませんので、もしそこまでやられるなら、ブックを開いたとき「いらっしゃいませ」的な表示画面を強制的に表示し、そこからターゲットのシートをActiveにすれば必ずWorksheet_Activate()イベントが発生します。

新規ブックでSheet2をWellcomeという名前にし

ThisWorkbookに

Private Sub Workbook_Open()

With ThisWorkbook

  .Worksheets("wellcome").Activate

  .Worksheets("sheet1").Activate

End With

End Sub

Sheet1のコードに

Private Sub Worksheet_Activate()

MsgBox "hello"

End Sub

として試してみてください。

なお、イベントプロシージャには必要なコードのみを書き、処理本体は標準モジュールに書いて、それを呼び出すようにしてください。

ほとんど同じなんですが、極まれに「なんで?」みたいなことが起こります。

細かくは覚えておりませんが、変数の扱いなんかでクラスモジュールと標準モジュールで多少違いがあるようです。

>コマンドボタンを押さなくても入力条件を変えれば、ちゃんとグラフエリアにおいた変数は変わります。

そのために、わざわざtextBoxに参照式なんか入れる手間かけたのでは?

この回答は役に立ちましたか?

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2013-02-14T08:41:48+00:00

我ながら、いやになるくらい鈍いと言うか、年のせいか物忘れがひどくなっているのか、Shapeの扱い忘れてました。(まあ、めったにやらないこともあるんですが)

Parentなんかを挟まないで直接Formulaを入れる方法をしらべましたので訂正コードを出しておきます。

Sub aaa()

Dim Sh As Shape

With ActiveChart

  On Error Resume Next

    Set Sh = .Shapes("ABCD")

    If Err.Number <> 0 Then

      Set Sh = .Shapes.AddTextbox(msoTextOrientationHorizontal, 40, 25, 50, 25)

      Sh.Name = "ABCD"

      Sh.OLEFormat.Object.Formula = "=sheet1!$g$13"

    Else

      Sh.OLEFormat.Object.Formula = "=sheet1!$H$13"

    End If

  On Error GoTo 0

End With

End Sub

この回答は役に立ちましたか?

0 件のコメント コメントはありません

8 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2013-02-13T03:20:13+00:00

    コードはよく見てませんが、要するに毎回テキストボックスを張り付けておられます。

    実際にはコードは実行してませんので、コメントでおかしなところがあれば再投稿願います。

    >Q1.最初にマクロボタンを押した時に、テキストボックスの番号が1  2  3  4  5  6とならないのはなぜですか?

    こういうのはExcelの勝手と思って気にしてもしょうがありません。

    (要するにExcelが名前が重複しないようにしているだけです)

    >Q2.影響ないとすれば上記プログラムにある

    AddTextBoxは当然テキストボックスを新規に作ります。

    ですから、このコードを繰り返すと、テキストボックスの上に同じ大きさのテキストボックスが重なって存在することになります。

    2~3回実行したのち、テキストボックスを選択して削除してみてください。下にまたテキストボックスがあるはずです。

    >Q3.そうであれば、AddのつかないTextbox作成コマンドはないのでしょうか?

    そんなことはできません。

    あとの質問とまとめて言えば、テキストボックスをAddした後

    sh.Name=”XXXX" と自分で名前を付けてください。

    名前を付けておけば、テキストボックスの有無は

    if <先行オブジェクト>.Shapes("名前”) is nothing then

       <テキストボックス追加>

    else

      set sh=<先行オブジェクト>.Shapes("名前”)

    end if

    で取得できます。

    とにかく自動付番を気にしないで済むようにコードを書いてください。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2013-02-12T05:24:22+00:00

    y sakuda様

                                                                                                                  yama_972です

     早速のご返事ありがとうございます。

    問題のマクロボタンの中身を以下に示します。

    *****************************************************************************************************

     Private Sub CommandButton2_Click()

        ActiveSheet.ChartObjects("グラフ 6").Activate

    '

    '    ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 40, 25, 50, 25)

        Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 40, 25, 50, 25)

    '        MsgBox sh.Name

            sh.Select

            Selection.ShapeRange.Fill.Visible = msoFalse

            Selection.ShapeRange.Line.Visible = msoFalse

            Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "AAA"

     '   ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 80, 25, 190, 25).Select

            Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 80, 25, 190, 25)

     '       MsgBox sh.Name

            sh.Select

            Selection.Formula = "=sheet1!$g$13"

    '    ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 400, 25, 30, 25).Select

            Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 400, 25, 30, 25)

    '        MsgBox sh.Name

            sh.Select

            Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "b="

    '        ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 415, 25, 35, 25).Select

            Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 415, 25, 35, 25)

    '        MsgBox sh.Name

            sh.Select

            Selection.Formula = "=sheet1!$f$19"

    '    ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 445, 25, 30, 25).Select

            Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 445, 25, 30, 25)

    '        MsgBox sh.Name

            sh.Select

            Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "a="

    '        ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 460, 25, 50, 25).Select

            Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 460, 25, 50, 25)

    '        MsgBox sh.Name

             sh.Select

            Selection.Formula = "=sheet1!$f$20"

    End Sub

    ********************************************************************************************************

    ” ' ” 行はデバッグの時に使用したものです。

    このCommandButton2をグラフの適当なエリアに貼り付けてあります。

    仕様条件入力セルに条件入力後(三箇所)、マクロボタンを押すと、グラフエリアの上部に上記プログラムで

    配置された位置にテキストボックスが作成され、それぞれ下記の内容が入ります。

      "AAA"   "G13の中身"       "b="  "F19の中身"    "a=" "F20の中身"

       このテキストボックスにカーソルをあわせるとなぜかテキストボックスの番号は下記となっています。

           左から順に 1     10      13       20      21      22

     なおこれは一度該当のプログラムを終了させて再読み込みした時です。

    この状態で下記をやった結果を示します。

    1.条件入力後マクロボタンを押すとテキストボックスの番号は下記に変わります。

           左から順に 29     31      33       34      35      36

    2.上記1の後に条件入力後マクロボタンを押さないでもテキストボックスの内容は変わっていました。

       その時のテキストボックスの番号は上記1のままでした。

    そこで質問ですが

    Q1.最初にマクロボタンを押した時に、テキストボックスの番号が1  2  3  4  5  6とならないのはなぜですか?

       ただこのグラフにはタイトル、凡例、XY軸ラベル、XY軸目盛を使用しています。   

       これが影響するのでしょうか?

    Q2.影響ないとすれば上記プログラムにある

       Set sh = ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 40, 25, 50, 25)

       このコマンドで*****AddTextbox*****

              とあるのでAddTextboxのAddの機能で新しくTextboxが追加されるのでしょうか?

    Q3.そうであれば、AddのつかないTextbox作成コマンドはないのでしょうか?

    Q4.また上記テキストボックス(1~36)の空き番号がどこで使われているのか調べる方法はあるのでしょうか?

    Q5."名前は変更可能ですので、追加後自分で変更することは可能です"

         とありますが、例えばQ2の中のコマンド"*************,40, 25, 50, 25)"で指定された"40, 25, 50, 25"のテキス

      トボックスに名前をつけられるということですか?

        この名前を仮に  "1111"  とします。

    Q6.この"1111"という名前のテキストボックスを指定して、仕様条件入力セルの内容を入れるようにできれば、

      今回のような仕様条件変更してマクロボタンをおしても、名前がインクリメントされることはないので問題が

      出ないと思いますが、このようにできるのでしょうか?

    Q7.最初の操作1、2で2についてですが

         マクロボタンを押さないでも、仕様条件入力セル変更が変更値を入力してエンターキーを押した時にテキス

      トボックスの番号は変わらずに内容は変更されています。

       これは私の作ったプログラムが、1回コマンドボタンを押して実施すればいつも実施されるようになってい

      るのでしょうか?

       自分で作って情けないですが、実はこのプログラムはマクロの記録で作ったものです。従って手動操作で

      やったことをプログラム化したものです。これに皆様方のご助言を入れたものです。

    Q7.一番良いのは、マクロボタンにプログラムを入れるのではなく、該当グラフ及び仕様条件入力セルの入った

      シートに入れることができれば、このシートを開けばマクロボタンは不要と思います。

       但しテキストボックスの問題はのこりますが、、、、

     長々と書きましたがよろしくお願いいたします。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2013-02-11T14:54:06+00:00

    質問の内容がよくわかりません。

    マクロの実行の度にテキストボックスを配置しているのでしょうか?

    グラフにテキストボックスを配置しておいて、その中身だけ変えればよいと思うのですが?

    まず、現在のコードをそのまま投稿してください。

    なお、自動付番の番号は変えられません。ただし、名前は変更可能ですので、追加後自分で変更することは可能です。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません