X



Excel VBA 質問スレ Part60

■ このスレッドは過去ログ倉庫に格納されています
0489デフォルトの名無しさん
垢版 |
2019/04/07(日) 12:06:51.57ID:oR5kGK9/
>>487
img.Nameで名前を調べることができます

If img.Name <> "ボタンの名称" Then
  img.Delete
End If

みたいに書けば、特定の画像の消去をスキップできます
0490デフォルトの名無しさん
垢版 |
2019/04/07(日) 12:40:05.22ID:z5f8NySY
>>489
名前なんて変化するのでコーディングするのはない
プロパティで有るだろ、調べてないが常識的に
0491デフォルトの名無しさん
垢版 |
2019/04/07(日) 13:13:42.16ID:dLz2IshG
削除対象の画像を予めShapeRangeにまとめるなり、削除対象の画像の名前をシートに書き出すなりしてボタンマクロで一括削除させる設計にする方が検索効率や保守効率が良いと思う
ボタン名やコントロール名でハードコーディングするのは下策
ボタンの数やコントロールの種類が増えたときにいちいち手直しする必要が出てくる
0492デフォルトの名無しさん
垢版 |
2019/04/07(日) 13:22:52.48ID:UhqEDEIh
動的にコントロールを追加するプログラムを作ってないの?
毎回追加で書いてるの?
それは面倒で下衆だわ
0493デフォルトの名無しさん
垢版 |
2019/04/07(日) 13:30:07.71ID:HG+SSO0q
>動的にコントロールを追加するプログラム
昔作ったわ
EXCELでこの設計は止めたほうが良い。エラー頻発する
0495デフォルトの名無しさん
垢版 |
2019/04/07(日) 15:13:26.49ID:zM3BxSpj
>>474
>>478
>>483

スマンな。
>>456の時点では勘違いしてた。

でも、たぶん出来るだろうなと思ってやってみたら出来るな。
それどころか入力セルに対しても出来る。
0496デフォルトの名無しさん
垢版 |
2019/04/07(日) 15:19:02.23ID:1196mB+r
>>487は差のマクロが登録されたあるひとつのボタンだけを対象に「消したくない」と言っているように思えるのだが
0497デフォルトの名無しさん
垢版 |
2019/04/07(日) 15:26:28.77ID:zM3BxSpj
>>491
別にボタン名とかコントロール名でやっても良いと思うよ。
増えようが、名前付けル−ルがデタラメなんてこと無いだろう。
画像ならimgが先頭に付くとか、ボタンならbtnが付くとか、普通そうしてるはずだろ。

>>492
それは、この質問だけ見ただけじゃ何とも言えない。
消えなければ追加する等という作業は最初から必要無い。
動的に追加するような状況とも思えないな。


>>493
それはその組み方が良くないだけだろ。
0498デフォルトの名無しさん
垢版 |
2019/04/07(日) 18:49:28.94ID:wMtd4Rq1
まあ、その時目の前の問題だけクリアーするのは筋が悪い
目的を汎用化し使い易くメンテナンスし易いように組むな普通
0499デフォルトの名無しさん
垢版 |
2019/04/07(日) 19:51:51.79ID:Eip3w86o
VBAスレで何言ってんの
そういうことを言い出すとVBAなんか使うなという結論にしかならんよ
0502デフォルトの名無しさん
垢版 |
2019/04/07(日) 21:10:44.99ID:dLz2IshG
>>497
名前比較で実現出来るかどうかという実現可能性の話をしてるわけではない
あくまで効率性の話をしてるんだが
特定のボタンを消さないようにするという目的だけのためにShapesコレクションをなめてアイテムのNameプロパティを逐一調べるという処理は筋が悪い
ワークシート上に存在する画像や図形、テキストボックス、コントロール等の数だけ名前比較することになるからな
削除対象になる画像をワークシートに追加するタイミングでShapeRangeコレクションに入れ、ボタン押下でDeleteメソッドで一括削除というやり方の方が絶対に速い
0504デフォルトの名無しさん
垢版 |
2019/04/07(日) 21:22:19.79ID:6gqi5pp/
一つも目的だけの為に作り込むのが良いのか汎用性を持たせて使い回せるようにした方が良いのかって事で俺は汎用性がある方が長持ちして良いと思う派
0505デフォルトの名無しさん
垢版 |
2019/04/07(日) 21:27:32.10ID:zM3BxSpj
>>502
あのさあ、わざわざそんなことするほどの処理かね?
俺だったら名前ではやらんと思うけど、こんなのは何でも良い話だろ。

