Excel VBA 質問スレ Part61

■ このスレッドは過去ログ倉庫に格納されています
2019/04/25(木) 23:41:03.61ID:rni/4bMj0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part60
https://mevius.5ch.net/test/read.cgi/tech/1552736349/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/05/14(火) 00:09:21.56ID:XEzOoRRL0
ちょっとググって見ます
2019/05/14(火) 00:15:14.20ID:a29jNOd40
>>237
何通りかあったと思うけど、
その書き方だと[Sheet1$]かな。

プロバイダーも、adoCn.Providerにも、adoCn.Openにも書ける。
ブック名をFromの後に書く方法もある。

組み合わせは忘れたけど、どこかで指定していれば、
別の部分では省略できる感じ。
2019/05/14(火) 05:07:41.34ID:XEzOoRRL0
>>243
なるほど、勉強になります
2019/05/14(火) 19:07:26.92ID:wEGsmpoqp
https://dotup.org/uploda/dotup.org1847293.xlsx.html
東京・大阪・北海道の各出発時間・到着時間を黄色い部分に「sendkeysで」、「それぞれ東京・大阪・北海道の順序を守って」入力したいです
実際にsendkeysでキーを送るのはブラウザ上のフォームであり、東京の時刻入力→tabとenterをsendkeyしつつ次のページに移動→大阪を入力、という風に処理するため、順序等が変更できません
また入力するのが東京・大阪・北海道だけでないかもしれないので、記載がある行すべてというイメージでお願いします

excelスレでも質問してみてますが、vba専門スレがあることに気付かされたのでこちらでお世話になります
2019/05/14(火) 20:14:46.00ID:Bsz/IupB0
だから、Sendkeysはやめろって。

これはお手軽にその場だけデータを取りたい時なんかに使うけど、制御出来ないから普通は使うべきじゃない。
2019/05/14(火) 20:18:43.38ID:wEGsmpoqp
もちろんそうなんですが自分には IE操作は敷居が高くて、愚直も愚直にsendkeysしか手段が思いつかないもので・・何か代替案ございますか?
2019/05/14(火) 20:22:02.95ID:9TMbmfYm0
どう考えてもIE操作の方が敷居が低いんだが
2019/05/14(火) 20:23:00.65ID:9TMbmfYm0
inputに文字列入れるだけだろ?
ソース見てidだかclassだか取得してポイって入れるだけじゃん
2019/05/14(火) 20:25:50.88ID:wEGsmpoqp
それがよーわからんのです・・
とりあえずググってすぐ見つかるサイトで特に初心者にわかりやすい解説してるサイトでも教えていただけませんか?
2019/05/14(火) 21:33:16.75ID:wEGsmpoqp
IE操作で頑張ってみてるんですが、リンクオープンして開いた別窓を操作するにはまたhtmldocにobjIE.documentを代入して・・ってしないといけないんですか?
2019/05/14(火) 21:59:36.21ID:IyB4HHSk0
>>251
別窓にしちゃう(なっちゃう)とそのウィンドウを探して、html取ってくることが必要になるので、できるなら避ける。

IE VBA
でググれば、参考サイト出てくる。あとは応用しだい
IEでは F12で開くやつも有用

がんばれ
2019/05/14(火) 22:06:13.16ID:wEGsmpoqp
>>252
社内システムなので必ず別窓になっちゃう仕様です
htmlの取り方教えてもらえませんか?
2019/05/14(火) 22:31:09.98ID:a29jNOd40
>社内システムなので

