Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 22:08:43.71ID:jtngtgXU0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part69
https://mevius.5ch.net/test/read.cgi/tech/1607786543/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2デフォルトの名無しさん (ワッチョイ 013d-drwQ)
垢版 |
2021/03/18(木) 22:33:41.83ID:e6JgDwDC0
教えて下さい。
あるシートに買物記録があり、日付や購入店、商品名や単価の他に、商品の分類という列があります。
その列には「文具」「食品」「書籍」等が入力されています。

VBAで以下の動作をさせたいです。
 ↓
別シートにあるダウンリストに、選択肢として、この商品分類に入力されている値を設定する。
重複して入力されている値は無視。入力されているすべての「分類」をひとつずつ選択肢にする。
 ↑
これをどう書けばいいのか、教えて下さい。
よろしくお願いいたします。
2021/03/19(金) 02:09:13.85ID:pQtJO8X70
関数でも分類列をMATCHで検索してRow()と不一致なら空白として、それを入力規則にすれば出来そう

VBAでやるなら連想配列使って重複弾いて、かな
2021/03/19(金) 12:08:42.44ID:Efxeclnea
>>2
もう少し個別にどの部分で詰まっているか書いた方がいいんじゃね
2021/03/19(金) 12:19:16.87ID:Rf8ZEH4N0
>>2
ワークシート関数でいいなら

適当なセルに
=UNIQUE(商品の分類が入力された列)
と入力すると重複整理された配列が入力される

プルダウンリストを作りたいセルを選択して「データの入力規則」を選択、
規則をリスト、ソースをさっき作った配列がある列にする
2021/03/19(金) 13:13:27.10ID:LUl3FuSJa
ピボットグラフのRefresh処理が重くて困ってます
汎用的な処理中に停止すべき項目(画面描画、自動計算、イベント、アラート等)は停止させています
元テーブルの行は100程度です

処理を軽くする方法があればご教示願います
2021/03/19(金) 20:19:38.16ID:TXt81ZmU0
>>6
ピボットテーブルの設定で「更新時に列幅を自動調整する」のチェックを外す
2021/03/19(金) 20:23:00.26ID:Rf8ZEH4N0
ググるとそれ出て来るけど、あんまり意味ないよ
って言いつつ効果あったら恥ずかしいけど
2021/03/19(金) 22:16:15.80ID:TXt81ZmU0
初心者にはそのくらいしか教えられん
2021/03/19(金) 22:28:12.63ID:ZGQ0wMm+a
>>7
ありがとうございます

ですが 処理が重くて困っているのはテーブル(ピボットテーブルではない)から作っているピボットグラフなのです

これが重かったりするんですかね…?
2021/03/19(金) 23:06:18.73ID:Rf8ZEH4N0
というか元々のグラフ生成が重いのかマクロが重いのか分からん
普通に更新ボタン押しても重いの?
2021/03/19(金) 23:55:25.74ID:tSoX9T0pa
>>11
普通に手動でも遅いです…
何かピボットグラフの設定によるものならとも思いますが…
2021/03/20(土) 00:13:52.57ID:1HieLmil0
グラフ更新よりも関数で固まってる可能性の方が高いから、
一度全部の関数を削除してみて解決するか確認した方がいいと思う
自動計算切っててもピボット更新時に再計算されてる筈だし
2021/03/20(土) 01:01:30.93ID:7VltWvHha
>>13
ありがとうございます
ワークシート関数は使わず、計算は全部vbaでやっています
関数と言えるのはピボットグラフのグラフ部分だけです
ピボットグラフのグラフ部分の関数が重くなっている可能性が考えられるかも、と思いました
ありがとうございます
2021/03/20(土) 04:43:36.06ID:kQoUW+sA0
すげえなワークシート関数一切使わんでマクロだけでやるとは
2021/03/20(土) 06:51:00.93ID:EyTYq69F0
遅いとか速いとか漠然としているので何秒かかっているかもわからんし
データ量やステップが増えればある程度遅くなるのは当然じゃね
2021/03/20(土) 07:28:18.81ID:/meO8w1y0
2〜3秒でも遅いと思う人もいるしね
2021/03/20(土) 10:08:34.03ID:D1FjuE5r0
VBA使ってんならどの部分でどんだけ時間かかってるか測定すりゃいいだけの話なのになぜしないんだろう
2021/03/20(土) 11:15:44.57ID:Awf5aTeqa
>>18
Refreshのところで3秒かかっています
他処理全部は0.5秒で終わります
2021/03/20(土) 20:35:40.01ID:EyTYq69F0
PCの性能が低いんじゃね
2021/03/20(土) 20:48:09.36ID:kQoUW+sA0
それだ!
パソコンのせい
ゲーミング用買えば全てにおいてスマホ級の速さだ!
2021/03/21(日) 16:59:06.62
5chのスレで1000まで書き込まれたスレを1から1000までコピペしてsheet1に貼り付け
sheet1を特定のキーワードで検索して、書き込まれたレスと返信があったレスを抽出してsheet2に貼り付けしたいです
返信がない場合は空白と入力したいです
アイデアが思い付きません、宜しくお願いします
2021/03/21(日) 17:54:39.86ID:fT/r6tJT0
いつもの
2021/03/21(日) 21:09:20.26ID:aZS3hsKq0
>>6
イベントやアラートって目的も無く停止しない方がいいと思うが
2021/03/22(月) 05:59:51.89ID:B7/s/yNjM
>>22
5chアフィ乙
2021/03/23(火) 06:37:42.10ID:3hKAtAlua
エクセルからhtmlで保存するとき
グラフが1000以上でもできますか
2021/03/23(火) 10:17:41.75ID:lizcePOK0
自分で作らずに質問してくる意味が解らない
28デフォルトの名無しさん (ワッチョイ 298e-GJb0)
垢版 |
2021/03/23(火) 14:45:46.64ID:KXdqd9JD0
ゆとりだから
29デフォルトの名無しさん (ワッチョイ 5190-U6ZO)
垢版 |
2021/03/23(火) 15:16:16.58ID:J1vTYXys0
選択した範囲をグラフにするマクロを作りたいです
マクロ記録でグラフ化するまでを記録し、それを改造してやっているのですが

