質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • VBA

    1421questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

(Application.Caller).TopLef の値がおかしいという問題

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 458

イメージ説明
・▲または▼ボタンで10行ごと上下移動(挿入とコピペと行削除)します。
・(Application.Caller).TopLefで行番号を取得するマクロを書きました。

Sub 上に行移動()

Dim ssU As Object: Set ssU = ActiveSheet.Shapes    ' 面倒なので変数に入れる
Dim o As Integer
Dim j As Integer: j = 1

Application.ScreenUpdating = False 'チラついて五月蝿いのを防止

    o = ssU(Application.Caller).TopLeftCell.Row
    Debug.Print o

    If o <> 8 Then
        Range(o - 10 & ":" & o - 10).Select
            For j = 1 To 10
                Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Next j
        Rows(o + 10 & ":" & o + 19).Select
        With Selection
            .Cut Destination:=Rows(o - 10 & ":" & o - 1)
            .EntireRow.Delete Shift:=xlUp
        End With
    End If

Application.ScreenUpdating = True

最上最下ボタン無効

End Sub
Sub 下に行移動()

Dim ssD As Object: Set ssD = ActiveSheet.Shapes    ' 面倒なので変数に入れる
Dim p As Integer
Dim j As Integer: j = 1

Application.ScreenUpdating = False 'チラついて五月蝿いのを防止

    p = ssD(Application.Caller).TopLeftCell.Row

    Rows(p - 5 & ":" & p - 5).Select
        For j = 1 To 10
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Next j
    Rows(p + 15 & ":" & p + 24).Select
    With Selection
        .Cut Destination:=Rows(p - 5 & ":" & p + 4)
        .EntireRow.Delete Shift:=xlUp
    End With

Application.ScreenUpdating = True

最上最下ボタン無効

End Sub

図は保存終了後閉じて、開き、▲を押下した際の現象です。18とか28を取得してほしいのですが、なぜか8を取得します。押下しても8の時は静止させているため当然変化はありません。

また、時々([ファイル更新]の後だったり、[集計]の後だったり、▲▼ボタン押下の後だったりします)「""」というselectできないshapeが入り込み、例えば上図ではshape数は12ですが、▲▼ボタン押下後に13になったりすることがあります。そうなると正常に▲▼ボタンは動きません。

素人があれこれいじっているため、私の気のつかないところ、書ききれないところに遠因があるのではとも疑い、ファイルをクラウド(リンク削除)に置き診ていただこうと思いました。
「年間集計表」を開くと他の3つのファイルを読み込み、上図の状態を再現します。

なにがしかご教授いただけますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

前回の質問は解決されたようですが、その原因をどのように解釈されましたか?
アドバイスでいただいたコードで問題が解消したからそれで良しとしてしまいましたか?
「問題の原因」や「対応の意味」を理解しなければ、別の形でまた同じ問題にぶつかることになります。

前回の質問で回答したとおり、私の環境(Windows7/Office2010)では再現性がないため推測の域を出ませんが、今回も同じ原因なのではないでしょうか。
前回同様ですが私はActiveSheet.Shapes(オブジェクト名)でボタンを特定しようとしている箇所がうまく機能していないのではないかと推測します。
※前回はActiveSheet.Shapes(オブジェクト名)でボタンを特定しなくてよい方法を解決策として選ばれたと思います。

まずApplication.Callerがどのような値をとっているか、ご存知でしょうか。
私の環境では、フォームボタンのクリック処理内でApplication.Callerを記述すると、クリックしたボタンのオブジェクト名(文字列)が返されます。
また、ボタンをコピーして新しいボタンを作成した際、オブジェクト名は自動的に変えられて同じ名前では作られないため、オブジェクト名で対象のボタンを一意に特定できています。

以上はあくまで「私の環境では」という条件付きです。

ここらへん動作がお使いのExcelのバージョン(2013?)では異なっているのならActiveSheet.Shapes(オブジェクト名)では目的のボタンを特定することができないと思います。

記述したコードが大きくなって問題がどこにあるのかわかりにくいときは、デバッグ実行でできるだけ小さな単位で本当に意図している結果が得られているのか確認することが解決への近道です。
今回であれば
Application.Callerはクリックしたボタンのオブジェクト名を返しているか?
ActiveSheet.Shapes(Application.Caller)は意図したボタンを取得しているか?
といった具合に、1行のコードでも細かく分解して、どこまで意図した動作をしていてどこから意図しない動作となっているのかを見極める必要があります。

