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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

Q&A

解決済

2回答

2322閲覧

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

vitabrevisarsl1

総合スコア57

VBA

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

0グッド

0クリップ

投稿2017/11/12 14:02

編集2017/11/13 14:34

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

VBA

1Sub 上に行移動() 2 3Dim ssU As Object: Set ssU = ActiveSheet.Shapes ' 面倒なので変数に入れる 4Dim o As Integer 5Dim j As Integer: j = 1 6 7Application.ScreenUpdating = False 'チラついて五月蝿いのを防止 8 9 o = ssU(Application.Caller).TopLeftCell.Row 10 Debug.Print o 11 12 If o <> 8 Then 13 Range(o - 10 & ":" & o - 10).Select 14 For j = 1 To 10 15 Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 16 Next j 17 Rows(o + 10 & ":" & o + 19).Select 18 With Selection 19 .Cut Destination:=Rows(o - 10 & ":" & o - 1) 20 .EntireRow.Delete Shift:=xlUp 21 End With 22 End If 23 24Application.ScreenUpdating = True 25 26最上最下ボタン無効 27 28End Sub 29Sub 下に行移動() 30 31Dim ssD As Object: Set ssD = ActiveSheet.Shapes ' 面倒なので変数に入れる 32Dim p As Integer 33Dim j As Integer: j = 1 34 35Application.ScreenUpdating = False 'チラついて五月蝿いのを防止 36 37 p = ssD(Application.Caller).TopLeftCell.Row 38 39 Rows(p - 5 & ":" & p - 5).Select 40 For j = 1 To 10 41 Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 42 Next j 43 Rows(p + 15 & ":" & p + 24).Select 44 With Selection 45 .Cut Destination:=Rows(p - 5 & ":" & p + 4) 46 .EntireRow.Delete Shift:=xlUp 47 End With 48 49Application.ScreenUpdating = True 50 51最上最下ボタン無効 52 53End Sub 54```図は保存終了後閉じて、開き、▲を押下した際の現象です。18とか28を取得してほしいのですが、なぜか8を取得します。押下しても8の時は静止させているため当然変化はありません。 55 56また、時々([ファイル更新]の後だったり、[集計]の後だったり、▲▼ボタン押下の後だったりします)「""」というselectできないshapeが入り込み、例えば上図ではshape数は12ですが、▲▼ボタン押下後に13になったりすることがあります。そうなると正常に▲▼ボタンは動きません。 57 58素人があれこれいじっているため、私の気のつかないところ、書ききれないところに遠因があるのではとも疑い、ファイルをクラウド(リンク削除)に置き診ていただこうと思いました。 59「年間集計表」を開くと他の3つのファイルを読み込み、上図の状態を再現します。 60 61なにがしかご教授いただけますと幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

前回の質問で回答したとおり、私の環境(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 09:51

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vitabrevisarsl1

2017/11/13 11:25

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

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

2017/11/14 00:32 編集

勇気ある決断だと思います。 泥沼にハマると時間と体力を浪費してしまいますから。 まずは、絶対に必要な部分だけ開発して使ってもらい、 後から要望の優先順位とコストを天秤にかけて少しずつ対応していく、 そういう開発手法がちゃんとあり、大手企業内でも採用されています。 また、使う側と作る側のズレも大きくなりにくいのもメリットの1つです。 ただ、バージョンを分かるように(シート上に2017/11/11版等)しておいた方が、 後々のトラブルを回避しやすくなるでしょう。 最後に、▲▼機能を、どうしても何らかの形で実装する事になった場合の案を ・プルダウンでIDを選択できるようにする(選択時に該当行へ移動) ・集計ボタンの隣に▲▼ボタンを設置し、選択されているセルを基準に↑↓へ移動する ・ショートカットキーに▲▼機能を割り当てる ・氏名欄の上部で検索用の入力欄を設ける(入力時に、チェンジイベントでデータを絞り込む) ご参考まで。
jawa

2017/11/14 04:35

今回の件と同じように、コピーしたボタンに割り当てたマクロでApplication.Callerがコピー元オブジェクトを返してしまう現象が出て、「Excelのバグと思われる」と言っている記事を見かけました。 もしExcelのバグなのであれば、別方法で回避するしかないでしょう。 この状況を回避する策はExcelVBAerさんからのアドバイスにもある通りいくつか方法があります。 どれを採用するかは仕様や現場の意見、開発者の好みによってもかわってくるかと思います。 私が対応するなら、「画面上部に▲▼ボタンを置く」方法をとると思います。 添付いただいたイメージだと7行目までウィンドウ枠の固定をしているようですので、A7~B7あたりに▲▼ボタンを設置し、常にボタンが見えるようにしておきます。 ▲▼ボタンがひとつずつならクリックしたボタンをApplication.Callerで特定する必要もありません。 これまでTopLeftCellプロパティから取得していた行番号は、アクティブなセルの行番号を元に取得することになると思います。 例えば`Int((ActiveCell.Row - 7) / 10)`という計算で、10行単位の何グループ目かが取得できます。(先頭グループは0になります) 参考までに。
guest

0

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

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

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

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

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

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

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

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

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

投稿2017/11/13 01:56

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問