- ベストアンサー
(エクセル)オブジェクトをtabキーで選択する順番は、自由に変更できますか?
エクセルで、オブジェクトの「吹出し」を複数作成しました。tabキーを押すと、次のtabに飛んでくれますが、これを任意の順番に変更することは可能でしょうか。普通に作成すると、新しく作成したものから古いものにさかのぼる順で選択されています。この性質を利用して、選択したい順の逆順で作っていけば良いのですが、すでに相当数を作成しているため、一から作りなおさず選択順だけを変えたいと思っています。よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#4(misatoanna)です。 > このマクロでは、最後のオブジェクト選択状態でマクロを実行すると > エラーになります。 ごめんなさい。こちらではエラーを再現できません。 > Select Case Odr > Case Is = Ttl 'A > Nxt = 1 > Case Else 'B > Nxt = Odr + 1 > End Select この部分ですが、 A)選択したオブジェクトの順番が最前面(順位番号がオブジェクト数と 一致)なら、次に選択するのは最背面のオブジェクト。 B)それ以外ならひとつ前面のオブジェクト。 という処理です。 こちらでは、モジュールどおりに、最後のオブジェクトを選択した状態で 実行すると最初のオブジェクトに戻り、何回でも循環できるのですが。 エラーが起きたときに VisualBasicEditor を開いてみてください。 どこでエラーが起きて、どのようなメッセージが出ますか?
その他の回答 (7)
- xls88
- ベストアンサー率56% (669/1189)
>選択したい最後のオブジェクトが1度で選択され、 >何度実行してもそれ以外のオブジェクトがアクティブになりません。 そのまま、Tabキーを操作してみてください。 TabIndex(実際にはありません)が、1の図形から順にTab移動しないでしょうか? Tab移動の順番は、シートに貼り付けられた順になります。 従って、Cutして、PasteすることでTab移動順が最後に変更なります。 吹き出し以外に図形がある場合、それらの図形の後に、吹き出しのTab順がくることになります。 >それをテキストボックスの最初の2数字(01~)の順にtabを飛ばして>1つずつ書いてあるコメントを確認していく で、本当にやりたいことはこれですね。 下記に差し替えてください。 If stxt = i Then MsgBox shp.TextFrame.Characters.Text ' shpleft = shp.Left ' shptop = shp.Top ' shp.Cut ' ActiveSheet.Paste ' Selection.ShapeRange.Left = shpleft ' Selection.ShapeRange.Top = shptop Exit For End If
お礼
xls88さん、マクロ実行できました。メッセージボックスにコメントを表示できるようにして頂いたんですね。この機能はとても重宝します。辛抱強くお付き合い頂きありがとうございました。
- xls88
- ベストアンサー率56% (669/1189)
>テキストボックスの最初の2文字が、 >01から始まる2桁の半角数字で、 >この数字が選択したい順番に昇順になっています。 上記内容を手掛かりに対象オブジェクトを操作します。 従って、今度のマクロはオブジェクトを選択しておく必要がありません。 Sub test3() Dim shp As Shape Dim shpleft As Double Dim shptop As Double Dim stxt As String Dim i As Long Application.ScreenUpdating = False For i = 1 To ActiveSheet.Shapes.Count For Each shp In ActiveSheet.Shapes On Error Resume Next stxt = val(Left(shp.TextFrame.Characters.Text, 2)) On Error GoTo 0 If stxt = i Then shpleft = shp.Left shptop = shp.Top shp.Cut ActiveSheet.Paste Selection.ShapeRange.Left = shpleft Selection.ShapeRange.Top = shptop Exit For End If Next shp Next i Application.ScreenUpdating = True End Sub
お礼
xls88さん、度々ありがとうございます。 今回のマクロを実行すると、選択したい最後のオブジェクトが1度で選択され、何度実行してもそれ以外のオブジェクトがアクティブになりません。やりたいことは、1画面に収まりきらない数の吹出しがシートの中に散らばっていて、それをテキストボックスの最初の2数字(01~)の順にtabを飛ばして1つずつ書いてあるコメントを確認していく、ということです。よろしくお願いします。
- xls88
- ベストアンサー率56% (669/1189)
これも雑ですが、同じシート内で処理するようにしてみました。 Tag移動順に、オブジェクトを選択しておいて、マクロを実行してください。 マクロは大丈夫ですか? Tag移動順の規則とか何か手掛かりになるものはありますか? 例えば、オブジェクトの左上角がかかっているセル番地に規則性があるとか、もし、あれば教えてください。 Sub test2() Dim shp As Object Dim shpleft As Double Dim shptop As Double For Each shp In Selection shpleft = shp.Left shptop = shp.Top shp.Cut ActiveSheet.Paste Selection.ShapeRange.Left = shpleft Selection.ShapeRange.Top = shptop Next End Sub
補足
短時間に2度もご回答頂きありがとうございます。vbaはあまり詳しくありませんが、ご指定のvbaを実行してみました。 やり方が的を射ていないのか、オブジェクトを選択したい順にshiftを押しながら選択した後、vbaを実行したところ、選択した5つのオブジェクトの最後のものがアクティブになりました。もう一度実行すると、「オブジェクトは、このプロパティまたはメソッドをサポートしていません」というエラーメッセージが表示されました。 なお、オブジェクトの位置に規則性はなく、強いて言えば、吹出し(オブジェクトは全て吹出し)の中テキストボックスの最初の2文字が、01から始まる2桁の半角数字で、この数字が選択したい順番に昇順になっています。
- misatoanna
- ベストアンサー率58% (528/896)
#2さまのご回答のように、選択順は「上から下。同じ上位置なら左から右」で、 この順番は一般機能では変えられないのではないでしょうか。 次のようなマクロを記述してみました。 1.オブジェクトの順番を入れ換えるマクロ。 [Shift]を併用して選択したい順にオブジェクトを選択して実行します。 オブジェクトの数が多い場合は、数回に分けて操作してもOKです。 Sub SetOrder() Dim shp For Each shp In Selection shp.ShapeRange.ZOrder msoBringToFront Next End Sub 2.オブジェクトを順に選択するマクロ 選択されているオブジェクトの、ひとつ前面にあるオブジェクトを選択します。 Sub SelectNext() Dim Ttl, Odr, Nxt Ttl = ActiveSheet.Shapes.Count Odr = Selection.ShapeRange.ZOrderPosition Select Case Odr Case Is = Ttl Nxt = 1 Case Else Nxt = Odr + 1 End Select ActiveSheet.Shapes(Nxt).Select End Sub 3.[Tab]キーにマクロ(SelectNext)を割当てるマクロ 実行後、[Tab]キーを押すたびに上記マクロ(SelectNext)が実行されます。 Sub SetKey() Application.OnKey "{Tab}", "SelectNext" End Sub 4.[Tab]キーの機能をデフォルトに戻すマクロ。 Sub ResetKey() Application.OnKey "{Tab}" End Sub 新規ツールバーにユーザー設定ボタンを幾つか置いて、必要なマクロを登録して おくとラクですね。
お礼
ご返信ありがとうございました。 マクロ1,2を実行し、選択したい順にオブジェクトを選択することができました。もしお時間があればもう一つ教えていただきたいのですが、このマクロでは、最後のオブジェクト選択状態でマクロを実行するとエラーになります。これを、最初のオブジェクトに戻って何回転でも循環できるようにすることはできるでしょうか。よろしくお願いします。
- xls88
- ベストアンサー率56% (669/1189)
試しに大雑把ですが、マクロを組んでみました。 Sheet1のオブジェクトをSheet2に選択順にコピーします。 Tab移動順で、オブジェクトを選択しておいて、マクロを実行してください。 Sheet2に貼り付けられたオブジェクトは Sheet1のオブジェクトを選択した順番でTab移動します。 Sub test1() Dim shp As Object Dim saddress As String Application.ScreenUpdating = False For Each shp In Selection Worksheets("Sheet1").Select saddress = shp.TopLeftCell.Address shp.Copy Worksheets("Sheet2").Select Range(saddress).Select ActiveSheet.Paste Next Application.ScreenUpdating = True End Sub
- bonaron
- ベストアンサー率64% (482/745)
当方2003です。 エクセルは得意ではないのですが どうやら、 上から下へ、同じ上位置なら左から右へ という順序で移動するようです。 作成した順や、名前は関係ないようですし タブオーダーのようなプロパティも見つかりません。 任意の移動は無理じゃないでしょうか。
お礼
ご返信ありがとうございました。
- hatiboo
- ベストアンサー率42% (257/602)
こちらのバージョン2002ではtabで任意の移動設定はできないみたいでした。他のバージョンではどうなのでしょう コピーしたり移動したりすると移動の規則性がわかりません シェイプNOは変更できず、シェイプNO順に移動もしません 単に逆方向移動であれば、「shift」+「tab」で移動するのですが・・・・
お礼
ご返信ありがとうございました。
お礼
#4(misatoanna)さん、ご連絡ありがとうございます。 私のやり方が悪かったのか、今度は何週でも循環でき、当初やりたいとイメージしていた通りの結果になりました。辛抱強くお付き合い頂き感謝します。