Excel VBA 質問スレ Part60

■ このスレッドは過去ログ倉庫に格納されています
2019/03/16(土) 20:39:09.64ID:6HWXzj9o
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part59
https://mevius.5ch.net/test/read.cgi/tech/1549692750/
2019/04/06(土) 09:18:19.10ID:9IkbKopt
>>480
ピボットテーブルな
繰り返し使うしか無い
後は元データもちゃんとしたものじゃないとピボットがうまく機能しない
2019/04/06(土) 09:43:33.17ID:LrM+2CU8
>>480
色々できて楽しいと思いながら
新しい使い方を検索しながら使いな
2019/04/06(土) 11:28:05.41ID:QwecXQyr
>>454の関数で値を計算して返すついでにどこか別のセルの値を設定しようと
Range("A1") = 1
としたって通らないだろ
そんな制約があったんじゃ>>445に対する答えにはならんね
2019/04/06(土) 12:56:33.17ID:aPksILYp
マイクに話しかけたら実行されるようにすりゃいいんじゃないの?
2019/04/06(土) 13:12:45.38ID:cYL1/vjQ
>>480
いろいろやってみると面白いし、
元データをテーブルにして組み合わせると、
計算速度も速いような?

融通が利かない部分もあるけど。
4〜3月の月次推移グラフで、
ピボットテーブルには年度合計を出せるのに、
この合計もグラフに反映させる方法あるのか、ないのか・・・
日時時間フィルターのタイムラインは、使い勝手がイマイチ、
とか。

あと、縦横クロス集計のピボットテーブルを
一発でリスト表(3Dマップに使える)に変換する隠れ機能があったり。
2019/04/06(土) 23:19:03.44ID:+F6584OT
まずスレタイぐらい理解できるようになろう
2019/04/07(日) 11:38:35.77ID:J7v3B2LO
シート内にマクロを設定した
ボタンを1つと、複数の画像があります。

ボタンをクリックしたら以下コードを実行し画像の一括削除を行っています。
しかし、問題があってボタンまで消失してしまいます。

そこでボタンの場合には削除はしない
という風に制御を入れたいのですが、ボタンの名称はどうやって調べればよいでしょうか?


'シート無いの画像をすべて削除する。
For Each img In ActiveSheet.Shapes
img.Delete
Next
2019/04/07(日) 11:59:22.40ID:SzIL1mww
>>487
ボタンに特定の名前を付けてそれをハードコーディングすりゃいいと思うがそれじゃ不満なのかな?
2019/04/07(日) 12:06:51.57ID:oR5kGK9/
>>487
img.Nameで名前を調べることができます

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

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

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

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

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


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

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

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

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

いつも速度を重視して組んでいるならご苦労なこった。
2019/04/07(日) 22:54:24.63ID:AvqFg232
>>510
> マクロ呼び出し用のボタンだけShapeRangeから除外して
どうやってやるつもり?
2019/04/08(月) 02:30:49.49ID:OEfF6P+m
オブジェクトを直接比較すれば済む話じゃね
なんでわざわざ.Name呼び出して文字列比較するのかわからん
オブジェクトの比較なら何千あっても大して遅くならんし
馬鹿ばっかかよ
2019/04/08(月) 02:33:33.22ID:OEfF6P+m
そもそもshaperangeコレクションにアイテムをremoveするメソッドがあれば済む話なのにな
やっぱVBAって糞だわ
515デフォルトの名無しさん
垢版 |
2019/04/08(月) 06:39:30.33ID:2IBrjRoX
やっと気付いた?
2019/04/08(月) 08:39:44.42ID:HwCnDiL+
20年進歩なければな
2019/04/08(月) 09:10:46.62ID:5f7aEGaE
>>503
ありがとう!
2019/04/08(月) 10:38:02.22ID:20rc9alP
>>513
オブジェクトを直接比較の何を比較するんだよ
全てのオブジェクトは代入で使ってるもの以外
違うんだけど
2019/04/08(月) 10:40:14.98ID:qrhOu38P
vbaは===がない上にisで比較できないパターンがあったはず
ユニークな名前で比較するやり方は正解
2019/04/08(月) 10:59:09.00ID:f4XbMpJ6
>>518
オブジェクトの参照を比較するに決まってんだろ素人か?
>>519
このユースケースで試してからほざけ
2019/04/08(月) 11:00:40.34ID:20rc9alP
>>519
名前なんて好きに変えられるだろ
そんなもんでユニークって言っても筋悪いって言われるんだよ
2019/04/08(月) 11:02:06.10ID:20rc9alP
>>520
素人でございます、具体的に提示してください
2019/04/08(月) 11:06:10.01ID:r5MC5DWh
うむ
2019/04/08(月) 11:28:59.16ID:cNRL9eDF
Application.Caller と比較するのかな?
2019/04/08(月) 11:34:02.89ID:20rc9alP
>>524
これは、プロフェッショナルな>>520 様が明快なお答えを出してくれるので
黙っておけよ
2019/04/08(月) 11:44:28.64ID:f4XbMpJ6
ObjPtr、ポインタ、参照渡しあたりでググれカス
煽りが下手すぎて説明する気にもならん
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
無能の頂天っすね
2019/04/08(月) 11:45:39.84ID:20rc9alP
>>526
具体的に提示できないのですか(笑)
必死でググったか(笑)
2019/04/08(月) 11:49:55.04ID:f4XbMpJ6
>>528
捨て台詞も下手くそだな
2019/04/08(月) 11:51:20.33ID:qrhOu38P
>>528-529
俺から見ればお前ら両方雑魚やぞ
2019/04/08(月) 11:54:16.26ID:f4XbMpJ6
>>530
>>494 で示されてることをかなり遅れてドヤ顔で書き込んだ奴がいるらしい
無能かな?
2019/04/08(月) 11:56:32.80ID:20rc9alP
>>530
ボタンはフォームコントロールとActiveXコントロールがあるけど
大丈夫か? 酒飲みながら茶化してるんですまんな
2019/04/08(月) 11:57:35.69ID:qrhOu38P
>>531
終わってんのかよwww知るかwwwwじゃあ何の話してるんだよwwww
2019/04/08(月) 11:58:24.09ID:20rc9alP
>>529
でも、お前(笑)
2019/04/08(月) 12:01:13.75ID:20rc9alP
>>533
茶飲み話に決まってるだろ・・酒か・・
2019/04/08(月) 12:04:25.33ID:cNRL9eDF
ObjPtrだろうがなんだろうが「消しちゃいけないこのオブジェクト」を最初にどうやって指定するのかと
2019/04/08(月) 12:04:58.54ID:f4XbMpJ6
酒飲んでるから!本気じゃないから!
はいノーダメ!

