Excel VBA 質問スレ Part69

■ このスレッドは過去ログ倉庫に格納されています
2020/12/13(日) 00:22:23.67ID:Fd224klc0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける

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

※前スレ
Excel VBA 質問スレ Part68
https://mevius.5ch.net/test/read.cgi/tech/1598756127/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/12/29(火) 23:51:56.35ID:xvN7YPpo0
>>78
わからぬ。ホムペとかに時々セミナーの写真とか載ってるからそれを見て判断
性格まで瓜二つだからすぐわかるぜw
2020/12/30(水) 01:27:15.02ID:RXqudRq00
俺も前になんかの質問したときにいつものアイツって言われた事があったから逆になんでもかんでもいつものアイツって言いたがる荒らしが常駐してるもんだと思ってた
2020/12/30(水) 01:52:55.19ID:Oh92F1JH0
シートを開くと「オブジェクトが必要です。」だの「メソッドまたはデータメンバが見つかりません。」だのと表示されるんですけど、特に修正することもなく動作している(ように見える)んですけど、これ何が悪いんですかね?
2020/12/30(水) 03:31:25.87ID:AqLm+Pp2M
PERSONALに余計な書き込みしちまっつてるんじゃね。
再表示させて全部消すんだ。
2020/12/30(水) 03:53:07.20ID:Oh92F1JH0
Personal.xlsですかね?
探しましたがそもそもファイル自体存在しないみたいです……
2020/12/30(水) 03:58:33.29ID:Oh92F1JH0
なんかよく分かんないんですけどエラー行で指定してたコンボボックスを消して再設置したら直りました
助言ありがとうございました
2020/12/30(水) 05:38:22.32ID:AqLm+Pp2M
毎回コンボボックス言ってるなあんた
2020/12/30(水) 05:47:42.87ID:Oh92F1JH0
なんかコンボボックスってクセ強くないですか?
すごく弄りにくくてややこしいです
2020/12/30(水) 08:41:09.68ID:mfFqR3/N0
クセ強いって言うか、1クリックで2回イベント発動するのがなぁ・・
いちいちIf Flag Then Exit Sub とかいれて、
無理矢理1回しか動かないようにしてるけど、
他にいい方法ないもんかね
2020/12/30(水) 08:43:56.99ID:mfFqR3/N0
あ、直前に Flag = Not Flag な
2020/12/30(水) 11:23:33.25ID:hFnpG/QKH
>>173
イベントハンドラは必ず先頭でEnableEvents=Falseするんだよ
そして時間のかかる処理はハンドラの中へ書かずに別プロシージャに飛ばす
2020/12/30(水) 13:02:57.82ID:mfFqR3/N0
>>175
ごめん、1クリックで2回じゃなくて、
選択肢の表示で1回、選択で1回で計2回の間違い
なのでイベントOFFで逃げられない
2020/12/30(水) 16:14:15.56ID:8iwO+LiN0
状態管理用のフラグ作って管理している
2020/12/30(水) 23:59:22.86ID:Oh92F1JH0
>>173
マジすか
もしかしてDropButtonClickイベントに.Clearと.AddItemを入れたら選択してもボックス内に表示されなかったりするのって原因それですかね
2020/12/31(木) 08:04:03.76ID:qAEGulJg0
>>178
そういうの作りながら動作確認しないの?
2020/12/31(木) 08:17:09.79ID:sAh4R5unH
ネットにサンプルがいくらでも転がってんだから、素直にコピペしとけばいいのに
2020/12/31(木) 08:39:17.53ID:5hauEQny0
直ぐにネットの野良コードを見て何も考えずにコピペコピペする人は決して【上級者】ではありません!(キリ
2020/12/31(木) 10:43:23.83ID:yfYCC+Dx0
>>178
多分そう

>>179
最初はそんな罠があると思わないからな
俺は、間にMsgBox入れたら2回出たのでやっと気づいたわ
2020/12/31(木) 10:53:25.38ID:8vAoqqdn0
罠なんてのは理解してる人間が陥るものであってただの知識不足には何の関係もない
想定の動きしなかったら一つ一つ確認するのは最低限のことだ
2020/12/31(木) 11:11:12.57ID:sAh4R5unH
プログラムは決して思った通りには動かず、書いた通りにしか動かない
思った通りに動かない時、それは思った通りに書けてない時
2020/12/31(木) 11:33:07.51ID:yfYCC+Dx0
いや、Windows Update直後に動かなくなるとか普通にあるから

あとVBSだが、最近InputBoxで第1引数の文字が出ないことがある
どこかのファイルから文字を読み込んでるとかじゃなく、
引数に直接指定してるのに
起動しなおすと出るから間違ってはいない
2021/01/01(金) 09:42:29.21ID:Sutdgdij0
間違っているのではなく見落としているんじゃね
2021/01/01(金) 17:08:38.32ID:PXRj0cmP0
そりゃPGの動作ってのは環境含めてだからな
2021/01/02(土) 20:54:06.70ID:gYfsTimq0
不具合がわかっていて放置できるとかうらやましいな
2021/01/04(月) 03:24:12.12ID:SOcZuJtz0
>>125
検索結果はARTICLEタグの1番目から3番目迄(0番目は検索結果とは違うものに使用されてる。)。
その下のクラス名LawDownloadの下にクラス名pdfFileが幾つか見つかるが、その直ぐ下にAタグにhref=で始まるURLが見つかる。

どれもGetElements系で取得出来る。
最後はURLDownloadToFile使えば良いんじゃね?
190デフォルトの名無しさん (ワッチョイ 41ad-qBFf)
垢版 |
2021/01/04(月) 16:03:39.37ID:P/FS/eNz0
バッチでデスクトップを再起動する人もあまりいないと思うが
デスクトップを再起動するプロシージャ内でExcelをQuitすると、Excelが勝手に再起動する
という現象が起きるので一応報告しとくね

環境によるかも
最初からWin10のPCで、Excel2019
(Win8からのアプデPCで、Excel2013では起きなかったかも)

デスクトップを再起動するコマンドを実行してるのはShell関数
Shell関数は非同期のはずだが、その同一プロシージャ内では、APIのSleepで5秒待っても駄目
DoEventsも駄目
そのプロシージャを一旦抜けて、タイマーで5秒後にQuitを実行すればExcelが再起動しない

デスクトップを再起動するのは、とあるツールの強制終了で残るタスクバーアイコンをクリアするためで
そんな用事のある人も滅多にいないだろうけど(クリアしなくても問題があるわけでもないし)
191デフォルトの名無しさん (ワッチョイ 41ad-qBFf)
垢版 |
2021/01/04(月) 16:52:13.02ID:P/FS/eNz0
Access VBAに比べるとExcel VBAは随分安定してるが
それでもゴリゴリ開発を繰り返すと、謎の実行エラーは起きるよね
ソースを全部エクスポートしてインポートし直すと直るやつ
結構有名なはずだが
謎は実在するのにないと言い張るのは、経験不足なだけ

話題の動作を確認したわけじゃないがね
2021/01/04(月) 18:20:52.45ID:WAisD+UGM
あまり何もかもをまとめて処理するのはリスキー過ぎる
小分けにして段階を踏め
2021/01/04(月) 21:23:02.41ID:XJuzf2wY0
VDI環境でメモリ4ギガしか振られてないんだけど、グローバル変数を4つくらい作るとメモリ不足エラーが出て不安定になります。
割り当てるメモリを増やせばエラー収まりますか?
2021/01/07(木) 11:25:47.54ID:vMxmEGnU0
質問というか相談です
フォーム上のテキストボックスを右クリックした時、元の背景色が通常色の場合は黄色に、黄色の場合は通常色にと切替を行い、塗り潰しチェックの様な事が出来るようにした物を作りたいです
なのでMouseDown若しくはMouseUpで拾ってButton=2の場合に、テキストボックスの背景色を切り替える方向で行こうと考えました
MouseDownは1度のクリックで2度処理を行ってしまう為、MouseUPを使用しようと思いましたが、
正直押した瞬間ではなく離した時点なのが至極個人的に違和感バリバリなのでMouseDownでどうにか処理できないかと考えています
その場合、静的変数を用いて2回目かどうかの判定を行うのが良いのでしょうか
2021/01/07(木) 12:14:22.04ID:lqyAMCWOM
Timerで1秒以内の2回目は止めたら
2021/01/07(木) 13:06:20.76ID:LEN4uLCLd
for eachでフィルターがかけられた列をコレクションし、現在のセルと一つ下のセルの値を比較しようと思ったのですが、offsetだと隠れた行の数値が参照されてしまいます。
フィルタリングして可視状態の一つ下のセルを参照するには、どうすればよいのでしょうか。
197デフォルトの名無しさん (ラクッペペ MM26-9Wmm)
垢版 |
2021/01/07(木) 15:55:15.71ID:JVCs6nJOM
無理だな
一つ上のを覚えといて比較しな
2021/01/07(木) 17:04:40.85ID:lqyAMCWOM
該当セルから下方向に、
VidibleがTrueなセルに当たるまで探せば
2021/01/07(木) 20:16:51.59ID:GNpPPMMj0
>>194
マウス離した時に実行するのがExcelに限らず一般的な動作だと思うが
2021/01/07(木) 23:26:20.22ID:q8h4Rq+X0
確かに
↓\→ 弱ボタン離す、でも波動拳出るな
2021/01/07(木) 23:51:53.97ID:CAJlIzxl0
はどうけんてなんですか
2021/01/07(木) 23:59:30.52ID:GNpPPMMj0
イギリスのロックバンドのことです
203デフォルトの名無しさん (アウアウウー Saa3-AlJ8)
垢版 |
2021/01/08(金) 07:36:54.65ID:/1SPkI99a
行とか列のデータのある範囲を選択するメソッドありますか?
currentregionの1行だけみたいなイメージで
今思いつくのは無理くり
Range("C5").CurrentRegion.Offset(略).Resize(略〜
ないしは
Endとかで割り出してから選択する
とかなんですが
なんかもう少しスマートな書き方があれば知りたいです
204デフォルトの名無しさん (アウアウウー Saa3-AlJ8)
垢版 |
2021/01/08(金) 07:38:15.90ID:/1SPkI99a
説明捕捉
>>203
の表の列はAからD以上まである感じです
2021/01/08(金) 08:45:53.52ID:F7dsXzNTM
columnsとかrowsプロパティで範囲から希望の列や行を取り出すじゃ駄目なの?
206デフォルトの名無しさん (アウアウウー Saa3-AlJ8)
垢版 |
2021/01/08(金) 09:53:03.11ID:/1SPkI99a
>>205
いや、rowsだと行全体が選ばれてしまうので

例えば
1行目は4列
2行目は5列
とデータの入っている列数がバラバラな場合
(値は全て入っているものとして)
それぞれ4列とか5列分ぴったりに選ぶメソッドは無いものかと
C列基準とかで選べたら一番いいけど
A1選んで「ctrl+shift+→」と同じ結果でもいいです
207デフォルトの名無しさん (アウアウウー Saa3-AlJ8)
垢版 |
2021/01/08(金) 10:06:49.06ID:/1SPkI99a
すみません
>>205
のヒントで自己解決しました

Range("C5").EntireRow.SpecialCells(引数)
でいけました
失礼しました
2021/01/08(金) 10:12:04.47ID:0GZaxWieH
>>206
一発で求めるメソッドやプロパティはない
たとえば3行目だけ選択だと、たぶんこれが最短
Range([A3], [A3].End(xlToRight)).Select
209デフォルトの名無しさん (アウアウウー Saa3-AlJ8)
垢版 |
2021/01/08(金) 10:18:16.84ID:/1SPkI99a
>>208
ありがとうございます
やっぱり1発ではないんですね
自分が書いたspecialcellも定数と数式とが混在してると
やはりUnionで繋ぐなどしかないので
煩雑になるなあと思っていたので
その書き方の方が良さそうですね
2021/01/09(土) 19:33:14.89ID:tpxthpMW0
Dirコマンド、
コマンドプロンプトに直書きだとローカルもネットワークも取れるのに、
VBAからWSHで取ると、ローカルしか取れないのは何故?
2021/01/09(土) 22:38:35.27ID:sDO7vtGda
理由は知らないけど、コマンドプロンプトのDIRコマンドと、VBAのDir関数は別物です
2021/01/09(土) 22:40:13.80ID:sDO7vtGda
あ、失礼いたしました
VBAのDirでなく、スクリプト経由なのか
1つ前のレスは撤回します
2021/01/10(日) 01:05:09.81ID:kg6XuktW0
>>210
まあユーザ認証回りだとおもうけど
ちょっとコード晒してみて
2021/01/10(日) 01:13:14.86ID:4Xu9louP0
>>213
これそのまま
http://officetanaka.net/excel/vba/tips/tips27.htm

sCmd = "dir [ローカル]" だとOKで、
sCmd = "dir [ネットワーク]" だと取れない
Len(Result)で調べると0文字になってる

コマンドプロンプトでやると取れるから、打ち間違いじゃないと思うんだけど
2021/01/10(日) 01:40:53.81ID:bwHYpHvWH
>>214
手動でコマンドプロンプトからネットが見えるか再確認した?
Windows Updateするとファイル共有が勝手にoffにされることがけっこうあるよ
2021/01/10(日) 02:36:39.33ID:CEBDD+E50
>>215
そんなことねーよ
死ね
2021/01/10(日) 08:23:59.20ID:4Xu9louP0
>>215
確認した
\\ネットワークにChr(34)入れて"\\ネットワーク"にしてもダメ
         (↑半角だと書き込めない)
2021/01/10(日) 08:51:06.81ID:kg6XuktW0
>>214
[ネットワーク]の指定方法正しいか?
\\サーバ\共有名 でないと、\\サーバ だけではだめだぞ

手元で試したけど、うちではUNCパスでもネットワークドライブでもちゃんと動いた
ただし、パスワードは事前に保存済み
パスワード保存してないリソースはテストしてない
2021/01/10(日) 09:02:01.60ID:qJ1NhQml0
ネットワークパス使ってファイルアクセス可能かまず調べる
2021/01/10(日) 09:03:56.67ID:4Xu9louP0
>>218
\\サーバ\共有名って、\\サーバ\共有されてるフォルダ名?
それなら合ってる
ちなみに\\アドレスの数字\共有されてるフォルダ名ってのも試した
パスワードは、エクスプローラーから開くときにパスワード入れなくていい状態になってるから、
保存済だと思う
2021/01/10(日) 11:56:30.27ID:bwHYpHvWH
うちではサンプルのままで問題なく共有フォルダのファイル一覧が出るからWSHのせいではないと思う
エラーコードやエラーメッセージは何も出てない?
Windowsのシェルを置き換えるとか、何かマニアックなカスタマイズしてる?
2021/01/10(日) 12:45:12.99ID:4Xu9louP0
>>221
いや、サンプルのC:\"を\\〜に変えただけ
エラーも何もなく0文字で返ってくる
強いて言えば、試したのがVPN環境
後でVPNなしでどうなるか試してみるけど
2021/01/10(日) 14:01:53.42ID:bwHYpHvWH
>>222
ホスト側のOSはWindows?双方にSMBは間違いなくフルセットで入れてある?
2021/01/10(日) 16:37:15.38ID:4Xu9louP0
>>223
Windows
SMBがどうとかは、IT部門じゃないからわからない(会社の)
2021/01/10(日) 17:55:38.15ID:kg6XuktW0
エラー(メッセージ)が出てないのはたぶん標準出力しかひらってないから
標準エラー出力になんか出てると思われ
2021/01/10(日) 18:05:33.95ID:kg6XuktW0
つかここまでしてわざわざDirコマンド使う必要あるのか
何がやりたいんだ
2021/01/10(日) 20:17:18.14ID:4Xu9louP0
>>226
サーバーの空き容量調べたいだけなんだけどね
方法は他にもあるけど、いちいちドライブ文字設定しなきゃいけないとか、
何かアドインみたいなの入れなきゃいけないとかあるし
Dirコマンドが一番シンプルだし、
batでテキスト出力するのは問題なくできるから、
それを直接変数に入れられないかなと思ったんだけど
2021/01/10(日) 20:39:03.57ID:kg6XuktW0
>>227
WSHつかうならDriveオブジェクトがUNCパスいけるっぽいけど
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/drive-object
2021/01/10(日) 23:21:47.74ID:CEBDD+E50
馬鹿が聞いて馬鹿が答えるスレ
2021/01/10(日) 23:32:18.31ID:LL6dwzdY0
>>229
お前は馬鹿馬鹿いうだけの馬鹿だな
2021/01/11(月) 22:06:06.53ID:pqPOJoG50
このスレでお世話になりまくった者だけど
金欲しさに工場部門の夜勤に今年から異動したからVBA触ることももうない
数年後間接部門に戻れるかわからんけど
いや戻れないだろうけど
スレの全員に感謝だわ
本当に色々教えてもらったし構文そのまま頂けた
本当にありがとう
2021/01/11(月) 23:57:28.02ID:pfNMzUxK0
生産管理でまた使うことになったりして・・・
2021/01/12(火) 01:59:02.62ID:OTa0Zw/f0
VBAに触らなくて良くなるだけで羨ましいわ
2021/01/12(火) 19:01:11.25ID:dCVmoeOp0
>>231
製造現場になじめないで会社辞めるに1ガバチョ
2021/01/13(水) 19:37:02.44ID:lspxZscb0
Dirコマンドの件で回答くれた皆さん

パスにUTF-8で文字化けする文字を含んでいたのが原因だったわ
しょうもないオチでごめんなさい&ありがとう
2021/01/13(水) 20:54:16.63ID:aeNWg8u3H
UTF-8からシフトJISに正しく変換できない文字かあ
葛飾区とか草薙とか色々あるよな
記号も〜とか¥とか半角スペースとかマイナスとか、よく使うのに化けるのがたくさんある
237デフォルトの名無しさん (スッップ Sd9f-ZaM3)
垢版 |
2021/01/14(木) 02:22:27.50ID:JNzdWMyDd
>>235
それを解決できない馬鹿が中途半端に書き込むなよ
2021/01/14(木) 05:19:52.68ID:ecyWCD0F0
知恵袋よかこっちの方がよほど親身なのは住人が優しくてイイ人ばかりだからでつか?
2021/01/14(木) 07:59:40.60ID:gDZI6jyWr
=TEXT(ROUNDDOWN(a1,1-INT(LOG(a1))),IF(1-LOG(a1)>0,"0."&REPT(0,1-INT(LOG(a1))),"0"))

をVBAで記述するとどうなるのか教えて欲しいです。よろしくお願いします。
2021/01/14(木) 12:22:18.25ID:YIqcuI1O0
a = [TEXT(ROUNDDOWN(a1,1-INT(LOG(a1))),IF(1-LOG(a1)>0,"0."&REPT(0,1-INT(LOG(a1))),"0"))]
2021/01/14(木) 12:56:03.99ID:YzBTA1U5H
>>240で解決してたけど、一応正攻法みたいな物

Sub 有効数字2桁()
  Dim A1 As Double
  Dim L As Integer
  Dim S As String
  Dim F As String
  A1 = Range("A1")
  L = 1 - Int(Log(A1) / Log(10#))
  If L > 0 Then
    F = F & "." & String(L, "0")
  Else
    F = "0"
  End If
  S = Format(WorksheetFunction.RoundDown(A1, L), F)
  Debug.Print S
End Sub
2021/01/14(木) 18:59:26.33ID:+2NwXrek0
>>240
マジか・・
普通に書くか、いちいちWorksheetfunctionとか書いてたわ
2021/01/14(木) 20:01:26.65ID:SduAKFWs0
質問です。

シートモジュール内で、

Private Sub Worksheet_Change(ByVal Target As Range)
For Each test In Range("他シートにある名前付きセルの名前")
Next test
End Sub

これで実行時エラー”1004” ’Range’メソッドは失敗しました:WorkSheetオブジェクト が出てしまうのですが、原因は何でしょうか。
Publicを取ってみたり、シートを指定しみたりしたんですが、変化ありません。
標準モジュールに記述してF5で実行した場合はエラー発生しません。
宜しくお願い致します。
2021/01/14(木) 20:33:06.60ID:gxjpIPZs0
シートを指定する
名前の適用範囲を確認する
2021/01/14(木) 20:38:30.13ID:SduAKFWs0
>244
名前の適用範囲を変えてみたりもしたんですが、だめでした。
2021/01/14(木) 20:52:33.18ID:SduAKFWs0
>>244
すみません、解決しました。
名前の適用範囲を参照範囲のシートあるいはブックにして、且つVBAでそのシート指定すればいけました。
2021/01/14(木) 20:55:12.26ID:yNTWs1ET0
>>243
In Rangeの範囲がそのシートだから、そこに名前付きセルはない
その範囲のあるシートがわかってるなら、In 他シート.Range("... のように指定するか
同一ブック内ならIn ThisWorkbook.Names("名前付きセルの名前").RefersToRange
とかでいけんじゃね
2021/01/15(金) 07:45:14.16ID:fl9fRXksr
>>240
>>241
ありがとうございます。
2021/01/16(土) 04:08:04.09ID:wM/4uvwh0
@Set DB As CurrentDb

ASet DB As CurrentDb()

この二つに使い分ける意味はありますか?
2021/01/16(土) 10:41:53.52ID:MRodpgDG0
ないと思う
2021/01/16(土) 16:36:07.57ID:SaJeHrUX0
@はカッコつけたい時
Aはキーボード打つのめんどくさい時
2021/01/16(土) 19:03:22.47ID:wM/4uvwh0
>>250>>251
ありがとう。教本読んだら2種類出てきたので、
何か違いはあるのかと思いまして。
同じだったのか…。
2021/01/16(土) 19:33:57.85ID:MRodpgDG0
同じではない
必要性を感じないというだけ
2021/01/16(土) 20:50:02.04ID:wM/4uvwh0
必要ないのを同じと表現したの
2021/01/16(土) 21:12:53.28ID:haZmUiAy0
>>253
使い分ける意味がないのに同じでないのはないってどういう意味?
2021/01/16(土) 21:22:36.09ID:BbkPLu/V0
ExcelのVBAにCurrentDbなんてないのは置いておくとしても
その文ってどっちもエラーになると思うんだが
2021/01/16(土) 21:38:23.62ID:wM/4uvwh0
あ、すみません…
AccessVBAのスレってあったんですね。
申し訳ない。
あと1As」 って書いちゃってたけど「=」
2021/01/16(土) 21:39:02.86ID:wM/4uvwh0
訂正
あと「As」って書いちゃってたけど当然「=」でした
2021/01/16(土) 21:59:42.58ID:BbkPLu/V0
Accessで試したけどどっちも通って同じ結果だな

俺の予想では2はデフォルトプロパティの呼び出しになると思ったんだが
引数省略したら、かっこそのものも除去されて評価されてるのかもしれん

つかその教本ってなんだ?
2021/01/16(土) 22:14:43.61ID:BbkPLu/V0
>>255
この例は同じ結果になってるけど、その二つはまったく同じではないよ
Accessで違いが出る例
Dim DB
Dim CurrentDb As Database
Set CurrentDb = Application.CurrentDb

Set DB = CurrentDb
MsgBox TypeName(DB)

Set DB = CurrentDb()
MsgBox TypeName(DB)

まあCurrentDbとかいう変数名は少なくともVBAではお勧めできないけどな
2021/01/16(土) 22:21:15.40ID:wM/4uvwh0
CurrentDb自体を変数にするとか、それはもう別の話では
2021/01/16(土) 23:00:55.60ID:BbkPLu/V0
前提を絞らなければ、動作に違いが出るかどうかの話だから別の話じゃない
変数名の良し悪しに関してはまあ別だが

つかその教本とやらを曝せ
俺的にはデータベースのインスタンスを取得する目的で後者の書き方とかなら、そっちのほうが問題だわ
2021/01/17(日) 05:07:21.78ID:Bpeq2DcA0
実際にはやらない無理な方法で無理矢理話を混ぜ返したいだけで、
そもそも意図を汲んでない
2021/01/17(日) 18:18:57.16ID:6FyugFd+d
初心者です
オートシェイプの名前を検索して置換できるコードを教えてください
調べてもオートシェイプ内のテキスト変換しかありません
お願いします
2021/01/17(日) 20:37:25.77ID:EfLIE7TKH
>>264
オートシェイプの個数は
sheets("Sheet1").shapes.count

名前は
sheets("Sheet1").shapes(1).name
■ このスレッドは過去ログ倉庫に格納されています