' Macro1 Macro
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlRadar
ActiveChart.SetSourceData Source:=Range(左上:右下)
End Sub


「選択してる範囲を取得」してその範囲を代入する方法がよくわかりません

ActiveChart.SetSourceData Source:=Range(左上:右下)

のRangeの左上、右下部分にSelection(1)やSelection(Selection.Count)を入れようとしてるのですがエラーになります
2021/03/23(火) 17:44:03.01ID:XH4udpo7H
selectionだけでいいんじゃね
2021/03/23(火) 17:59:59.95ID:dulEqDGL0
チャートをセレクトしてるからセルのセレクトが外れてるんだよ
Addchartの時にセレクトじゃなくてオブジェクト変数にセットして
アクティブチャートの行を【変数名】.(以下略)にしてやってみ
変数にセットするときに文頭のSetを忘れないようにな
32デフォルトの名無しさん (ワッチョイ 71fd-ED79)
垢版 |
2021/03/24(水) 18:47:39.00ID:7fnGaRlR0
エラー処理で On Error GoTo を On Err GoTo と書いていて
全く気付かずエラーになって初めて、ラベルに飛ばないので気づきました。
デバッグでは判定しないようですが、これらを事前にチェックで見つけることは
出来ないのですかね?
2021/03/24(水) 19:49:11.93ID:SmPCs0wuM
ヤフーファイナンスの仕様が変わった?のか、
当該銘柄のページから
Set FR = rngResult.Find(What:="出来高*", LookAt:=xlWhole)
みたいな感じで出来高取得してたのが
できなくなった

どこを直せばいいのかわからん
もしかしてこのやり方では
取得できなくなった?
2021/03/24(水) 19:50:41.85ID:jjB0JAKeM
>>32
まともなコードならGoto文なんてたいしてないはずだからGoto検索して目視確認で良いんじゃね?
3529 (ワッチョイ 9990-oXDN)
垢版 |
2021/03/24(水) 20:04:27.24ID:lll8bKoA0
うまくいきました、ありがとうございました
もう一つ質問させてください

以下は↓の画像のようにデータを範囲選択し実行した場合、3項目ごとに3つのグラフを表示するマクロです
@https://i.imgur.com/qb9quh1.jpg

Sub Macro1()
' Macro1 Macro
Set CTop = Selection(1)
Set CLast = Selection(Selection.Count)

Dim i As Integer
For i = 0 To 2
y = i * 3
With ActiveSheet.Shapes.AddChart.Chart
.ChartType = xlRadar
.SetSourceData Source:=Range(CTop.Offset(0, y), CLast.Offset(0, y))
End With
Next i
End Sub
ただ、データに問題があり、「行9」以降の部分を抜き出してグラフを作りたいんです
そこで↓のように範囲選択をして実行したのですが、系列名が出ないのでどのデータかわかりにくいんですよね
Ahttps://i.imgur.com/u2vrDOl.jpg

実際のデータは膨大なため、いちいち「行○○〜行○○まで」と数値で指定するのは難しいです
できればA画像のように手動で範囲選択した場合、@のようにa,b,cと系列名が出るのが理想です
.SetSourceData Source:=Range(○○) の部分をうまく変更すればいいのか、それとも
.SeriesCollection(1).Name = ○○ とあとで系列名を変えるのが良いのでしょうか?
2021/03/24(水) 20:32:05.20ID:HXzqnMHf0
個人的には系列名変える方が好き
2021/03/24(水) 21:05:50.71ID:N9nRIl9KH
>>32
インタプリタは事前に文法チェックをしないのが普通ですから、そういうのはインタプリタには無理でしょう‥‥
2021/03/24(水) 22:00:53.02ID:T3engiTo0
いまどき純粋なインタプリタなんてそうそうないけどな