思考がテンプレすぎる
2019/04/08(月) 12:07:53.61ID:20rc9alP
>>537
いやいや、具体的にかけない君が何言っても
笑い話
2019/04/08(月) 12:24:06.89ID:KL9iMO+X
>>526
そこじゃないと思うぞw
比較するためにはボタンをオブジェクトとして取得しなきゃならん。

どうやって取得する?

>>527
俺もこのやり方をするだろうね。
でも名前でも全く問題無いと思うぞ。
2019/04/08(月) 12:35:47.16ID:20rc9alP
>>537
結局、ググってもそんなコード内から泣いてるのか?
思いつきで、引きこもりのカスが書き込むよなこのスレも
541480
垢版 |
2019/04/08(月) 13:06:22.74ID:cVIHdDyE
>>481
名前などどうでもいいではないか。
https://pds.exblog.jp/pds/1/200808/06/80/b0003180_19511656.jpg
542480
垢版 |
2019/04/08(月) 13:11:52.02ID:cVIHdDyE
>>481
>>482
>>485

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

そんなこと承知の上で、理解するコツ、つまり心がけることやこんなことに注目したら理解がスイスイスーダラダッタスラスラスイスイスイっとできるかを聞いているのですが。
2019/04/08(月) 13:17:44.71ID:20rc9alP
>>537
まあ、引きこもりのカスだからノーダメ・・全ダメ(笑)
2019/04/08(月) 14:13:07.53ID:qrhOu38P
>>535
納得した
話題のループやグダグダ言う点は確かに酒の関の会話レベル
シラフで話してる奴はすげぇわ

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

>>542
ピボットに限らずEXCELは使わない機能が膨大にある
やりたいことを決めて、機能を使いこなすのが一番早い
2019/04/08(月) 14:58:52.26ID:9sVYCwmO
質問者はShapesコレクションのFor Eachで消えるボタンだって言ってますよ
2019/04/08(月) 16:07:16.94ID:20rc9alP
>>542
>理解するコツ
それこそ、マニュアルを読めよまたはググれよ
例えば以下でもいいけど、他にもいっぱいある
https://www.becoolusers.com/excel/pivottable.html
だけど、頭の構造によって読んでも分かんない奴も多いからな
必要な時に使うんじゃわからんバカには無理って言ってるんだよ
普段から使えよ
2019/04/08(月) 16:21:30.00ID:20rc9alP
>>544
お前「caller」の意味わかって書いてる?
今回の場合に使うべきかもわからんのか?
2019/04/08(月) 16:32:09.53ID:qrhOu38P
>>547
そう真剣になるなよ、本題についてはもうとっくに>>494で終わってる