手元にOffice2013環境がないのでこれ以上の検証はできませんが、もう少し問題点の分析を行ってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 20:25

    ・重ね重ね恐縮です。方針を決めました。詳細のちに追記します。

    キャンセル

  • 2017/11/13 23:29 編集

    【方針】 ▲▼ボタン不使用。ID順並び替えに変更。
    【理由】 Application.Callerによる座標の取得が不安定なため。
    【経緯】 前回のご教授は大変参考になりました。また、度重なるご教授のお手間を頂いておりますことに対し、ただただ感謝いたすところです。

     幾つかの動作の組み合わせ(集計ボタン押下後、あるいはファイルを閉じた状態で人員ファイルの追加・削除があった場合 .etc)によって▲▼ボタンが正常でない場合がありました。
     ウオッチ式で試行錯誤の結果、プルダウンの右端に出たり出なかったりする「▼」が影響していると推察しました。

    ●データの入力規則のドロップダウンボタンが消える
    http://bardiel-of-may.blogspot.co.id/2012/10/excel-2010.html

     これは、どうにもなりません。そのため、プルダウンをユーザーフォームで新たに作成してみたところ、「""」は現れなくなりましたが、今度も▲▼ボタンが正常でない場合がありました。
     上記いずれの▲▼ボタンが正常でない場合も、既出図で言いますと、Application.Callerはクリックした▲ボタンのオブジェクト名を返しておらず一番上の▲ボタン名を真ん中と下の2つともが返し、ActiveSheet.Shapes(Application.Caller)は意図したボタンを取得しておらず、.TopLefは8、という状況でした。
     オブジェクト名で対象の(コピペされた)ボタンを一意に特定できませんでした。insertコマンドをcopyコマンドに変更してみても状況は変わりませんでした。

     また、シェイプの自動選番されたインデックスのようなものが仮にあるとすれば、selectする順番を任意に変更できないかという方向で探した結果、そのようなことはできないようでした。

    ●EXCEL VBA オートシェイプナンバーのリセット
    https://oshiete.goo.ne.jp/qa/3921803.html


     以上の経過に加え、かかる時間とコストが得られる成果に見合うか、時間との勝負で代替案の方が優れているなら躊躇せず引くべしとの兵法の鉄則から、方針を転換するに至りました。
    (ソースを全部見てもらうことにするかどうか、相手のあることですから、悩むところです。いずれにしても、ツール作成自体を、やめるわけには参りません。)

    キャンセル

  • 2017/11/14 09:32 編集

    勇気ある決断だと思います。
    泥沼にハマると時間と体力を浪費してしまいますから。

    まずは、絶対に必要な部分だけ開発して使ってもらい、
    後から要望の優先順位とコストを天秤にかけて少しずつ対応していく、
    そういう開発手法がちゃんとあり、大手企業内でも採用されています。

    また、使う側と作る側のズレも大きくなりにくいのもメリットの1つです。

    ただ、バージョンを分かるように(シート上に2017/11/11版等)しておいた方が、
    後々のトラブルを回避しやすくなるでしょう。

    最後に、▲▼機能を、どうしても何らかの形で実装する事になった場合の案を
    ・プルダウンでIDを選択できるようにする(選択時に該当行へ移動)
    ・集計ボタンの隣に▲▼ボタンを設置し、選択されているセルを基準に↑↓へ移動する
    ・ショートカットキーに▲▼機能を割り当てる
    ・氏名欄の上部で検索用の入力欄を設ける(入力時に、チェンジイベントでデータを絞り込む)

    ご参考まで。

    キャンセル

  • 2017/11/14 13:35

    今回の件と同じように、コピーしたボタンに割り当てたマクロでApplication.Callerがコピー元オブジェクトを返してしまう現象が出て、「Excelのバグと思われる」と言っている記事を見かけました。
    もしExcelのバグなのであれば、別方法で回避するしかないでしょう。

    この状況を回避する策はExcelVBAerさんからのアドバイスにもある通りいくつか方法があります。
    どれを採用するかは仕様や現場の意見、開発者の好みによってもかわってくるかと思います。

    私が対応するなら、「画面上部に▲▼ボタンを置く」方法をとると思います。
    添付いただいたイメージだと7行目までウィンドウ枠の固定をしているようですので、A7~B7あたりに▲▼ボタンを設置し、常にボタンが見えるようにしておきます。
    ▲▼ボタンがひとつずつならクリックしたボタンをApplication.Callerで特定する必要もありません。

    これまでTopLeftCellプロパティから取得していた行番号は、アクティブなセルの行番号を元に取得することになると思います。
    例えば`Int((ActiveCell.Row - 7) / 10)`という計算で、10行単位の何グループ目かが取得できます。(先頭グループは0になります)
    参考までに。

    キャンセル

+2

あえて苦言を述べさせて頂きますが、
同じツールについて何度もQAを上げてますよね?

簡単に出来そうな事で、
幾つものハードルが出てきた場合には、
原点に立ち返り設計から見直すようにしています。

その方が時間的・技術的コストを小さくできる可能性が高いからです。

無理せず、クールダウンして一度考え直してはみませんか?

このツール、このまま突き進んで、完成できるのでしょうか?

完成できたとして、継続的に安定して使えるのでしょうか?

後から不明な不具合が何回も出てきて、直すのに苦労しないでしょうか?

もちろん、技術的には不可能ではないと思います。
しかし、コストと不安定要素の方が高いと思います。

あえて、いばらの道をいかれるという事でしたら、
ご自分で頑張ってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1421questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。