多分、このスレ見てる全員ズコーだわ、そのオチ。
システム部門の人に聞いちゃダメなんかい。
2019/05/14(火) 22:36:33.89ID:s0Vi/y5R0
CreateObject("Shell.Application").Windows() から探す
2019/05/16(木) 11:39:56.68ID:a1IyAHl+r
excelマクロでのバージョン管理てどうすればいいん
言われるがままに集計マクロ作ったら担当者毎に持ってるマクロのバージョン違ってあの機能が無いとか特殊な状況でエラー出る→それ先月直しましたよ
が頻発してる
2019/05/16(木) 12:20:32.52ID:5BGNguvP0
>>256
サーバー上にマクロ専用のエクセルファイルを置いて、
個々に配っているファイルからはそのマクロを参照させる
2019/05/16(木) 12:51:40.47ID:YRbGgWK/M
>>257
基本それだが、ずっと掴んでるやつがいるとバグ修正や機能追加のときに困る
2019/05/16(木) 14:16:39.46ID:5BGNguvP0
>>258
読み取り専用にしてもダメか?
2019/05/16(木) 14:16:55.41ID:5BGNguvP0
もちろん自分が編集する時は読み取り専用解除ね
261デフォルトの名無しさん (ワッチョイ b0f1-tIz5)
垢版 |
2019/05/16(木) 14:43:29.72ID:wWtnEH3A0
コード書く画面を
背景は黒に、文字は白に、する方法を教えれ
2019/05/16(木) 15:42:20.38ID:Z2BhGmok0
ツール -> オプション -> エディターの設定
2019/05/16(木) 16:12:18.52ID:BYfNVo3YM
>>256
OS起動したら、サーバからコピーしてくるバッチ等を走らせる
小さいならいちいちバージョン確認しなくてもよい
2019/05/16(木) 18:04:23.53ID:rNkkKl6PM
みんな一々シャットダウンするのか?
スケジュールでコピーだろ
2019/05/16(木) 18:58:39.63ID:5BGNguvP0
>>>261
これ
https://tonari-it.com/excel-vba-vbe-syntax-highlight/

ちなみに書くとこはVBEって言うから覚えておくと検索できて便利
2019/05/16(木) 19:18:23.52ID:UtWIeHx/p
マクロ終了時にマクロ開始から終了までにかかった時間が秒までメッセージボックスに表示するってできる?
2019/05/16(木) 19:18:36.52ID:rD+4K505M
>>264
個々人のローカルフォルダにxlam があってそれが定期的に書き換えられるって事?
他のブックがxlamを掴んでる最中でもできる?
2019/05/16(木) 19:23:31.84ID:UPwRXvuL0
>>266
できる
2019/05/16(木) 19:26:21.47ID:5BGNguvP0
>>266
楽勝

Sub foo()
開始 = Now
'処理
終了 = Now
MsgBox Format(終了 - 開始, "hh:mm:ss")
End Sub
2019/05/16(木) 19:26:44.10ID:5BGNguvP0
>>268
URL春だけでもいいから教えてあげたらw
2019/05/16(木) 19:31:25.53ID:UtWIeHx/p
>>268はなんとかookスレで最近流行りの流れだよw
>>269ありがとう!
2019/05/16(木) 20:10:17.30ID:rNkkKl6PM
>>267
掴んでたらスルー
2019/05/16(木) 22:17:19.76ID:aE3zz80C0
>>256
起動時に何らかのファイルを参照するようにしておいて、
参照出来たらそのままOK。
出来なかったら、新たにファイルをDLする仕組みにする。

