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/04(木) 11:27:09.76ID:uGh4IPkF
値が存在するか確認してからvlookupでもOK
2019/04/04(木) 12:16:12.36ID:8+vU6A6d
>>427
基本的にgo toの 行先はループ内だな
で、正常の場合はそのルーチン内で飛ばす、また共通で使用できる部分はそのまま使う
それぞれ複雑になる場合は、外部呼出しで処理
2019/04/04(木) 12:40:19.97ID:aPtbQ2yh
簡易だけどこんな風でよろしいか。

On Error Resume Next
For i=0 To lngRW
varValue=WorksheetFunction.Vlookup(〜)
If Err.Number=(見つからない) Then
'B処理
Err.Clear
ElseIf Err.Number=0 Then
'A処理
Else
Debug.Print "想定外:" & vbCrLf & Err.Description
EndIf
Next i
On Error Goto 0
2019/04/04(木) 13:14:42.92ID:iClvVPMc
こうじゃないの

On Error Goto err
For i=0 To lngRW
varValue=WorksheetFunction.Vlookup(〜)
'処理
err:
Next i
2019/04/04(木) 13:23:37.46ID:8+vU6A6d
>>431
一般的に書くと以下だけど、処理は複雑なら外部ファンクションで

On Error Goto err
For i=0 To lngRW
varValue=WorksheetFunction.Vlookup(〜)
[正常処理]
Goto 共通
err:
[err処理]
共通:
[共通の処理]
Next i
2019/04/04(木) 13:50:38.20ID:iClvVPMc
>>432
あぁそうか、その形だスマン

エラー番号を見たり外したりで分岐させる方法が合ったと思うけど、
あれってどうなのかな
2019/04/04(木) 14:26:57.06ID:omgcYFOR
Dim Rc As Variant

For I = 1 To 10
Rc = Application.VLookup(〜)
If IsError(Rc) Then
  'B処理
  Debug.Print "Err"
Else
  'A処理
  Debug.Print Rc
End If
Next
2019/04/04(木) 16:38:45.71ID:wsHiflUt
If Err = *** Then
2019/04/04(木) 16:56:03.91ID:iClvVPMc
このエラーって何が返ってきてるの?
Rc = Application.VLookup(1, Range("a1:b2"), 2, 0)
Rcには「エラー2042」
variant/error
となっている
エラーオブジェクト?
2019/04/04(木) 17:24:54.95ID:w4m8dn6a
Debug.Print WorksheetFunction.IsNA(Rc)
2019/04/04(木) 17:32:46.09ID:omgcYFOR
>>436
VBA CVErr 関数
https://www.tipsfound.com/vba/05cverr

2042 #N/A
2019/04/04(木) 18:04:33.36ID:iClvVPMc
>>437


>>438
errorってオブジェクト?
なんでsetせずに代入できるんだ?
2019/04/04(木) 19:42:12.58ID:l+wxMf4P
on error使うのあまり良くない
vlookupの前にcountやfindで存在チェックするのをおすすめするよ
裏技的な方法だとAppllication.Vlooiup
2019/04/04(木) 19:42:34.71ID:l+wxMf4P
Application.Vlookup
2019/04/04(木) 19:50:28.21ID:iClvVPMc
それが彼の最後の言葉だった
2019/04/05(金) 03:50:15.90ID:+zVmy7gp
>>439
宣言済みのグローバルオブジェクトだから
2019/04/05(金) 08:49:34.62ID:zlWiWORW
>>443
ありがとう!そんなんあったのか
2019/04/05(金) 09:38:24.06ID:8QX00BOt
なんでマクロを表から実行する機能がボタンしかないんですか!
ボタンだけ画像で気持ち悪い
2019/04/05(金) 09:43:10.12ID:zlWiWORW
>>445
alt+f8
2019/04/05(金) 10:33:41.98ID:wkkyQZMO
>>445
セルのクリックで選択が変わったイベントを取るとか
他にもできるけど、単に知らないだけだろ
2019/04/05(金) 10:44:09.79ID:wkkyQZMO
>>442
悪い奴じゃなさそうだが、残念だったな
所詮、何でも道具なんだから目的に合わせて
臨機応変に対応しないとな
2019/04/05(金) 10:53:42.85ID:wkkyQZMO
>>445
そういえば、聞き漏らしたけど
>ボタンだけ画像で気持ち悪い
これ意味が分からない
例えば表に更新ボタンがあるのが気持ち悪いか?
2019/04/05(金) 11:15:00.27ID:sYZm3T+e
>>445
セル内に任意の Sub を走らせるコマンドを書きたいということかな?
2019/04/05(金) 11:16:44.20ID:zNcs0aE9
ボタンを透明にして、セルをクリックしたように見せかければいい
2019/04/05(金) 11:28:07.60ID:sYZm3T+e
>>451
それは見方によっては罠なのでは?
2019/04/05(金) 11:31:39.64ID:wkkyQZMO
>>451
例えば以下でいい、透明なボタンなんてメンテナンスしにくい
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
「セルA1を選択された時の処理」
End If
End Sub
2019/04/05(金) 12:16:59.99ID:VsjxKRtT
>>445
何を言ってるんだ?
標準モジュールに以下を書いて、
セル内に=FuncNibai(2)と入れてみろ。

Public Function FuncNibai(lngNum As Long) As Long
FuncNibai=2*lngNum
End Function
2019/04/05(金) 12:20:44.27ID:sYZm3T+e
>>454
それでは基本的にシートに対する副作用のない動作しかできないよ
2019/04/05(金) 12:31:55.05ID:VsjxKRtT
>>455
ボタンから実行していないだろ。
表を変えたいというなら、入力したセルと無関係のセルの値を変更する処理も書ける。
そんなことする奴はおらんだろうが。