普通に考えて、ボタン1つに後は画像だけなんじゃね―の?
正直、こんなので効率も糞も無いと思うね。
0506デフォルトの名無しさん
垢版 |
2019/04/07(日) 21:45:02.84ID:SzIL1mww
マクロに「Sub なんちゃら」って名前を付けるんだから、それを呼び出すボタンに固有の名前を付けるのは全く自然だ
0507デフォルトの名無しさん
垢版 |
2019/04/07(日) 22:33:14.85ID:dLz2IshG
>>505
コレクションの総なめや文字列比較での処理分岐は処理速度の問題に直結するだろ
それにマクロで処理しなければならないくらい画像を張り付けてあるシートに対する操作なら尚更処理が重くなる可能性が高い
数百個くらい画像が貼ってあるかもしれないし

割と現実的な設計の話だと思うんだが、まぁ君が効率も糞もないと思うなら仕方ない
0509デフォルトの名無しさん
垢版 |
2019/04/07(日) 22:38:12.36ID:AvqFg232
>>502
> 削除対象になる画像をワークシートに追加するタイミングでShapeRangeコレクションに入れ
とか言うけど、その画像がプログラムで追加されるとは限らんよ
人が適当に描画した図形を単にクリアするボタンかも知れんし
0510デフォルトの名無しさん
垢版 |
2019/04/07(日) 22:43:02.40ID:dLz2IshG
>>509
それならShapes.SelectallでShapeRangeコレクションに突っ込んで、マクロ呼び出し用のボタンだけShapeRangeから除外して一括削除だね
とにかくShapesの中でループを回す必要がない
0511デフォルトの名無しさん
垢版 |
2019/04/07(日) 22:50:29.75ID:IY2XTri8
>>507
それは数百個貼るような状況の場合の話。
そういう場合なら、その時考える話だ。

例えば、それなりに組める奴ならScreenUpdatingなんかを使っても速度が速くなることは無いだろう。
俺の場合も当然そうだ。
だからと言って、普段そんなに速度を重視して組んでいる訳じゃ無い。
しかしだ、状況により速さが必要になったら当然それ用に変わるだろう。

いつも速度を重視して組んでいるならご苦労なこった。
0513デフォルトの名無しさん
垢版 |
2019/04/08(月) 02:30:49.49ID:OEfF6P+m
オブジェクトを直接比較すれば済む話じゃね
なんでわざわざ.Name呼び出して文字列比較するのかわからん
オブジェクトの比較なら何千あっても大して遅くならんし
馬鹿ばっかかよ
0514デフォルトの名無しさん
垢版 |
2019/04/08(月) 02:33:33.22ID:OEfF6P+m
そもそもshaperangeコレクションにアイテムをremoveするメソッドがあれば済む話なのにな
やっぱVBAって糞だわ
0515デフォルトの名無しさん
垢版 |
2019/04/08(月) 06:39:30.33ID:2IBrjRoX
やっと気付いた?
0518デフォルトの名無しさん
垢版 |
2019/04/08(月) 10:38:02.22ID:20rc9alP
>>513
オブジェクトを直接比較の何を比較するんだよ
全てのオブジェクトは代入で使ってるもの以外
違うんだけど
0519デフォルトの名無しさん
垢版 |
2019/04/08(月) 10:40:14.98ID:qrhOu38P
vbaは===がない上にisで比較できないパターンがあったはず
ユニークな名前で比較するやり方は正解
0521デフォルトの名無しさん
垢版 |
2019/04/08(月) 11:00:40.34ID:20rc9alP
>>519
名前なんて好きに変えられるだろ
そんなもんでユニークって言っても筋悪いって言われるんだよ
0526デフォルトの名無しさん
垢版 |
2019/04/08(月) 11:44:28.64ID:f4XbMpJ6
ObjPtr、ポインタ、参照渡しあたりでググれカス
煽りが下手すぎて説明する気にもならん
0527デフォルトの名無しさん
垢版 |
2019/04/08(月) 11:44:45.29ID:qrhOu38P
>>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
無能の頂天っすね
0532デフォルトの名無しさん
垢版 |
2019/04/08(月) 11:56:32.80ID:20rc9alP
>>530
ボタンはフォームコントロールとActiveXコントロールがあるけど
大丈夫か? 酒飲みながら茶化してるんですまんな
0536デフォルトの名無しさん
垢版 |
2019/04/08(月) 12:04:25.33ID:cNRL9eDF
ObjPtrだろうがなんだろうが「消しちゃいけないこのオブジェクト」を最初にどうやって指定するのかと
0537デフォルトの名無しさん
垢版 |
2019/04/08(月) 12:04:58.54ID:f4XbMpJ6
酒飲んでるから!本気じゃないから!
はいノーダメ!