で、更新させたい時は、わざと参照用ファイルを消しておく。
2019/05/16(木) 22:24:00.58ID:yzKWQsxd0
>>273
xlamを共有するならそこのWorkbook_Open にそういう処理を入れておけばいいでしょうね
2019/05/16(木) 23:04:51.54ID:kfbhC4dW0
>>256
最新バージョン書いたテキストかなんかを共有に置いといて、起動時に見に行ってそれより古かったら更新促す警告出すとか
2019/05/17(金) 02:52:09.97ID:gYF5enuVM
Excelの起動時、マクロを実行させる:Excel(エクセル)マクロ
https://www.excel.usefulhp.com/excel-macro/excel-macro50.html
で良いだろ
2019/05/17(金) 09:22:35.60ID:YDbG3YPmr
共有パス見て実行とか大変そう面倒そうて主観があったけども
Application.Run "共有のパス!マクロ名 "
の1行でいけちゃうもんなのか…?
とりあえず試してみる
すでに誰かが開いてる?とか参照できないときの対処も色々試してみるありがとう
2019/05/17(金) 09:26:03.52ID:PC2o5teB0
>>277
そっちは使わないかな
俺はボタンにマクロの場所を登録する
2019/05/17(金) 09:26:30.66ID:PC2o5teB0
なんか日本語変だ
まぁいいか
2019/05/17(金) 12:25:15.46ID:cM5KCNydp
ちょっと筋外れるかもしれないけどvbeに行間なく詰めて書いたコードの選択範囲に1行ずつ改行入れるいい方法ない?
281デフォルトの名無しさん (ワッチョイ 9b5f-KFp3)
垢版 |
2019/05/17(金) 12:28:45.29ID:gxvYGXpT0
そんなのできない。サクラエディタで置換して貼り付けろ
2019/05/17(金) 22:00:27.88ID:BHkVW2uG0
>>280
VBEを操作すればできると思う。面倒だけど
まあ>>281の方法が合理的だろうな
2019/05/18(土) 00:21:37.50ID:qrQ2t1Xp0
>>280
改行コードを改行コード+改行コードで置換
284デフォルトの名無しさん (ワッチョイ 3591-0dpX)
垢版 |
2019/05/18(土) 00:55:20.52ID:pDLl57eM0
コードウィンドウ内の改行はCRLFじゃなくてLFだった筈。
そんなに難しくない。
でもこれが動く設定はマクロウィルスも動くから危険だよ。

Sub test()

Dim strCode As String
Dim stRW As Long
Dim stCL As Long
Dim edRW As Long
Dim edCL As Long

With Application.VBE.ActiveCodePane
.GetSelection stRW, stCL, edRW, edCL
strCode = .CodeModule.Lines(stRW, edRW - stRW + 1)
.CodeModule.DeleteLines stRW, edRW - stRW + 1
.CodeModule.InsertLines stRW, Replace(strCode, vbLf, vbLf & vbLf)
End With

End Sub
2019/05/18(土) 19:27:39.15ID:4RzeW/b40
専用のメソッドがあるのが凄いわ。
何を想定して用意してあるんだろう?
プログラムがプログラムを書き直すAIにでも使うのか?
2019/05/18(土) 20:16:07.59ID:8gQadrhx0
Application.VBE.ActiveCodePane
こんなの合ったのか
PaneはPanelかと思ったら、ペインの事なのね
2019/05/18(土) 20:29:02.38ID:P5JmHxRDM
VBEを拡張するためのオブジェクト群が用意されてるんだよね
2019/05/19(日) 09:22:38.02ID:MCPGuHEx0
Excel4マクロは自己書き換え自由だったから
機能的に負けるわけにはいかなかったんじゃね?
2019/05/19(日) 11:43:42.11ID:1xMNIuy/x
配布済マクロの修正パッチとかで大量のファイルや行を一括修正したいときは便利
2019/05/19(日) 12:03:05.34ID:igxNvdy7a
単価の低そうな涙ぐましい仕事だな
2019/05/19(日) 12:39:30.70ID:gILK5dpZ0
マクロ4はできる人がいない+やりたくないから単価超高いぞ
で、単価高くしても足が出る・・・
2019/05/21(火) 19:13:05.44ID:7gg6L6p3p
実行から終了まで数分かかるマクロを途中で止める方法ないですか?f4押したら「処理を止めました」のメッセージボックスとともに停止するとか。
2019/05/21(火) 19:31:11.94ID:OX+uPiO40
Break
ESC
2019/05/21(火) 19:37:07.71ID:K+4dE9j10
ループが長いならDoEvent入れておいて
msgbox "終了します"とendだけ書いたのを起動できるボタンどっかに置いとけばいい
2019/05/21(火) 20:04:23.19ID:MD1oUmkY0
ESCやBreakで止まるなら良いけど、それで止まらない処理ならウィンドウESC押しながらタスクバー上でマウスでウィンドウの切り替えをすると止まる。

どっかのブログで見て知ったけど役に立ってる。
2019/05/21(火) 21:15:28.57ID:QvaiZxJv0
こうする
https://youtu.be/h-xo-5krq2Y
2019/05/21(火) 21:30:20.69ID:7gg6L6p3p
ほー
明日試してみます
2019/05/21(火) 22:08:13.75ID:R92gi7e40
2009/12/16に公開って何だよ。
20年くらい前に見たぞそれ。
2019/05/22(水) 06:58:44.20ID:SD95iW5CM
>>298
映像はどうみても20年以上前だな
的確な対応で現在も使える
2019/05/22(水) 09:27:28.15ID:ztZYN21m0
セルの値を数式に代入って無理でしょうか?
たとえばA1セルに乱数が入ってた場合に
どっかのセルに =A2-乱数 という数式を代入したい感じです
2019/05/22(水) 09:41:17.90ID:5+y7OppMM
=A2-A1
2019/05/22(水) 09:43:43.65ID:ogyeLG/uM
演算あり値コピーの話?
2019/05/22(水) 09:52:11.18ID:AHnUJ8Jk0
いやセル番地じゃなくて値を数式に代入したい感じです
たとえばA1セルに2,134という数字が入ってた場合に
=A2-2,134 という数式をどっかのセルに代入

A1セルが387だとしたら
=A2-387

説明下手糞で申し訳ないです
2019/05/22(水) 09:54:20.78ID:hC9fKDDe0
>>300
書いている意味がよくわからんど
セルに式でも値でも代入できる
ただ、乱数は曲者で常に変わるから
もう少しやりたいことを具体的に書き込もう
2019/05/22(水) 10:00:56.85ID:hC9fKDDe0
>>303
乱数は曲者で
A1セルが387だとしたら
=A2-387
ほかのセルに「=A2-387」を入れた時点でA1セルは変わるから
もう少し何をしたいのか書くように
2019/05/22(水) 11:59:27.46ID:zi+TqRd2r
そもそも数式はスレ違いだろ
VBA関係ないならどっかエクセルの使い方の板かスレかさがせ
2019/05/22(水) 13:17:58.06ID:/GezpU1zp
>>305
A1セルの乱数結果が現時点で387だとしたら
変数(仮にrとする)に、387を格納して
ほかのセル(仮にB1とする)に"=A2-r(中身387)"を入力したいって事?

それなら確かに関数じゃできないよね
2019/05/22(水) 13:58:22.19ID:WDej9GuM0
>>303
Range("C3").Value="=A2-" & Range("A1").Value
じゃ駄目?
2019/05/22(水) 16:05:46.41ID:hC9fKDDe0
>>307
それに意味あると思えない、乱数なんてふつうは仕事に使わない
例えば、学校の先生あたりが、引き算足し算などの問題を自動的に作りたいとか
であれば、A列に乱数1の結果をB列に乱数2の結果を
C列に計算式を、D列に回答をで別シートなどで問題文を作る
このぐらいだな
2019/05/22(水) 18:12:45.70ID:j7jZt3jJM
説明下手糞ってレベルじゃねぇぞ…
2019/05/22(水) 18:48:51.39ID:RRuRLAJCM
>>309
ちょっとしたシミュレーションで使うかもしれない。(Excelでやるとは言ってない)

>>302じゃダメなの?
2019/05/22(水) 19:16:53.47ID:CZzIGWUTM
>>311
ちょっとしたシミュレーション・・無いだろ
この文書力だとセルに入れたい式って
計算式の文字列かもしれん
2019/05/22(水) 22:59:24.50ID:bxcYYOqD0
もうあれだ。
ここは、何の用途に使うのか当たられたやつが優勝スレにしよう。
2019/05/22(水) 23:13:17.16ID:K7mhmRd90
完全乱数を使って円周率の計算をする
2019/05/23(木) 07:43:57.81ID:mLR+BkfhM
別に用途は何でもいいさ
興味ゼロってわけじゃないけど
2019/05/23(木) 10:22:05.81ID:WDXUv9KM0
こっちで作って欲しいと言われたものをつくってると
そんなもの作られたら困る
楽になって人が減らされると困る、と古参がちくちく
この古参、自分の作業を楽にしたい時には
これがもう偉そうな態度で、「作らせてやる」とでも言わんばかりに頼んでくる
どうしたいんよもう

っていうことないっすか

もう面倒なんで職場で作るのやめようかな
すんません落書きしちゃって
2019/05/23(木) 10:56:07.55ID:cSCM+dO10
厚労省で配布されている
https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/000116890_00001.html
にある
https://www.mhlw.go.jp/content/10900000/000494621.xlsm
なんだけど、内容は単純で

1件いくらの検査があって、件数を入力すれば請求書が作成されるというもの
1シート=1自治体なので、複数の自治体へ請求する場合は、ユーザーがシートコピーして作る
VBAで各シートを集計して総括表に転写する

なんだけど、VBAみて
変数が多すぎてコーディング中に間違えても気づかんだろってのと
引っ張ってくるセルをConstで決め打ちしてるけど
これ後のメンテナンスでセル一個挿入することになったら修正大変やん と思いました。

というか、エラーメッセージの所で間違えて
行を表示すべきところを列表示しているけど
これこそ変数多すぎて分かりにくくした事が原因だと思います。

じゃあどうする、と言われたらみなさんならどうしますか?

同じ形の複数の2次元の表を合計するだけなんだから
スタート地点とゴール地点決めてやって
後はずらしていけばいいやんと思うのですが

後、小数とか負の値ぶっこんでも動作するのはモヤモヤするんだけど
まぁこの辺やりだしたらキリがないので使わせる相手によってどうするかは変えますかね
2019/05/23(木) 11:43:15.47ID:mLR+BkfhM
>>316
義務教育でプログラミングを扱うようになって、自分の仕事くらい自分でプログラミングできないようでは大変な事になるよ、
と教えてやればいい。
もしかしたら「手下にプログラミングさせればいい」と勘違いするかも知れないが、
それでは通用しないよと言ってやろう。

こういう話もあるし
https://lite.blogos.com/article/376203/
2019/05/23(木) 16:11:36.77ID:hFcQqqxb0
>>316
ただ単純に業務全体を見ずに作るから役に立たないんだよ
業務に対して目的と効果を文書ではっきり示せば古参の意見を聞かなくていい
2019/05/23(木) 16:13:59.49ID:X/3FpVKz0
>>316
その古参の上司に報告しろ
2019/05/23(木) 16:14:38.98ID:hFcQqqxb0
>>317
すまん、リンク先を読む気もしない
2019/05/23(木) 17:56:30.55ID:pyUsEGpsM
>>317
べき論の先には「VBAを使うのをやめるべき」という結論しかないから不毛よ
俺ならどうするか?下請けに丸投げして終わりだよ
2019/05/23(木) 19:35:05.76ID:QGT5qlDg0
>>318
>義務教育でプログラミングを扱うようになって、自分の仕事くらい自分でプログラミングできないようでは大変な事になるよ
脅かすことでプログラミングができるようになるとはおもいませんが…
プログラミングって極めて創造的な作業ではないでしょうか、似たようなものは数学の証明問題だと思いますが証明問題を脅かして解けるようになるとは思えません
2019/05/23(木) 20:39:50.63ID:X/3FpVKz0
機械学習やweb系ならともかく、
VBAレベルなら極めて事務的な仕事だろう。どこにも創造性なんて無いよ
ルーチンワークを自動化させてるだけ
2019/05/23(木) 20:58:31.34ID:QGT5qlDg0
>>324
でもそのルーチンワークを実際に記述するとなると一本道というわけにはいかないでしょう?
論理的な一貫性を維持しながらしたいことを記述するのは、いわれているほどやさしい仕事ではない
2019/05/23(木) 21:06:10.14ID:X/3FpVKz0
>>325
一本道だよ、全然難しくない
強いて言えば例外を先に全部列挙した上でシステムに放り込むという順序の変更がある程度

