Excel VBA 質問スレ Part60
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part59 https://mevius.5ch.net/test/read.cgi/tech/1549692750/ >>487 img.Nameで名前を調べることができます If img.Name <> "ボタンの名称" Then img.Delete End If みたいに書けば、特定の画像の消去をスキップできます >>489 名前なんて変化するのでコーディングするのはない プロパティで有るだろ、調べてないが常識的に 削除対象の画像を予めShapeRangeにまとめるなり、削除対象の画像の名前をシートに書き出すなりしてボタンマクロで一括削除させる設計にする方が検索効率や保守効率が良いと思う ボタン名やコントロール名でハードコーディングするのは下策 ボタンの数やコントロールの種類が増えたときにいちいち手直しする必要が出てくる 動的にコントロールを追加するプログラムを作ってないの? 毎回追加で書いてるの? それは面倒で下衆だわ >動的にコントロールを追加するプログラム 昔作ったわ EXCELでこの設計は止めたほうが良い。エラー頻発する >>487 For Each work in Shapes If work.type = 消したいオブジェクトタイプ Then 消す Next >>474 >>478 >>483 スマンな。 >>456 の時点では勘違いしてた。 でも、たぶん出来るだろうなと思ってやってみたら出来るな。 それどころか入力セルに対しても出来る。 >>487 は差のマクロが登録されたあるひとつのボタンだけを対象に「消したくない」と言っているように思えるのだが >>491 別にボタン名とかコントロール名でやっても良いと思うよ。 増えようが、名前付けル−ルがデタラメなんてこと無いだろう。 画像ならimgが先頭に付くとか、ボタンならbtnが付くとか、普通そうしてるはずだろ。 >>492 それは、この質問だけ見ただけじゃ何とも言えない。 消えなければ追加する等という作業は最初から必要無い。 動的に追加するような状況とも思えないな。 >>493 それはその組み方が良くないだけだろ。 まあ、その時目の前の問題だけクリアーするのは筋が悪い 目的を汎用化し使い易くメンテナンスし易いように組むな普通 VBAスレで何言ってんの そういうことを言い出すとVBAなんか使うなという結論にしかならんよ >>488 ボタンに名前をつけるにはどうすればいいんですか? >>497 名前比較で実現出来るかどうかという実現可能性の話をしてるわけではない あくまで効率性の話をしてるんだが 特定のボタンを消さないようにするという目的だけのためにShapesコレクションをなめてアイテムのNameプロパティを逐一調べるという処理は筋が悪い ワークシート上に存在する画像や図形、テキストボックス、コントロール等の数だけ名前比較することになるからな 削除対象になる画像をワークシートに追加するタイミングでShapeRangeコレクションに入れ、ボタン押下でDeleteメソッドで一括削除というやり方の方が絶対に速い 一つも目的だけの為に作り込むのが良いのか汎用性を持たせて使い回せるようにした方が良いのかって事で俺は汎用性がある方が長持ちして良いと思う派 >>502 あのさあ、わざわざそんなことするほどの処理かね? 俺だったら名前ではやらんと思うけど、こんなのは何でも良い話だろ。 普通に考えて、ボタン1つに後は画像だけなんじゃね―の? 正直、こんなので効率も糞も無いと思うね。 マクロに「Sub なんちゃら」って名前を付けるんだから、それを呼び出すボタンに固有の名前を付けるのは全く自然だ >>505 コレクションの総なめや文字列比較での処理分岐は処理速度の問題に直結するだろ それにマクロで処理しなければならないくらい画像を張り付けてあるシートに対する操作なら尚更処理が重くなる可能性が高い 数百個くらい画像が貼ってあるかもしれないし 割と現実的な設計の話だと思うんだが、まぁ君が効率も糞もないと思うなら仕方ない >>502 > 削除対象になる画像をワークシートに追加するタイミングでShapeRangeコレクションに入れ とか言うけど、その画像がプログラムで追加されるとは限らんよ 人が適当に描画した図形を単にクリアするボタンかも知れんし >>509 それならShapes.SelectallでShapeRangeコレクションに突っ込んで、マクロ呼び出し用のボタンだけShapeRangeから除外して一括削除だね とにかくShapesの中でループを回す必要がない >>507 それは数百個貼るような状況の場合の話。 そういう場合なら、その時考える話だ。 例えば、それなりに組める奴ならScreenUpdatingなんかを使っても速度が速くなることは無いだろう。 俺の場合も当然そうだ。 だからと言って、普段そんなに速度を重視して組んでいる訳じゃ無い。 しかしだ、状況により速さが必要になったら当然それ用に変わるだろう。 いつも速度を重視して組んでいるならご苦労なこった。 >>510 > マクロ呼び出し用のボタンだけShapeRangeから除外して どうやってやるつもり? オブジェクトを直接比較すれば済む話じゃね なんでわざわざ.Name呼び出して文字列比較するのかわからん オブジェクトの比較なら何千あっても大して遅くならんし 馬鹿ばっかかよ そもそもshaperangeコレクションにアイテムをremoveするメソッドがあれば済む話なのにな やっぱVBAって糞だわ >>513 オブジェクトを直接比較の何を比較するんだよ 全てのオブジェクトは代入で使ってるもの以外 違うんだけど vbaは===がない上にisで比較できないパターンがあったはず ユニークな名前で比較するやり方は正解 >>518 オブジェクトの参照を比較するに決まってんだろ素人か? >>519 このユースケースで試してからほざけ >>519 名前なんて好きに変えられるだろ そんなもんでユニークって言っても筋悪いって言われるんだよ >>520 素人でございます、具体的に提示してください Application.Caller と比較するのかな? >>524 これは、プロフェッショナルな>>520 様が明快なお答えを出してくれるので 黙っておけよ ObjPtr、ポインタ、参照渡しあたりでググれカス 煽りが下手すぎて説明する気にもならん >>487 Sub foo() For Each img In ActiveSheet.Shapes If img.Type <> 8 Then img.Delete End If Next End Sub ここ数日見てなかったけど何やってるんだお前ら プロパティ比較すればいいだけだろう、一体何日かかってるんだ https://i.imgur.com/B5lcGn9.png >>520 無能の頂天っすね >>526 具体的に提示できないのですか(笑) 必死でググったか(笑) >>528-529 俺から見ればお前ら両方雑魚やぞ >>530 >>494 で示されてることをかなり遅れてドヤ顔で書き込んだ奴がいるらしい 無能かな? >>530 ボタンはフォームコントロールとActiveXコントロールがあるけど 大丈夫か? 酒飲みながら茶化してるんですまんな >>531 終わってんのかよwww知るかwwwwじゃあ何の話してるんだよwwww ObjPtrだろうがなんだろうが「消しちゃいけないこのオブジェクト」を最初にどうやって指定するのかと 酒飲んでるから!本気じゃないから! はいノーダメ! 思考がテンプレすぎる >>537 いやいや、具体的にかけない君が何言っても 笑い話 >>526 そこじゃないと思うぞw 比較するためにはボタンをオブジェクトとして取得しなきゃならん。 どうやって取得する? >>527 俺もこのやり方をするだろうね。 でも名前でも全く問題無いと思うぞ。 >>537 結局、ググってもそんなコード内から泣いてるのか? 思いつきで、引きこもりのカスが書き込むよなこのスレも >>481 >>482 >>485 理解するコツを聞いているのに いろいろ使ってみろ、みたいな回答はおかしくないか? そんなこと承知の上で、理解するコツ、つまり心がけることやこんなことに注目したら理解がスイスイスーダラダッタスラスラスイスイスイっとできるかを聞いているのですが。 >>537 まあ、引きこもりのカスだからノーダメ・・全ダメ(笑) >>535 納得した 話題のループやグダグダ言う点は確かに酒の関の会話レベル シラフで話してる奴はすげぇわ >>539 thisかMe無いんだよな callerでオブジェクトの取得するには、 名前を取得してforeachで名前と一致するオブジェクトを探して・・・ になると思う。超面倒くさい >>542 ピボットに限らずEXCELは使わない機能が膨大にある やりたいことを決めて、機能を使いこなすのが一番早い 質問者はShapesコレクションのFor Eachで消えるボタンだって言ってますよ >>542 >理解するコツ それこそ、マニュアルを読めよまたはググれよ 例えば以下でもいいけど、他にもいっぱいある https://www.becoolusers.com/excel/pivottable.html だけど、頭の構造によって読んでも分かんない奴も多いからな 必要な時に使うんじゃわからんバカには無理って言ってるんだよ 普段から使えよ >>544 お前「caller」の意味わかって書いてる? 今回の場合に使うべきかもわからんのか? >>547 そう真剣になるなよ、本題についてはもうとっくに>>494 で終わってる で、 >ボタンをオブジェクトとして取得 これについて俺も知りたい callerは他言語で言うthisみたいなもんで、通常はオブジェクトで飛んでくる。もうちょい正確に言うとオブジェクトの参照だな これがオブジェクトで飛んでこないからめちゃくちゃ使い勝手が悪い オブジェクトで取得する楽な方法あるの? お前らもしかしてわざと無能演じてんの? だったらすげえや全然気づかなかった set b = ActiveSeet.Shapes(Application.Caller) For Each x in ActiveSeet.Shapes If Not x Is b Then x.Delete Next >>546 「いろいろ使ってみろ」とか「マニュアル読め」じゃないんだよ。 自分の言葉で説明してほしいということ。 具体的にはこれはデータベースを扱っているのだから 「フィールド」とか「グループ化」とか「集計」とかそういう具体的な用語を使ってだ。 VBAの特徴 内部抗争が酷いが外敵には一致団結して退治する >>550 それこそスレチだわ 初心者質問スレでも池よ >>549 確認してないが、それ複数ボタンで動くか? フォームコントロールとActiveXコントロール有るけど >>542 他人に期待しすぎ。 それが出来たら今頃は、サイト立ち上げたり、本出したり、どこかで講師やっとるがな。 MSからも含め、VBAよりもピボットテーブルの情報は少ないし、 パーツ、パーツで区切れるVBAよりも、 広範囲で漠然とした「自分のやりたいこと」に使えるかどうか、 試行してみないとなんとも言えない。 >>554 押されたボタン以外は消える ボタン1つと画像複数っていう質問なので削除ボタン以外のShapeを一括削除する仕様だと勝手に読み取った 少なくともNameで比較はありえねーよカスというサンプル こんなとき図星の決まり文句言わなきゃなんないのかぁ。 「 み ん な 理 解 で き て い な い 。」 理解できてる人なら竹を割ったようにスッキリと解説できるはず。 使いまくれとか、サイト見ろとか、試行してみないとなんとも言えないとか、全部言ってる人がピポットテーブルの本質を理解できていない決定的な証拠じゃないか。 >>557 当たってるよ。理解する必要ないからね ピボットで作るデータの9割ぐらいは基本機能で瞬殺だから「使って覚えろ」としか言えない 複雑な事をしたければ作業列でパーっと作った方が早い、深く理解して得るものが少なすぎる そもそも大事なことは目標の設定の仕方だから、このスレでどうこう言えない >>549 ShapeRangeコレクションにRemoveメソッドがない以上これが最適解だな foreach列挙中に対象コレクションから要素消すなよ VBAの演算子で一方だけ評価するのってありますか i < 100 OR data[i] = x みたいに境界超えてないか先にチェックしたい i < 100 AND data[i] = x 逆でした >>562-563 > VBAの演算子で一方だけ評価するのってありますか ない If i < 100 Then If data(i) = x Then ... ってやるしかない >>549 ??? それって、固定の名前でやるのに比べてどの程度メリットが有るの? 固定の名前でやる方がまだましだと思うんだが。 >>560 文字列型プロパティの比較判定は重い処理だし、オブジェクト命名の運用に処理結果が依存してしまう 組み込みの列挙定数やオブジェクトポインタで比較判定した方が安全なのは事実 ・プログラムとして危険 vs ・vbaだしどうでも良くね ファイッ >>566 ほう。 画像が100個あった場合、 文字列で比較と比べてどれくらい速くなるの? まったくアホらしいと思うんだが。 ぶっちゃけ1000回比較しても体感できる差は無いけど ならどちらがいいかは完全にセンスの問題になるわけで オブジェクトを比較したい場面でオブジェクトそのものを比較できるのにわざわざ名前みながら比べるとか 頭の中どうなってるの >>569 >>571 別に、名前で比較したいわけじゃ無い。 俺は最初から、こんなのどれでやっても良いだろ派だ。 最初からパフォ−マンスに大きな差が出ないと思ってたし、センスの問題はかなり気にする方だが、今回の問題ではどれでやってもセンスが悪いとも思わない。 >>572 Is知らなかったからって取り繕わなくてもいいよ >>573 ハァ? そんな初心者のわけねえだろ。 それに、 >>549 って俺に言わせると名前でやってることになるんだがw >>539 で、「どうやって取得する?」って書いたのは、結局名前で取得することになるんじゃね?って意味で、名前でってのはApplication.Callerみたいに名前を取得したら結局同じじゃね?って意味なんだがw >>573 だから、それは対象のボタンオブジェクトが分かってる場合だろ 最初のお題と違ってボタンがいくつあるかも分からん条件で効率よくってはなし 俺はNameプロパティは変更出来るだろ だからTypeプロパティだろって言っているだけ >>549 はデバッグ時に疲れからかモジュールにカーソルをあわせてF5を押してしまう この中で一番重いのはShapes.Delete それ以外をどんだけ工夫しても、逆にどんなタコなコーディングしても、体感できる差は出ないから 【12日まで】500円を貰える春のばらまきキャンペーン開催中です @ スマホのApp Storeから「プリン(pring)」をインストールする A 会員登録を済ませる B 下図の通りに進む https://pbs.twimg.com/media/D3pRtQiUwAQLMUR.jpg C コードを登録 [5gAYSz] これで五百円を貰えます スマホでセブンATMからお金を下ろせたり(キャッシュカード不要)便利なアプリですのでよろしければご利用下さい >>576 >>488-489 で解決してるからいいんじゃん あとはよくあるチンケな知識でのマウント合戦だからスルーでオケ マウントやめたら色々な方法見れて役に立つんだけどな 何故一番になりたがるのだろう 小さい花や大きな花 ひとつとして同じものはないから No1にならなくてもいい もともと特別なonly one まあ、なんだな久しぶりに実際に使ってみた ルーチンの仕様 1.フォームコントロールとActiveXコントロールで作成したShapeオブジェクトは全て残す 2.それ以外のShapeオブジェクトは全て消す 3.対象ShapeオブジェクトはActiveSheetのみ 3.フォームコントロールとActiveXコントロールどちらでも動作する Public Sub コントロール以外のイメージ削除() Dim shape1 As Shape For Each shape1 In ActiveSheet.Shapes 'MsgBox (shape1.Name & ":" & shape1.Type) 'これは確認用です・・・コメントアウト If shape1.Type <> msoOLEControlObject And shape1.Type <> msoFormControl Then shape1.Delete End If Next End Sub 実際に作成してみて感じたこと Nameプロパティは全て違うものが振られていく・・追番が付く フォームコント―ロールを使ってる人がやっぱいるんだ・・俺はActiveXコントロールしか 普段は使わない 追記しておくけど 目的・仕様をハッキリさせなきゃどんなルーチンも価値評価が難しいな 定義済み定数は定義名を使えよ普通に、ウォッチ式で確認できるから >For Each x in ActiveSeet.Shapes 誤記スンナ ×ActiveSeet ○ActiveSheet >>480 俺がどうしてもexcel捨てられない理由が唯一 ピボットテーブルがあることなんだけどな (その他のオフィス製品にも近ごろは 載っているようだが VBAからの操作に慣れきってると なかなか乗り換えきれない) 手放せなくなるまで使ってみてください 全部プロシージャで集計と報告系のマクロ書いてるけどグラフ出力とか一部は指定サイトの結果取得とか機能増えすぎて9モジュール1800行とかになってる なんちゃってプログラマの俺にはもうお辛い… 動きゃいいよ 要件がリッチになりすぎたなら、それはもう技術的に何とかしようとするより外部のSaaSを導入することを検討すべき ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる