X



Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
0002デフォルトの名無しさん (ワッチョイ 013d-drwQ)
垢版 |
2021/03/18(木) 22:33:41.83ID:e6JgDwDC0
教えて下さい。
あるシートに買物記録があり、日付や購入店、商品名や単価の他に、商品の分類という列があります。
その列には「文具」「食品」「書籍」等が入力されています。

VBAで以下の動作をさせたいです。
 ↓
別シートにあるダウンリストに、選択肢として、この商品分類に入力されている値を設定する。
重複して入力されている値は無視。入力されているすべての「分類」をひとつずつ選択肢にする。
 ↑
これをどう書けばいいのか、教えて下さい。
よろしくお願いいたします。
0005デフォルトの名無しさん (ワッチョイ 4901-gJ6t)
垢版 |
2021/03/19(金) 12:19:16.87ID:Rf8ZEH4N0
>>2
ワークシート関数でいいなら

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

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

処理を軽くする方法があればご教示願います
0013デフォルトの名無しさん (ワッチョイ 4901-gJ6t)
垢版 |
2021/03/20(土) 00:13:52.57ID:1HieLmil0
グラフ更新よりも関数で固まってる可能性の方が高いから、
一度全部の関数を削除してみて解決するか確認した方がいいと思う
自動計算切っててもピボット更新時に再計算されてる筈だし
0014デフォルトの名無しさん (アウアウウー Sa5d-/HWa)
垢版 |
2021/03/20(土) 01:01:30.93ID:7VltWvHha
>>13
ありがとうございます
ワークシート関数は使わず、計算は全部vbaでやっています
関数と言えるのはピボットグラフのグラフ部分だけです
ピボットグラフのグラフ部分の関数が重くなっている可能性が考えられるかも、と思いました
ありがとうございます
0022デフォルトの名無しさん
垢版 |
2021/03/21(日) 16:59:06.62
5chのスレで1000まで書き込まれたスレを1から1000までコピペしてsheet1に貼り付け
sheet1を特定のキーワードで検索して、書き込まれたレスと返信があったレスを抽出してsheet2に貼り付けしたいです
返信がない場合は空白と入力したいです
アイデアが思い付きません、宜しくお願いします
0028デフォルトの名無しさん (ワッチョイ 298e-GJb0)
垢版 |
2021/03/23(火) 14:45:46.64ID:KXdqd9JD0
ゆとりだから
0029デフォルトの名無しさん (ワッチョイ 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)を入れようとしてるのですがエラーになります
0031デフォルトの名無しさん (ワッチョイ 13ad-7MQm)
垢版 |
2021/03/23(火) 17:59:59.95ID:dulEqDGL0
チャートをセレクトしてるからセルのセレクトが外れてるんだよ
Addchartの時にセレクトじゃなくてオブジェクト変数にセットして
アクティブチャートの行を【変数名】.(以下略)にしてやってみ
変数にセットするときに文頭のSetを忘れないようにな
0032デフォルトの名無しさん (ワッチョイ 71fd-ED79)
垢版 |
2021/03/24(水) 18:47:39.00ID:7fnGaRlR0
エラー処理で On Error GoTo を On Err GoTo と書いていて
全く気付かずエラーになって初めて、ラベルに飛ばないので気づきました。
デバッグでは判定しないようですが、これらを事前にチェックで見つけることは
出来ないのですかね?
0033デフォルトの名無しさん (テテンテンテン MMeb-g1di)
垢版 |
2021/03/24(水) 19:49:11.93ID:SmPCs0wuM
ヤフーファイナンスの仕様が変わった?のか、
当該銘柄のページから
Set FR = rngResult.Find(What:="出来高*", LookAt:=xlWhole)
みたいな感じで出来高取得してたのが
できなくなった