思考がテンプレすぎる
0539デフォルトの名無しさん
垢版 |
2019/04/08(月) 12:24:06.89ID:KL9iMO+X
>>526
そこじゃないと思うぞw
比較するためにはボタンをオブジェクトとして取得しなきゃならん。

どうやって取得する?

>>527
俺もこのやり方をするだろうね。
でも名前でも全く問題無いと思うぞ。
0540デフォルトの名無しさん
垢版 |
2019/04/08(月) 12:35:47.16ID:20rc9alP
>>537
結局、ググってもそんなコード内から泣いてるのか?
思いつきで、引きこもりのカスが書き込むよなこのスレも
0542480
垢版 |
2019/04/08(月) 13:11:52.02ID:cVIHdDyE
>>481
>>482
>>485

理解するコツを聞いているのに
いろいろ使ってみろ、みたいな回答はおかしくないか?

そんなこと承知の上で、理解するコツ、つまり心がけることやこんなことに注目したら理解がスイスイスーダラダッタスラスラスイスイスイっとできるかを聞いているのですが。
0544デフォルトの名無しさん
垢版 |
2019/04/08(月) 14:13:07.53ID:qrhOu38P
>>535
納得した
話題のループやグダグダ言う点は確かに酒の関の会話レベル
シラフで話してる奴はすげぇわ

>>539
thisかMe無いんだよな
callerでオブジェクトの取得するには、
名前を取得してforeachで名前と一致するオブジェクトを探して・・・
になると思う。超面倒くさい

>>542
ピボットに限らずEXCELは使わない機能が膨大にある
やりたいことを決めて、機能を使いこなすのが一番早い
0546デフォルトの名無しさん
垢版 |
2019/04/08(月) 16:07:16.94ID:20rc9alP
>>542
>理解するコツ
それこそ、マニュアルを読めよまたはググれよ
例えば以下でもいいけど、他にもいっぱいある
https://www.becoolusers.com/excel/pivottable.html
だけど、頭の構造によって読んでも分かんない奴も多いからな
必要な時に使うんじゃわからんバカには無理って言ってるんだよ
普段から使えよ
0548デフォルトの名無しさん
垢版 |
2019/04/08(月) 16:32:09.53ID:qrhOu38P
>>547
そう真剣になるなよ、本題についてはもうとっくに>>494で終わってる

で、
>ボタンをオブジェクトとして取得
これについて俺も知りたい
callerは他言語で言うthisみたいなもんで、通常はオブジェクトで飛んでくる。もうちょい正確に言うとオブジェクトの参照だな
これがオブジェクトで飛んでこないからめちゃくちゃ使い勝手が悪い
オブジェクトで取得する楽な方法あるの?
0549デフォルトの名無しさん
垢版 |
2019/04/08(月) 16:59:10.82ID:eHXY0QFN
お前らもしかしてわざと無能演じてんの?
だったらすげえや全然気づかなかった

set b = ActiveSeet.Shapes(Application.Caller)
For Each x in ActiveSeet.Shapes
If Not x Is b Then x.Delete
Next
0550デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:02:54.81ID:cVIHdDyE
>>546
「いろいろ使ってみろ」とか「マニュアル読め」じゃないんだよ。
自分の言葉で説明してほしいということ。