一応VBAは事前にコンパイルチェックできるが、>>32
On 変数 GoTo xxっていう文法があってそれにそっているからエラーにならない
そして変数宣言を強制しても、Errって組み込みオブジェクトが宣言なしで使えるという罠

なんかコード分析するようなツールでもあれば検出できるかもしれんが、まあ標準の範囲じゃ無理だな
2021/03/24(水) 22:54:43.12ID:/MIQ1K/L0
>>35
元データと選択された表示用データを別にすればいいんじゃね
2021/03/25(木) 01:08:37.06ID:QAr0K9ya0
いきなりアホになってコード組むのが劇遅くなりました。
きれいなコードを書こうと思ったんです。
2021/03/25(木) 04:40:02.78ID:d+5Eu7Qca
思っただけにしとけ
2021/03/25(木) 10:21:24.54ID:Btw5OylJ0
ありがとうございました。
自分で注意深くやるしかないんですね

実行中のfunction(やsub)名を取得することは可能でしょうか?
やりたいことはエラー処理時にその名称を表示したいのですが
べた書きするしかないですかね


Public Function test() As String

On Error testErr

testErrr:
MsgBox "testErr" & vbCrLf & "エラー番号:" & Err.Number & vbCrLf & "エラー内容:" & Err.Description, vbExclamation
End Function
2021/03/25(木) 10:44:00.77ID:kL+lpreE0
あくまで個人的だが

MsgBox "○○で異常が発生しました." & vbCrLf & "Err:" & Err.Number & " " & Err.Description, vbExclamation, "Function test"
2021/03/25(木) 12:19:36.16ID:v0lS7PpFM
個人的には、だけど最終的にはエラー停止が発生せずイレギュラーの場合は自らメッセージを出して処理を終了するってするのが望ましいんじゃないかなぁ
動作確認で何実行してるか知りたいだけなら各プロシージャの頭にDebug.Printでプロシージャ名吐き出しておけばどこで止まったかが分かりやすい
まぁDebug.Printって軽くはないから少し大きめのプログラムだと動作確認中は時間かかる感じになっちゃうだろうけど
2021/03/25(木) 13:26:17.29ID:kL+lpreE0
確かにそうだ、異常が出ないで済むように入力データのチェックとか
ファイルの有無とかを先に確認すればエラーなんか滅多に起きないからな
2021/03/25(木) 13:41:18.71ID:Btw5OylJ0
>>45
勿論そういうチェックは入れていますよ
2021/03/25(木) 14:16:03.41ID:NGSCZFfJH
ちゃんとチェックしてればOn Errorの出番なんか滅多にないはずだけど
複数の関数でエラーが出るなんて、あきらかに設計がおかしい
2021/03/25(木) 20:31:33.14ID:hvCMihey0
>>42
そうだね。VBAと言うかVB6系のは基本ベタ書きするしかない。
例外としてクラシックASPでVBS走らせたときはエラー行を表示させることが出来る。
VB.Netになるとその辺の情報は細やかに取得出来る。

VBAはベースが古い言語だから仕方がない。
2021/03/25(木) 20:56:22.97ID:hvCMihey0
>>47
別に設計がおかしいと言うことはないよ。
これはVBAに限らず論理エラーで把握しきれないものは実行時エラーとして捕まえる仕組みは当然のように設定する場合がある。

例えばDBに繋ぎに行って繋がったけどその後で何らかしらの外部的要因で切断された場合など、
実行時エラーが発生するのでその場合は何度か再接続を試みてダメだったら初めてエラーとしてポップアップするとか。

その場合、当然データ復旧させるためにもどこでどんなことやろうとして落ちたのかの情報は重要になってくることが多い。
その他にも概ね実行時エラーは予期せず落ちるものの方が多いので
むしろ状況を把握するためにも細かい情報が必要になることの方が多いよ。
2021/03/25(木) 21:30:34.23ID:NGSCZFfJH
それってVBAでやるようなことか?
例外処理が必要とわかってるなら.netで書いてTry Catchを使うべきだと思うが
2021/03/25(木) 22:07:43.24ID:hvCMihey0
>>50
.Netの環境が選択出来る状況ならそれでもいいんじゃないの?
.NetならException継承して好きにエラー設定すればいい。
けどここはあくまでEXCEL VBAのスレだからその話は置いておくよ。

後、VBAでやることかどうかと言うのはあくまで俺はだけど正直あまり選択基準にないな。
第一に要件を満たしているか、次に操作や保守がし易いかかな。まぁ、納期も重要な要素にはなるけど。

だからもし後で保守するのが楽になるなら
場合によってはエラーメッセージ出しておしまいにすることもあるだろうけど
場合によってはエラーハンドリング用のクラス作ったり、
論理エラーもRaiseして実行時エラーのように処理して一元管理したり、
後始末処理をコールバックで移譲して処理したりすることも視野に入れるよ。
2021/03/26(金) 01:12:09.52ID:ZoYVceoP0
Date型はミリ秒を持てないのでしょうか?
エクセルシートでミリ秒まで表示できている時刻があって、そのシリアル値をVBAのDate型変数に代入するとミリ秒以下が丸められてしまいます
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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