どこを直せばいいのかわからん
もしかしてこのやり方では
取得できなくなった?
003529 (ワッチョイ 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 = ○○ とあとで系列名を変えるのが良いのでしょうか?
0037◆QZaw55cn4c (AU 0Hd3-RQYg)
垢版 |
2021/03/24(水) 21:05:50.71ID:N9nRIl9KH
>>32
インタプリタは事前に文法チェックをしないのが普通ですから、そういうのはインタプリタには無理でしょう‥‥
0038デフォルトの名無しさん (ワッチョイ b92f-6umI)
垢版 |
2021/03/24(水) 22:00:53.02ID:T3engiTo0
いまどき純粋なインタプリタなんてそうそうないけどな

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

なんかコード分析するようなツールでもあれば検出できるかもしれんが、まあ標準の範囲じゃ無理だな
004232 (ワッチョイ 71fd-ED79)
垢版 |
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
0044デフォルトの名無しさん (ブーイモ MM4d-7MQm)
垢版 |
2021/03/25(木) 12:19:36.16ID:v0lS7PpFM
個人的には、だけど最終的にはエラー停止が発生せずイレギュラーの場合は自らメッセージを出して処理を終了するってするのが望ましいんじゃないかなぁ
動作確認で何実行してるか知りたいだけなら各プロシージャの頭にDebug.Printでプロシージャ名吐き出しておけばどこで止まったかが分かりやすい
まぁDebug.Printって軽くはないから少し大きめのプログラムだと動作確認中は時間かかる感じになっちゃうだろうけど
0047デフォルトの名無しさん (JP 0H4d-4Ddi)
垢版 |
2021/03/25(木) 14:16:03.41ID:NGSCZFfJH
ちゃんとチェックしてればOn Errorの出番なんか滅多にないはずだけど
複数の関数でエラーが出るなんて、あきらかに設計がおかしい
0048デフォルトの名無しさん (ワッチョイ 134f-uqQH)
垢版 |
2021/03/25(木) 20:31:33.14ID:hvCMihey0
>>42
そうだね。VBAと言うかVB6系のは基本ベタ書きするしかない。
例外としてクラシックASPでVBS走らせたときはエラー行を表示させることが出来る。
VB.Netになるとその辺の情報は細やかに取得出来る。

VBAはベースが古い言語だから仕方がない。
0049デフォルトの名無しさん (ワッチョイ 134f-uqQH)
垢版 |
2021/03/25(木) 20:56:22.97ID:hvCMihey0
>>47
別に設計がおかしいと言うことはないよ。
これはVBAに限らず論理エラーで把握しきれないものは実行時エラーとして捕まえる仕組みは当然のように設定する場合がある。

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

その場合、当然データ復旧させるためにもどこでどんなことやろうとして落ちたのかの情報は重要になってくることが多い。
その他にも概ね実行時エラーは予期せず落ちるものの方が多いので
むしろ状況を把握するためにも細かい情報が必要になることの方が多いよ。
0051デフォルトの名無しさん (ワッチョイ 134f-uqQH)
垢版 |
2021/03/25(木) 22:07:43.24ID:hvCMihey0
>>50
.Netの環境が選択出来る状況ならそれでもいいんじゃないの?
.NetならException継承して好きにエラー設定すればいい。
けどここはあくまでEXCEL VBAのスレだからその話は置いておくよ。

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

だからもし後で保守するのが楽になるなら
場合によってはエラーメッセージ出しておしまいにすることもあるだろうけど
場合によってはエラーハンドリング用のクラス作ったり、
論理エラーもRaiseして実行時エラーのように処理して一元管理したり、
後始末処理をコールバックで移譲して処理したりすることも視野に入れるよ。
0052デフォルトの名無しさん (ワッチョイ b609-6iI7)
垢版 |
2021/03/26(金) 01:12:09.52ID:ZoYVceoP0
Date型はミリ秒を持てないのでしょうか?
エクセルシートでミリ秒まで表示できている時刻があって、そのシリアル値をVBAのDate型変数に代入するとミリ秒以下が丸められてしまいます
0053デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 01:52:58.20ID:YMBMwB0G0
>>52
時分秒までです。
0054デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 01:56:39.74ID:YMBMwB0G0
>>52
Date型に入れて何がしたかったのか?
0056デフォルトの名無しさん (ワッチョイ 924f-tqDZ)
垢版 |
2021/03/26(金) 08:07:23.35ID:3Vso6amb0
>>52
シリアル値で日付までが整数部で時間から小数点になるから小数点扱える型なのにミリ秒が扱えないと言うのが
ちょっと引っ掛かったので調べてみたよ。

方式はセルにミリ秒まで表示出来るフォーマットを設定して(yyyy/mm/dd hh:mm:ss.000)
隣のセルにその値を代入する数式を書いて、数値で小数点16桁くらい表示するようなフォーマットを設定して、
またその隣にそのセルの値を代入してセルにミリ秒まで表示するフォーマットのセルを用意して
元の値が正しく表示されるか確認した。

で、VBAで最初のセルの値をDATE型の変数に入れてDouble型に変換したら、
キチンと2番目のセルと同じ頭になることが確認出来たので、DATE型はミリ秒まで持てることが分かった。

じゃ、何で丸められちゃうの?
と言うことになると思うけど、どうやらこういうことらしい。
https://support.microsoft.com/ja-jp/topic/excel-ワークシートのセルに-vba-の日付形式またはバリアント型の日付形式を割り当てようとすると-ミリ秒が最も近い秒に丸められます-4a0af2c5-78de-762f-6431-8669890f585b
0057デフォルトの名無しさん (ワンミングク MM62-6iI7)
垢版 |
2021/03/26(金) 12:00:33.82ID:scqWQXi5M
>>53-56
ありがとうございます
勉強中でVBAの動きを理解したいだけで、何がしたいという訳ではないです

調べてみましたが以下の理解で合っていますか?
・シリアル値はDouble型の情報
・日付(Date型)はシリアル値の表示形式を"yyyy/mm/dd h:mm:ss"に変更しているイメージ
 内部ではミリ秒含むシリアル値を持っており、ミリ秒以下の情報が九められた訳ではない
・シリアル値とDate型はCDbl とCDateで相互変換可能。このときもミリ秒以下の情報は丸められない

・ミリ秒が丸められるのは、Date型をセルに=で代入したとき
 これは、Date型の表示をセルにコピーしているため
・セルにDate型でなくシリアル値を代入することで回避できる
0061デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 17:55:08.09ID:YMBMwB0G0
>>57
Excelの内部データ形式は突き詰めない方がいいよ。

それにセルの書式の組み合わせもあるから、初心者は気をつけてね。
0062デフォルトの名無しさん (ワンミングク MM62-6iI7)
垢版 |
2021/03/26(金) 18:28:35.59ID:scqWQXi5M
ありがとうございます
これ以上は突き詰めないようにします
ここまで解説してるサイトはほとんど見当たりませんでしたが、
Application.Waitの引数にVBAの関数を使うと何故精度が低くなるのか?など
ここまで理解して初めて分かることもあったので良かったです

ちなみに丸が九になったのはパソコンで打った文章をスマホで取り込んだからですね
0063デフォルトの名無しさん (ワッチョイ b18e-COrd)
垢版 |
2021/03/26(金) 20:17:02.94ID:9W175/Ms0
馬鹿は入力機器で漢字コードが決まると思っているのか
0064デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 20:24:40.81ID:YMBMwB0G0
漢字コードとは古臭いw
0065デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 20:27:23.31ID:YMBMwB0G0
JISコード時代の俗称だぞ。
0066デフォルトの名無しさん (ワッチョイ b18e-COrd)
垢版 |
2021/03/26(金) 20:58:19.29ID:9W175/Ms0
JISとかEBCDICとか古いこと自慢か?
0068デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/03/26(金) 23:45:57.50ID:YMBMwB0G0
漢字ROMの時代からやってきた過去の人
0069デフォルトの名無しさん (ワッチョイ 8101-lcsw)
垢版 |
2021/03/27(土) 20:27:21.67ID:5nK2M5CU0
質問させてください
worksheetfunctionでsumifやcountifを使用する際の範囲指定はrange(cells(),cells ())と指定する方がいいのか、cells ().resize()と指定する方がいいのか、どっちでしょう?
皆さんはどっちを使用していますか?
0070デフォルトの名無しさん (ワイーワ2 FF1a-j37g)
垢版 |
2021/03/27(土) 21:10:41.58ID:/5jOHbkqF
rangeは特殊だからはまりやすい。
0072デフォルトの名無しさん (ワッチョイ 8101-lcsw)
垢版 |
2021/03/27(土) 21:28:05.27ID:5nK2M5CU0
一般的な場合として、例えば最大行までの範囲とした場合はどうでしょうか?
初心者なので、最近、resizeを学んだばっかりなのですが、resizeの方がすっきりしてるような気がするけど、rangeの方がパッと見、分かりやすいよなぁと思いまして
0074デフォルトの名無しさん (ドコグロ MM9a-eYIm)
垢版 |
2021/03/27(土) 22:29:55.09ID:kX/HYgzKM
>>72
その程度ならお好みでどうぞ
値貼り付けとかやる場合は、range(cells(),cells ())なんか使ってられないから、Set、Offset、Rresizeの組み合わせを使っているな
0076デフォルトの名無しさん (ワッチョイ b163-VcSF)
垢版 |
2021/03/28(日) 12:09:35.83ID:gO7qo7Yf0
現在6秒に1回実行するマクロを組んでいるのですが、
複数のエクセルファイルを開いてそのマクロを実行すると、
マクロを実行しているファイルとは別のエクセルファイルを
マウス等で触ってアクティブにすると、関係のないそのエクセルファイルで
そのマクロが実行されて、肝心のマクロが肝心のファイルで実行されず、
エラーになるという現象で悩まされています。
例えば、ファイル名「A」、ファイル名「B」のエクセルファイルがあり、
ファイル名「A」の中にマクロでセルF1を6秒間隔で選択するコードがあると、
6秒間隔で更新している時にファイル名「B」を触ると(アクティブになる)、
ファイル名「B」のセルF1を選択してしまうのです。本来はファイル名「A」
で組んでいえるのでファイル名Aで実行されなければいけないのに。。。
ファイル名、シート名を指定して他のファイルでは実行できないようにコードを
入れてみたのですが治りません。どうすればよいのでしょうか?
ご教授お願いします。
0078デフォルトの名無しさん (ブーイモ MMd5-krmx)
垢版 |
2021/03/28(日) 12:53:44.04ID:vqLmoR8/M
面倒なのは分かるが意図しない動作をする時はF8で1ステップずつ挙動を確認したりデスクに適当な人形をおいてコードを1行1行何をしている行なのかを人形に対して声に出しながら説明すると原因を突き止めやすいぞ
0082デフォルトの名無しさん (ササクッテロル Sp79-tqDZ)
垢版 |
2021/03/28(日) 17:37:33.16ID:NPcBjbDnp
まーおそらく値の設定時に
ちゃんとどのブック、どのシートって
設定されていないんだろうけど
もっと気になるのは6秒というスパンの中で
処理が6秒を間に合わなかったらどうするのか
ちゃんと考えて作っていのかってことかな
大きなお世話かも知れんけど
0083デフォルトの名無しさん (ワッチョイ d2e6-WhAp)
垢版 |
2021/03/28(日) 18:29:23.67ID:vpNC6cf/0
セルの編集は6秒あれば楽勝です
0085デフォルトの名無しさん (ワッチョイ a2bd-9S/5)
垢版 |
2021/03/28(日) 20:31:26.17ID:y1jMexrp0
UIAutomationでInvokeをするVBAマクロをタスクスケジューラで
日次・定時に起動しているのですがロック画面ではInvokeが実行されません

解決策をご存知でしたらご教示お願いします
0089デフォルトの名無しさん (ワッチョイ 62ee-1mGO)
垢版 |
2021/03/30(火) 17:58:10.32ID:0EHjDb6N0
質問です

前はExcel2010の時はレジストリを維持って、VBAファイルだけはインスタンス起動が出来るようにするとか可能でしたが
2019にするとインスタンス起動ができなくなってました。
.xlsmファイルだけインスタンス起動するとか方法はないでしょうか
009176です。 (ワッチョイ b163-VcSF)
垢版 |
2021/03/31(水) 18:32:23.42ID:Evr26ox50
回答くださった皆さん本当に有難うございます。
これから回答いただいた対処法を全て1個1個試していこうと思います。
なお6秒に一回とは、エクセルのセルに株価をリアルタイムで
反映するソフトがあるのですが、それで株のアラート機能を
VBAで自作で作っているので必要なのです。
ではでは。
0092デフォルトの名無しさん
垢版 |
2021/03/31(水) 20:42:46.87
sheet1のA1には
https://www.jma.go.jp/英数字

A3からA10000には、それぞれ異なるURLが記載されています

B1には
https://maps.gsi.go.jp/index_m.htmlhttps://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.htmlhttps://www.jice.or.jp/knowledge/japan/commentary03
みたいなURLが繋がっている文字列があります

B2からB10000には、上の様なURLが繋がっている文字列があります

A1からA3は
https://www.jma.go.jp/英数字

B1
https://maps.gsi.go.jp/index_m.html

B2
https://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.html

B3
https://www.jice.or.jp/knowledge/japan/commentary03


みたいにB列にあるセル内を分解して、分解した分だけA列にA1の文字列を補う処理
以降B10000までを処理して
sheet2に記載したいのですが、どのようにすればよいでしょうか?
0094デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 00:43:47.27ID:Qm9pGYRd0
>>91
「エクセルのセルに株価をリアルタイムで
反映するソフトがある」

こんな珍味なソフトウェアがあるのかw
0095デフォルトの名無しさん (ワッチョイ b163-VcSF)
垢版 |
2021/04/01(木) 02:05:44.32ID:GioFRFH30
>>94
楽天RSS 岡三RSS。
因みに株は難しく甘い世界ではないので安易にやらないようにしましょう。
ほとんどの人が負けます。
0096デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 03:02:30.23ID:Qm9pGYRd0
変な外国人が作ったんだろうなあ
0099デフォルトの名無しさん (スフッ Sdb2-pdRJ)
垢版 |
2021/04/01(木) 10:48:06.97ID:jNbL4ETRd
ワークシートの一部を画像として保存する方法にChartObjectsのExportメソッドがあります
が、罫線が一部消えてしまったりフォントが潰れたりして、画質が悪いのが気に入りません
もっと高画質で範囲指定してスクショを保存する方法はないでしょうか?
0100デフォルトの名無しさん (ワッチョイ 6963-VcSF)
垢版 |
2021/04/01(木) 11:51:22.66ID:tUMm1OA70
>>99
クリップボードを手作業で切り取る際、エクセルの倍率
(Ctrl+マウススクロールで変えれるあれ)を100%よりも大きい高倍率で
切り取った方が画質が良い。
従って、その画像を取得するマクロの直前に、
エクセルの画面の大きさを変えれるコードがあるので、
それを直前に入れ、それを切り取れば恐らく高画質のが出来るんじゃないかな。
最後は勿論ばい倍率をもとに戻すマクロを入れれば良いと思う。
■ このスレッドは過去ログ倉庫に格納されています

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