そもそも>>455がどうしたいのかが無いから、どうにもならん。
個人的には、リボンから実行するように作ることが多いけど。
2019/04/05(金) 12:42:46.47ID:wkkyQZMO
>>456
落ち着けよ、445の釣りかもしれんし
2019/04/05(金) 12:51:21.11ID:wkkyQZMO
>>456
基本的に、新規関数の定義だから
それ以外のことをするのは、混乱の元だよね
2019/04/05(金) 13:41:00.30ID:8QX00BOt
イベントでマクロ起動できるようになりました。ありがとうございます!
ハイパーリンクのイベント使いました。

でも
イベントはシート単位でマクロ側で呼び出し元特定する仕組みで
間違えるの怖いしシート全体でマクロ走るし
ハイパーリンクは自分のセル位置変わっちゃうし
余計気持ち悪くなりました

ハイパーリンクに直接マクロ指定したりとか
もっとスパッと間違えない仕組みがないものでしょうか
2019/04/05(金) 13:44:20.23ID:zlWiWORW
>>459
何がしたいのかもう少し具体的に言ってくれれば誰かがマクロ書くと思う
>シート全体でマクロ走るし
これも以下のような形で、特定のセルだけマクロが走るように制御することも可能

Private Sub Worksheet_Change(ByVal Target As Range)
行 = Target.Row
列 = Target.Column
If 行 < 4 And 行 > 2 And 列 = 2 Then
'処理
End If
End Sub
2019/04/05(金) 13:58:27.50ID:Rd0uwYXo
>>459
スレタイ読めない馬鹿は死ね
2019/04/05(金) 14:03:08.75ID:wkkyQZMO
>>459
そんなの選択したセルがハイパーリンクか判断すればいいだけ
要求を書かないから特定のセルで動くマクロを提示しただけ
その前に
>ボタンだけ画像で気持ち悪い
これ意味が分からない
2019/04/05(金) 14:40:23.82ID:8QX00BOt
ボタンはクリックしただけで手が滑って意図せずずれちゃったり
配置した後ろにカーソルが隠れちゃったりするから
なんか異物感があります
2019/04/05(金) 15:16:00.65ID:wkkyQZMO
>>463
そうか、理由はよくわからんがハイパーリンク化は
selection.hyperlinks.count
または
Range.hyperlinks.count
で取れるんでないの試してない
2019/04/05(金) 16:03:40.10ID:3Irv2J+y
>>459
>ハイパーリンクに直接マクロ指定したりとか

ハイパーリンクのクリックでマクロを実行する
http://www.excel-wing.com/study/jitumu/941
2019/04/05(金) 16:21:20.23ID:wkkyQZMO
>>465
俺もこのほうが良いと思う確認してないけど
2019/04/05(金) 16:25:16.09ID:wkkyQZMO
まあ、どうやっても出来ないと書き込むんじゃなくて
何をどうしたいけど方法を聞けよ、できるだけ自分の求めることを
詳しく
2019/04/05(金) 16:38:12.77ID:33lL/zae
スライサーのボタンクリックをイベントとしてマクロを実行させたいんだけど、
ググっても探し方が悪いのか、「スライサーを作成するVBA」ばかりになってしまう。

どこか事例を解説しているWebページを紹介してもらえませんか?
2019/04/05(金) 16:41:10.23ID:ANboNrW/
>>468
スレタイ読めない馬鹿は死ね
2019/04/05(金) 16:50:23.23ID:n8EBNbBD
ピボットテーブルのスライサーの事じゃないの?
別にスレチでもなんでもないと思うけど
2019/04/05(金) 17:16:27.60ID:33lL/zae
>>470
はい、そうです。
2019/04/05(金) 17:26:04.18ID:n8EBNbBD
>>471
スライサーにイベントハンドルかます事はできないっぽい
以下2つのどっちかになると思う

Private Sub Worksheet_PivotTableChangeSync(ByVal Target As PivotTable)
Debug.Print Cells(4, 1)
End Sub

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Debug.Print Cells(4, 1)
End Sub

https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.pivottablechangesync
https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.pivottableupdate
2019/04/05(金) 17:41:45.84ID:33lL/zae
>>472
ありがとうございます。
ピボットテーブル本体まで戻れば
変更イベントハンドルがあるのですね。
この方向でやってみます。
2019/04/05(金) 18:17:05.73ID:sYZm3T+e
>>456
えっ?
副作用のある操作もできるのか??
2019/04/05(金) 20:04:21.22ID:USfI2aKm
>>459
特定のセルクリックしたらマクロ実行とか
476459
垢版 |
2019/04/05(金) 20:52:19.13ID:CiB89diH
いろいろやってみましたが
表をいじって位置が変わっちゃうと動かなくなったり、
変なリンクできたりするので
ボタンでやります…

ボタンをセルに合わせて自動調整されるようにプロパティ設定したら
ちょっと気持ちがおちつきました

ありがとうございます
2019/04/05(金) 21:55:09.13ID:XQoFwJNv
♪かけ違えたボタンがある〜
2019/04/05(金) 22:38:48.78ID:XcJw5BB8
>>474
2019/04/06(土) 02:33:50.43ID:lkbCtinH
主作用でなければ副作用だが
480デフォルトの名無しさん
垢版 |
2019/04/06(土) 05:07:20.11ID:yAC/mUJI
ヒポリットテーブルってややこしい。
理解するこつあはありますか?
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
具体的に提示できないのですか(笑)
必死でググったか(笑)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。