面倒なのは仕様変更と、使いにくいというオバハンの嬌声。オバハンにalt+F8は覚えさせたけど、まぁそれぐらい
2019/05/23(木) 22:12:48.96ID:0Fgm70+GM
まあ、自己満足で終わるなら簡単だな
おばはんにも満足いくように作るんだよ
2019/05/23(木) 22:27:50.56ID:49rcJhkB0
>>317
コンスト過ぎてワロタ。
2019/05/23(木) 22:55:08.55ID:EGX4zlJj0
>>323
それもそうだが、その老害を大人しく
させることができれば上出来と考えた
2019/05/24(金) 01:42:55.95ID:9kKOGm+S0
Excel2016にてpersonal.xlsbに「保存せず閉じて開き直すマクロ」を作ったところ挙動が変です

Sub ReOpen()
  Dim wb As Workbook
  Dim path As String
  Set wb = ActiveWorkbook
  path = wb.fullName

  '※1
  If MsgBox("本当に変更を取り消しますか?", vbYesNo) <> vbYes
    Exit Sub
  End If

  wb.Close(False)
  Application.Wait([Now() + "00:00:01"])

  '※2
  Workbooks.Open(path)
End Sub

このマクロ自体は動くのですが、※1のIf〜EndIfを消すと※2のOpen実行直後にExcelが通知無く落ちます
また、※1※2を両方消してマクロ実行した後、手動でブックを開き直すとやっぱりExcelが落ちます

対象のブックはフォームやマクロを含んだ3MB程度のxlsmファイルです
MsgBox出さないだけでなぜ不安定になるのか、思いつく原因を教えて頂けると幸いです
2019/05/24(金) 01:44:27.87ID:9kKOGm+S0
あ、Ifの末尾のThen忘れたので脳内で補完してください
2019/05/24(金) 06:40:29.33ID:/lvzTPqGM
>>331
ハイ イイエ が逆なのも利用者が自動変換するんですね
2019/05/24(金) 06:54:20.73ID:/lvzTPqGM
>>332
すまん、継続がキャンセルか
2019/05/24(金) 09:59:52.88ID:RAYiE+wA0
>>330
2019で試したけど落ちなかった
> Application.Wait([Now() + "00:00:01"])
これを抜いても同じ

カンで答えると、再計算が邪魔してるような気がする

・一度再計算や描画、イベントを切ってみてはどうかな
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

・あとはこの部分のウェイトをもう少し長くする
>Application.Wait([Now() + "00:00:01"])

・まっさらなブックで試してみる
2019/05/25(土) 07:54:51.56ID:TRopVMeK0
アドインって、ファイルを閉じたら、
一緒に閉じられるものだと思ってたけど、
VBA実行中は残るということか。
一緒に閉じられたら、途中で止まっちゃうからな。
2019/05/25(土) 08:55:38.15ID:nkVbmNSl0
vba実行中というかずっと残るっぽい
2019/05/25(土) 09:55:42.63ID:wPp02VNQ0
エクセルの機能に追加してるからな
アドイン使ったファイルをアドインがないエクセルで編集すると壊れるよね
2019/05/25(土) 10:07:50.37ID:wPp02VNQ0
>>330
経験上納得できない動作をするときは何か見落としているところがある
step実行で場所特定して、各変数の値が壊れてないか確認
イミディエイト画面で入力してみるなど
2019/05/25(土) 10:14:01.11ID:D2XIJyZK0
Excelに限って言えば、Excel自体に変な仕様が多い
これが男を惑わせる
2019/05/26(日) 04:10:46.96ID:xQGdFtWrM
>>334
元に戻さないアホがいると大迷惑になるな
>>335
アドインはExcelに組み込むよね
>>339
配列数式なんか使うとブーイングになるよな
2019/05/26(日) 15:23:19.13ID:/taseRUt0
以下の状態だとB1〜B3は全て1:1048576と表示されてしまいます
Cells.SpecialCellsをRange("A1").SpecialCellsに変更した場合はB1〜B3は全てA1と表示されます
Ctrl + Endで選択されるセルの番地を文字列として取得するにはどうすればいいですか?

  A    B
1 Sheet1 =fn(A1)
2 Sheet2 =fn(A2)
3 Sheet3 =fn(A3)

Public Function fn(sSheetName As String) As String

fn = ActiveWorkbook.Worksheets(sSheetName).Cells.SpecialCells(xlCellTypeLastCell).Address(False, False)

End Function
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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