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/11(土) 03:15:11.68ID:04x+b6lna
さっかりなw
2019/05/11(土) 08:20:45.16ID:0TYDlcnk0
>>194
そうですよね
やらないとわからないがほとんどです(T-T)

>>195
脳内変換ヨロシクです
2019/05/11(土) 19:56:32.57ID:C94O1bx/0
ADO使うと突然落ちるようになった。
何が原因J?
2019/05/11(土) 20:45:20.04ID:Y1ZlGg0p0
>>197
プロバイダはなに?
2019/05/11(土) 21:32:42.45ID:C94O1bx/0
>>198
Microsoft.ACE.OLEDB.12.0
PCによっては普通に実行できるので、原因がわからん。
2019/05/11(土) 21:36:03.53ID:pbKNvvnGa
質問です。
NumberFormatLocal = “yyyy””年””m””月””d””日””(aaa)”で書式の定義を変更しています。
NumberFormatLocal = ●“yyyy””年””m””月””d””日””(aaa)”

●の箇所に文字列を入れたいのですが”●”を入れるとエラーになります。解決方法はありますでしょうか?
2019/05/11(土) 21:40:16.93ID:C94O1bx/0
>>200
わからんけど、自動記録でやったものをコピペするとか。
2019/05/11(土) 21:46:39.70ID:VQwnSTgG0
マクロの記録取ってみたわ
ダブルコーテーションで括った中で、更にダブルコーテーションがいるっぽい
具体てt機にはこう

Selection.NumberFormatLocal = """あ""yyyy""年""m""月"""
2019/05/11(土) 21:46:58.83ID:pbKNvvnGa
>>201
解決しました。ありがとうございました。
2019/05/12(日) 02:13:17.21ID:anQ1bE+S0
もしかして、Access2016が入ってると、
Excel2013ではADO接続使えない?

Excel2013からAccess2016の参照で落ちるケースはググって見つけたけど、
ウチのはExcel2013からExcel2013で落ちる。
205デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/12(日) 02:35:46.96ID:0u/cIV/f0
>>190
データとしてExcelを使う場合と、ドキュメントとしてExcelを使う場合とで、考え方がかわる。
2019/05/12(日) 08:45:07.80ID:OK9Y1i2P0
>>204
win下をdll検索して、複数見つかったらそれぞれ直接参照設定してみるとか
(単体で動いてるわけじゃない気もするから、期待薄かもしれんけど)
2019/05/12(日) 12:05:15.73ID:anQ1bE+S0
>>206
それもダメだったから、諦めてExcel2019買ったわ。
それだと普通に動いたから、
やっぱりExcel2013とAccess2016の組み合わせがダメだったみたい。

ありがとう。
2019/05/12(日) 16:17:36.32ID:UM6bazI+0
32ビット版だったとか?
2019/05/12(日) 17:19:48.24ID:anQ1bE+S0
>>208
Excel2013 ・・・ ADO接続OK
   ↓
Excel2013 + Access2016 ・・・ ここで突然落ちるようになる
   ↓
Excel2019 + Access2016 ・・・ 直った!

全部32bit。
本当は64bitにしたかったけど、ListViewとか、
一部使えなくなる機能があるので諦めた。
2019/05/12(日) 17:21:42.38ID:anQ1bE+S0
あ、Excel2013 + Access2016って、インストールの組み合わせ。
別に、Excel2013からAccess2016に接続しに行ったわけじゃない。
落ちたのは、Excel2013からExcel2013へのADO接続。
211デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/12(日) 17:23:44.21ID:0u/cIV/f0
なんの話をしているのか他人にはさっぱりわからないw
2019/05/12(日) 18:10:56.69ID:w16fcO4J0
時刻がマイナスの場合

とは、if文でどうやってつくりますか?
2019/05/12(日) 18:20:18.19ID:O1RPDIWFM
>>212
マイナスの時刻など存在しない
If 1 = 2
2019/05/12(日) 18:23:52.94ID:w16fcO4J0
A−B=C

時刻の差のCがマイナス表示されるセルを

if文で
00:00:00
に直したいです
2019/05/12(日) 18:30:53.16ID:O1RPDIWFM
>>214
=TEXT(MAX(0, C), "hh:mm:ss")
VBAは要らん
2019/05/12(日) 18:33:52.80ID:w16fcO4J0
セルの設定ですね。
ありがとうございます。
217デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/12(日) 20:06:16.73ID:0u/cIV/f0
プログラミングの初歩は大事なんだと思ったよ。