で、
>ボタンをオブジェクトとして取得
これについて俺も知りたい
callerは他言語で言うthisみたいなもんで、通常はオブジェクトで飛んでくる。もうちょい正確に言うとオブジェクトの参照だな
これがオブジェクトで飛んでこないからめちゃくちゃ使い勝手が悪い
オブジェクトで取得する楽な方法あるの?
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
550デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:02:54.81ID:cVIHdDyE
>>546
「いろいろ使ってみろ」とか「マニュアル読め」じゃないんだよ。
自分の言葉で説明してほしいということ。

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

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

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

そもそも大事なことは目標の設定の仕方だから、このスレでどうこう言えない
2019/04/08(月) 17:52:36.06ID:TKIMwKN2
>>549
ShapeRangeコレクションにRemoveメソッドがない以上これが最適解だな
2019/04/08(月) 19:14:24.14ID:P0CHcdLi
>>556
なんでName で比較しないの?
2019/04/08(月) 19:33:54.35ID:V7WRm0mr
foreach列挙中に対象コレクションから要素消すなよ
2019/04/08(月) 20:31:30.66ID:r03ED/xX
VBAの演算子で一方だけ評価するのってありますか
i < 100 OR data[i] = x みたいに境界超えてないか先にチェックしたい
2019/04/08(月) 20:33:46.80ID:r03ED/xX
i < 100 AND data[i] = x
逆でした
2019/04/08(月) 20:45:56.01ID:lSCOP8uB
>>562-563
> VBAの演算子で一方だけ評価するのってありますか
ない
If i < 100 Then If data(i) = x Then ...
ってやるしかない
2019/04/08(月) 21:11:16.19ID:KL9iMO+X
>>549
???
それって、固定の名前でやるのに比べてどの程度メリットが有るの?

固定の名前でやる方がまだましだと思うんだが。
2019/04/08(月) 21:11:26.99ID:AlMdksUV
>>560
文字列型プロパティの比較判定は重い処理だし、オブジェクト命名の運用に処理結果が依存してしまう
組み込みの列挙定数やオブジェクトポインタで比較判定した方が安全なのは事実
2019/04/08(月) 21:13:41.55ID:ARCkkcA0
・プログラムとして危険
vs
・vbaだしどうでも良くね

ファイッ
2019/04/08(月) 21:15:36.62ID:KL9iMO+X
>>566
ほう。
画像が100個あった場合、
文字列で比較と比べてどれくらい速くなるの?

まったくアホらしいと思うんだが。
2019/04/08(月) 21:40:37.98ID:besmAe1s
なんでわざわざ名前で比較したがるの?
2019/04/08(月) 21:48:14.01ID:r03ED/xX
>>564
ありがとうございます

発狂する
2019/04/08(月) 21:48:31.68ID:besmAe1s
ぶっちゃけ1000回比較しても体感できる差は無いけど
ならどちらがいいかは完全にセンスの問題になるわけで

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

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

最初からパフォ−マンスに大きな差が出ないと思ってたし、センスの問題はかなり気にする方だが、今回の問題ではどれでやってもセンスが悪いとも思わない。
2019/04/08(月) 22:17:03.71ID:besmAe1s
>>572
Is知らなかったからって取り繕わなくてもいいよ
2019/04/08(月) 22:26:49.07ID:4iOzxu9L
>>573
ハァ?
そんな初心者のわけねえだろ。

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

>>539で、「どうやって取得する?」って書いたのは、結局名前で取得することになるんじゃね?って意味で、名前でってのはApplication.Callerみたいに名前を取得したら結局同じじゃね?って意味なんだがw
2019/04/08(月) 22:36:44.56ID:lpvwS4NY
>>573
だから、それは対象のボタンオブジェクトが分かってる場合だろ
最初のお題と違ってボタンがいくつあるかも分からん条件で効率よくってはなし
俺はNameプロパティは変更出来るだろ
だからTypeプロパティだろって言っているだけ
2019/04/08(月) 23:06:03.11ID:AlMdksUV
質問者そっちのけ
2019/04/09(火) 00:18:47.52ID:8HUOoxmg
>>549はデバッグ時に疲れからかモジュールにカーソルをあわせてF5を押してしまう
2019/04/09(火) 00:44:23.79ID:cuTyECFJ
この中で一番重いのはShapes.Delete
それ以外をどんだけ工夫しても、逆にどんなタコなコーディングしても、体感できる差は出ないから
579デフォルトの名無しさん
垢版 |
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からお金を下ろせたり(キャッシュカード不要)便利なアプリですのでよろしければご利用下さい
2019/04/09(火) 06:47:19.14ID:WguqqX2K
>>576
>>488-489で解決してるからいいんじゃん
あとはよくあるチンケな知識でのマウント合戦だからスルーでオケ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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