具体的にはこれはデータベースを扱っているのだから
「フィールド」とか「グループ化」とか「集計」とかそういう具体的な用語を使ってだ。
0551デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:08:22.50ID:9eoJzmPe
VBAの特徴
内部抗争が酷いが外敵には一致団結して退治する
0554デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:15:00.42ID:lpvwS4NY
>>549
確認してないが、それ複数ボタンで動くか?
フォームコントロールとActiveXコントロール有るけど
0555デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:20:52.07ID:ccKDHzfP
>>542
他人に期待しすぎ。
それが出来たら今頃は、サイト立ち上げたり、本出したり、どこかで講師やっとるがな。

MSからも含め、VBAよりもピボットテーブルの情報は少ないし、
パーツ、パーツで区切れるVBAよりも、
広範囲で漠然とした「自分のやりたいこと」に使えるかどうか、
試行してみないとなんとも言えない。
0556デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:26:33.08ID:eHXY0QFN
>>554
押されたボタン以外は消える
ボタン1つと画像複数っていう質問なので削除ボタン以外のShapeを一括削除する仕様だと勝手に読み取った
少なくともNameで比較はありえねーよカスというサンプル
0557デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:28:02.25ID:cVIHdDyE
こんなとき図星の決まり文句言わなきゃなんないのかぁ。
「 み ん な 理 解 で き て い な い 。」

理解できてる人なら竹を割ったようにスッキリと解説できるはず。
使いまくれとか、サイト見ろとか、試行してみないとなんとも言えないとか、全部言ってる人がピポットテーブルの本質を理解できていない決定的な証拠じゃないか。
0558デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:39:46.71ID:qrhOu38P
>>557
当たってるよ。理解する必要ないからね
ピボットで作るデータの9割ぐらいは基本機能で瞬殺だから「使って覚えろ」としか言えない
複雑な事をしたければ作業列でパーっと作った方が早い、深く理解して得るものが少なすぎる

そもそも大事なことは目標の設定の仕方だから、このスレでどうこう言えない
0562デフォルトの名無しさん
垢版 |
2019/04/08(月) 20:31:30.66ID:r03ED/xX
VBAの演算子で一方だけ評価するのってありますか
i < 100 OR data[i] = x みたいに境界超えてないか先にチェックしたい
0564デフォルトの名無しさん
垢版 |
2019/04/08(月) 20:45:56.01ID:lSCOP8uB
>>562-563
> VBAの演算子で一方だけ評価するのってありますか
ない
If i < 100 Then If data(i) = x Then ...
ってやるしかない
0565デフォルトの名無しさん
垢版 |
2019/04/08(月) 21:11:16.19ID:KL9iMO+X
>>549
???
それって、固定の名前でやるのに比べてどの程度メリットが有るの?

固定の名前でやる方がまだましだと思うんだが。
0566デフォルトの名無しさん
垢版 |
2019/04/08(月) 21:11:26.99ID:AlMdksUV
>>560
文字列型プロパティの比較判定は重い処理だし、オブジェクト命名の運用に処理結果が依存してしまう
組み込みの列挙定数やオブジェクトポインタで比較判定した方が安全なのは事実
0568デフォルトの名無しさん
垢版 |
2019/04/08(月) 21:15:36.62ID:KL9iMO+X
>>566
ほう。
画像が100個あった場合、
文字列で比較と比べてどれくらい速くなるの?

まったくアホらしいと思うんだが。
0571デフォルトの名無しさん
垢版 |
2019/04/08(月) 21:48:31.68ID:besmAe1s
ぶっちゃけ1000回比較しても体感できる差は無いけど
ならどちらがいいかは完全にセンスの問題になるわけで

オブジェクトを比較したい場面でオブジェクトそのものを比較できるのにわざわざ名前みながら比べるとか

頭の中どうなってるの
0572デフォルトの名無しさん
垢版 |
2019/04/08(月) 22:07:24.49ID:4iOzxu9L
>>569
>>571
別に、名前で比較したいわけじゃ無い。
俺は最初から、こんなのどれでやっても良いだろ派だ。