ある値のときは00時00分00秒にするという分岐を思いつかないんだから。
2019/05/12(日) 20:51:34.11ID:JDMVXB4ua
まあMIN/MAXを使って値をキャップするのは正統なプログラミングでは非常によく使われる方法だけど、
事務屋さんには意外と思いつかないかもね
2019/05/12(日) 21:54:23.80ID:UM6bazI+0
普通に時刻どうしで比較できるから、3分前とかそういうことかと思ってた
220デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/12(日) 22:49:25.28ID:0u/cIV/f0
>>210
Office製品は基本的にバージョン違いを混在させられるようにはできていない。
2019/05/13(月) 07:47:02.77ID:J0xiSM4lM
>>220
そんなことはなくて条件満たせば使えるよ
https://www.microsoft.com/ja-jp/office/homeuse/attention4.aspx
2019/05/13(月) 09:04:58.38ID:bJahx30bM
>>219
時間と時刻
2019/05/13(月) 09:19:29.85ID:OGTR1ISy0
その前にいきなり時刻とか言い出した辺りでダメダメ。
人間が時刻と思ってるだけの可能性がある。

セルの書式や変数の型を元に説明しないのは、人間の目線で時刻と言ってる証拠。
2019/05/13(月) 13:56:52.37ID:p6Zrf1zY0
シャープで囲んでる人はちょっと
2019/05/13(月) 14:34:08.69ID:/2MppI/1M
VBAでは時刻と時間を Timeでずっとやり繰りしてたのに、c#で TimeSpan発見したときは叫んだわ
2019/05/13(月) 16:36:40.35ID:N0Eopnbu0
え?エクセルをADOでデータベースみたいに扱うこともできるの?
2019/05/13(月) 17:03:08.67ID:P7TvqqIDM
>>226
ちゃんと形式を整えておけば単純なSELECTなら使える
WHEREが機能するだけでOKってことならまあまあかな
JOINとかは当てにならないような気がする
DELETE, INSERT, UPDATE はもっと当てにならない
2019/05/13(月) 19:21:33.24ID:t89inGVt0
あてにならないってなんやねん
229デフォルトの名無しさん (アウアウクー MM8b-BEL3)
垢版 |
2019/05/13(月) 20:44:43.21ID:/95lNMvTM
>>228
他人だけど、ExcelのSQL操作はおまけ機能だから、標準SQLに対応してないから、やってみないとわからない。
2019/05/13(月) 21:00:39.75ID:N0Eopnbu0
まぁできちゃったらアクセスの立場ないわな
2019/05/13(月) 21:02:14.05ID:icbU5YOt0
SQL自体もう色々派閥が分かれすぎて
2019/05/13(月) 21:06:25.95ID:adbFFiEz0
>>229
馬鹿は死ねや
Accessのエンジンと同じだろ
233デフォルトの名無しさん (アウアウクー MM8b-BEL3)
垢版 |
2019/05/13(月) 21:10:27.82ID:/95lNMvTM
>>232
バージョンを気にしてくださいw
2019/05/13(月) 22:16:41.75ID:ErXZ/V3c0
>>226
出来るよ。
普通はやらないだろうけど、会社のPCにAccessが入ってないとか、
Accessは入ってるけど、事務のおばちゃんがExcelにしがみついて、
意地でも離さないとか、そういう状況で使える。

>>227
JOINは普通に使える。
2019/05/13(月) 22:42:40.28ID:ATfYCMP60
>>234
そうか、JOINも普通にできるのか...

「Excelもデータベースとして有効に使えるよね」なんて方向に行って欲しくない、という願望が
俺の心の中にバイアスを生んだようだ
2019/05/13(月) 23:05:59.93ID:RqskJpspx
というかPowerQueryやDAXでデータベース的な使い方が出来てしまうからな今のExcelは
2019/05/13(月) 23:39:26.70ID:N0Eopnbu0
エクセルでできるってすごい!
そこで疑問に思ったんですが以下のVBA書いてみましたが

Dim adoCn As Object
Dim adoRs As Object
Dim strSQL As String
Dim DBpath As String

DBpath = ThisWorkbook.Path

Set adoCn = CreateObject("ADODB.Connection")
Set adoRs = CreateObject("ADODB.Recordset")
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & DBpath & "\SampleData.xlsx;"←@

strSQL = "select A,B,C from シート名 order by A desc" ←A
adoRs.Open strSQL, adoCn

*何か処理

adoRs.Close
adoCn.Close 'コネクションのクローズ
Set adoRs = Nothing 'オブジェクトの破棄
Set adoCn = Nothing

@について
プロバイダーとファイル指定の記述の仕方はあってますか?
Aについて
列の指定とfromの方法は?

教えてください<(_ _)>
238デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/13(月) 23:43:46.08ID:4/CDP/BQ0
秀和システムでいいから、古本を買って読めよw

ちゃんとサンプルが書いてある。アマゾンの古本は激安だぞ。
2019/05/13(月) 23:45:48.17ID:N0Eopnbu0
エクセルをデータベースとして使う記述があるのがどの本なのかさっぱり・・・
できれば本教えてもらえませんか?
2019/05/13(月) 23:47:08.95ID:adbFFiEz0
>>233
馬鹿は死ね
241デフォルトの名無しさん (ワッチョイ 375f-BEL3)
垢版 |
2019/05/13(月) 23:49:20.76ID:4/CDP/BQ0
>>239
Google検索でもサンプルは山のようにあるぞ。
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だけ書いたのを起動できるボタンどっかに置いとけばいい
■ このスレッドは過去ログ倉庫に格納されています