最初からパフォ−マンスに大きな差が出ないと思ってたし、センスの問題はかなり気にする方だが、今回の問題ではどれでやってもセンスが悪いとも思わない。
0574デフォルトの名無しさん
垢版 |
2019/04/08(月) 22:26:49.07ID:4iOzxu9L
>>573
ハァ?
そんな初心者のわけねえだろ。

それに、
>>549って俺に言わせると名前でやってることになるんだがw

>>539で、「どうやって取得する?」って書いたのは、結局名前で取得することになるんじゃね?って意味で、名前でってのはApplication.Callerみたいに名前を取得したら結局同じじゃね?って意味なんだがw
0575デフォルトの名無しさん
垢版 |
2019/04/08(月) 22:36:44.56ID:lpvwS4NY
>>573
だから、それは対象のボタンオブジェクトが分かってる場合だろ
最初のお題と違ってボタンがいくつあるかも分からん条件で効率よくってはなし
俺はNameプロパティは変更出来るだろ
だからTypeプロパティだろって言っているだけ
0578デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:44:23.79ID:cuTyECFJ
この中で一番重いのはShapes.Delete
それ以外をどんだけ工夫しても、逆にどんなタコなコーディングしても、体感できる差は出ないから
0579デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:51:44.81ID:flshAmjZ
【12日まで】500円を貰える春のばらまきキャンペーン開催中です 
     
@ スマホのApp Storeから「プリン(pring)」をインストールする  
A 会員登録を済ませる     
B 下図の通りに進む  
https://pbs.twimg.com/media/D3pRtQiUwAQLMUR.jpg    
C コードを登録 [5gAYSz]  

これで五百円を貰えます  
スマホでセブンATMからお金を下ろせたり(キャッシュカード不要)便利なアプリですのでよろしければご利用下さい
0581デフォルトの名無しさん
垢版 |
2019/04/09(火) 08:39:46.28ID:mg+oftxD
マウントやめたら色々な方法見れて役に立つんだけどな
何故一番になりたがるのだろう
0582デフォルトの名無しさん
垢版 |
2019/04/09(火) 08:43:42.22ID:sTjNwrNP
そうさぼくらは世界にひとつだけの花
0583デフォルトの名無しさん
垢版 |
2019/04/09(火) 08:45:37.14ID:sTjNwrNP
小さい花や大きな花
ひとつとして同じものはないから
No1にならなくてもいい
もともと特別なonly one
0584デフォルトの名無しさん
垢版 |
2019/04/09(火) 11:49:39.06ID:4ZugEZRH
まあ、なんだな久しぶりに実際に使ってみた
ルーチンの仕様
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コントロールしか
普段は使わない
0585デフォルトの名無しさん
垢版 |
2019/04/09(火) 13:45:14.72ID:4ZugEZRH
追記しておくけど
目的・仕様をハッキリさせなきゃどんなルーチンも価値評価が難しいな
定義済み定数は定義名を使えよ普通に、ウォッチ式で確認できるから
>For Each x in ActiveSeet.Shapes
誤記スンナ ×ActiveSeet ○ActiveSheet
0586デフォルトの名無しさん
垢版 |
2019/04/09(火) 16:00:23.87ID:v/sKiq9O
>>480
俺がどうしてもexcel捨てられない理由が唯一
ピボットテーブルがあることなんだけどな
(その他のオフィス製品にも近ごろは
載っているようだが
VBAからの操作に慣れきってると
なかなか乗り換えきれない)

手放せなくなるまで使ってみてください
0588デフォルトの名無しさん
垢版 |
2019/04/10(水) 10:58:53.58ID:6J3r6J/I
全部プロシージャで集計と報告系のマクロ書いてるけどグラフ出力とか一部は指定サイトの結果取得とか機能増えすぎて9モジュール1800行とかになってる
なんちゃってプログラマの俺にはもうお辛い…
0589デフォルトの名無しさん
垢版 |
2019/04/10(水) 11:28:22.21ID:UESsnIOi
動きゃいいよ
要件がリッチになりすぎたなら、それはもう技術的に何とかしようとするより外部のSaaSを導入することを検討すべき
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況