Excel VBA 質問スレ Part49©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/06/26(月) 02:15:14.60ID:T3ylemnb0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

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

※前スレ
Excel VBA 質問スレ Part48
http://mevius.2ch.net/test/read.cgi/tech/1494890685/

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/07/12(水) 21:28:35.71ID:xxYqMu/90
そもそも宣言しなくても特に問題はない
vbaの型なんてやわらかすぎてあってないようなもん、死にはせん
2017/07/12(水) 21:34:45.69ID:IZp09kNA0
>>223
もちろんさ!
ちょっと単体テストすりゃ全然平気!

唯一気をつけるのはNULLが来た時の扱いだけど、「NULLがあり得る」場合は結局避けられない問題だし
2017/07/12(水) 21:40:21.42ID:Nu9oIAfCM
ただこーゆー所でVariantプログラムって言うとなんやかんやめんどくさいので胸の内に秘めとくことをオススメする
2017/07/12(水) 21:47:21.99ID:IZp09kNA0
俺がそのVariantを全部なくしてやるよ!
 ↓
2017/07/12(水) 21:48:46.29ID:xxYqMu/90
NULLじゃなくてnothingでは
2017/07/12(水) 21:54:45.14ID:IZp09kNA0
>>229
まあNothingが来れば気を付けなきゃいけないだろうけど、NULLはDBから読んだデータソースに含まれている場合が多いから。
231デフォルトの名無しさん (ワッチョイ 778b-utq/)
垢版 |
2017/07/12(水) 21:55:54.59ID:vG3FHDEt0
She As Object
Set She = New LoveDoll
She.DressUp(MaidCostume)
She.Attach(SilliconVagina)
I.Fuck(She)
I.FinishAlone()
She.Detach(SilliconVagina)
I.Wash(SilliconVagina)
2017/07/12(水) 22:01:13.24ID:IZp09kNA0
5行目にSet her = She があればよかった
2017/07/12(水) 22:40:32.03ID:ybKMfalIa
VBEのインテリセンスを止める方法教えてください
2017/07/13(木) 06:37:01.82ID:zrnYEEn3x
NewSheetイベントの引数ShがObject型なのは、WorkSheetクラスとChartObjectクラスの両方でNewSheetイベントの呼び出しが定義されていて、実行時にしかShの型が決まらないからだと思うが
Workbook.Sheets(Index)の戻り値がObject型なのと一緒
2017/07/13(木) 12:57:05.14ID:vRW6wkrFa
variantとかobject形はコンパイルエラーで止めてくれないからめんどい
今ちょうど使いたい場面出てきてるんだが二の足踏んでる
2017/07/13(木) 13:12:36.23ID:9SrccZi40
指定日(A)から現時点(B)までの経過時間をミリ秒で取得したい場合、
どのようにしたら上手く取れるでしょうか?
VB.NETの時はGetTimeMillisecondsがあったので、(B-A).GetTimeMillisecondsで取得出来たんですが。
2017/07/13(木) 13:25:10.65ID:T6Wx4mwg0
APIのGetTickCountを使う
2017/07/13(木) 13:36:43.69ID:9SrccZi40
>>237
ありがとうございます。
GetTickCountも試してはみたんですが、システム稼働してからの時間だからか
自分では上手く取得できませんでした。
「指定日」(今回やりたいのは1970/1/1)からの経過時間をミリ秒取得するには
どのようにしたら良いでしょうか?
2017/07/13(木) 14:33:52.00ID:hn5wvxLda
>>236
doubleに変換して計算してまた変換するとか
2017/07/13(木) 17:11:00.53ID:mgpP2Dmux
>>238
ミリ秒に換算しろ
2017/07/13(木) 18:03:16.52ID:etRke/LM0
>>238
どうせそんな長いスパンならミリ秒はなんちゃってでいいんでしょ

Application.WorksheetFunction.RoundDown((Date - CDate("1970/1/1")) * 86400000 + Timer * 1000, 0)
242デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/13(木) 20:31:54.44ID:kGwztgTZ0
>>236
timediff()関数だかdifftime()があったはず
243デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/13(木) 20:34:22.33ID:kGwztgTZ0
datediff()だった
ただ秒単位が最小だった
2017/07/13(木) 21:05:07.35ID:WT5N9OT5M
Win32API の GetSystemTime( ) を呼び出して後は頑張って差を計算するなりすればいいだけでしょ
2017/07/13(木) 21:30:25.15ID:kQSmD3CQ0
そもそもソースがクソ精度のシステム時刻だからmsecなんてあてにならない気がする
直前にNTPで同期をとるとか?
246デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/13(木) 21:37:03.54ID:kGwztgTZ0
指定日から当日までをdatediffの秒単位で取得して
当日からその時刻までをmsで取得して
足し合わせればいいんじゃね
2017/07/13(木) 21:47:59.63ID:OJpyM90P0
ミリ秒の精度が求められる操作をVBAでって嫌だなぁw
2017/07/13(木) 22:44:18.16ID:etRke/LM0
作成するファイルやデータの一意な命名、識別とかに使うんじゃないの
だいたいでいいと思うわ
2017/07/14(金) 06:02:22.03ID:bYrN3J/p0
要件推理大会は終わった?
2017/07/14(金) 10:03:16.31ID:ak+4FQ9QH
要件って喪前らは横浜のシューマイ屋さんか!!!!


(´・ω・`)b
2017/07/14(金) 10:25:11.37ID:P3iXCzVv0
Range("250").ClearContents
2017/07/14(金) 22:15:23.51ID:ont4yiQP0
!!!?

その手があったか!!
今まで、真面目に名前を付けることしか考えなかったわ。

Dim Sh As Worksheet
Set Sh = Thisworkbook.Worksheets("(´・ω・`)b")

こんなのもありだな。
2017/07/14(金) 22:29:36.70ID:Ry5eHGcV0
そういやみなさん
その場限りの適当マクロじゃなくて
ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?

自分はまずセルに名前をつけて
Const hoge = "セルにつけた名前"
Range(hoge).value = "うんこ"

みたいなことやってます
ちなみに、シート名でもこれやってるんですが‥

シート名やセル名が変わる可能性を前提にしたら
こういうアプローチになるとは思うんですけど
結局凄く無駄なことをやってる気がして…(結局変えることあんまないし)

特にセルの名前に関しては、どうせその文字列をConstのところにハードコードするなら
名前つけずに
Const hoge ="A1:B5"
でもええやんけとか思ってるんですが
行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり…
2017/07/14(金) 22:44:26.51ID:YONW9HHx0
>>252
こういうのもあるよ
https://github.com/masarakki/nyaruko_lang
255デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/14(金) 23:03:04.97ID:QoWI5XEA0
>>253
セルに文字列で意味をつけて
その文字列を検索して特定する
そのセルからのオフセットを固定しておく

例えば列名とか行名とか
2017/07/14(金) 23:10:22.98ID:P3iXCzVv0
>>253
よくある表の列の増減対応する場合は
列挙体で列名を定義しておいて
Cellsで列名を参照させてる。
途中にぶっこんでも列挙体のほうをちょろっと書き換えればいい。

行にも対応させると、面倒かも。
2017/07/14(金) 23:41:07.46ID:ont4yiQP0
>列の増減

会社のやつ、一切弄れないようにしたわwwwww
セルを保護するとかじゃなくて、
データの更新時に、全消しして再描画するのwwwwwwwwww
列挿入とかしても無駄ですよってwwwwwww
2017/07/15(土) 00:03:43.14ID:fdp++JjU0
そういうの、このスレだと基本だと思う
・正規化したデータを引っ張ってくる
・ボタン押したらvbaで構築。シートすら削除して再作成
こんなんばっかだろ。誰もさわれなくて非難轟々だけど、どうかんがえてもこっちのほうが安全なんだよな
259デフォルトの名無しさん (ワッチョイ e251-X5vM)
垢版 |
2017/07/15(土) 00:11:34.38ID:CxBosAMp0
https://www.youtube.com/watch?v=dpizDazz9Fg
https://www.youtube.com/watch?v=HpX_uJUX92U
https://www.youtube.com/watch?v=XHV9lUNP6rA
https://www.youtube.com/watch?v=4UPAWP730a0
2017/07/15(土) 00:12:14.92ID:kt01pjYOM
学ぶ気のない人からとても怒られるやつ
2017/07/15(土) 00:49:22.52ID:K6V0aa5ld
>>253
普通にやってるしシート名とかも定義する
あとは汎用的なクラスや関数いくつも作っておいて雛形エクセルにしてる
262デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/15(土) 04:37:45.96ID:7LAckzVN0
>>256
コードをいじらないといけないじゃないか
263デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/15(土) 04:53:42.10ID:7LAckzVN0
>>258
データの更新自分しか出来ないんじゃね

参照しか出来ないならwebシステムにすればいいんじゃね
2017/07/15(土) 08:42:06.63ID:tWt2y1Te0
>参照しか出来ないならwebシステムにすればいいんじゃね

ヒント:権限
2017/07/15(土) 09:43:36.21ID:jhhap/jh0
>>253
> ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?
状況次第だけどよくアクセスするとか重要なセルは適当なところでまとめて変数に代入してる
Dim hoge As Range
Set hoge = Range("A1")
...
hoge.value = "うんこ"

> 行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり…
行とか列の挿入を想定するなら名前をつけてそれで参照する
ユーザーが作成するようなシートなら特定の文字列を検索して場所を特定するとかもやる
266デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/15(土) 09:44:21.75ID:7LAckzVN0
>>264
自分に権限がないなら権限を持ってる人に許可貰えばいいだけじゃね?

なんの権限か不明だが
267デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/15(土) 10:08:30.41ID:7LAckzVN0
>>258
批難がでるって事は不便な点とかがあるって事で
仮にそれが商品だとしたら売れない可能性があるってこと

競争相手がいたら使われなくなる商品
2017/07/15(土) 11:40:57.26ID:aW477mPhM
>>267
売れてるiPhoneのスレでも見てこいよ
売れない/使われないものをいちいち非難するほど人は暇じゃない
269デフォルトの名無しさん (ササクッテロラ Sp72-+gV6)
垢版 |
2017/07/15(土) 11:48:46.46ID:CRqbHh/Cp
>>268
売れないなら批難は出ないと言う主張なら
批難轟々なら売れるって事だよな

じゃ売ってみればいいんじゃね?
270デフォルトの名無しさん (ササクッテロラ Sp72-+gV6)
垢版 |
2017/07/15(土) 11:50:44.37ID:CRqbHh/Cp
>>268
それは代替品がある場合だ
その代替品に乗り換えれば済むから

社内とかの代替品がなければ嫌々でもそれを使うしかない
2017/07/15(土) 12:33:52.46ID:hu77KrcYM
>>269-270
レスを分けて書く奴はもれなくバカの法則 w
2017/07/15(土) 16:36:10.60ID:fdp++JjU0
>>271
それ面白いか?
別に面白くないけどなぁ
2017/07/15(土) 17:34:03.53ID:0urlci1o0
VBAのマクロって

・マクロ制作者本人の操作を補助する為のものであり、他人に使わせる事は想定されていない
・オフィス製品の操作を補助する為のものであり、アプリケーションの本来の振る舞いを超えた動作は想定されていない
・ユーザーフォームはマクロの操作を容易にする為のものであり、別のアプリケーションであるかの様に振る舞う事は想定されていない

なので想定されていないものを作ろうとしたら不便さを感じるのは当然
どんな言語もそうだけど、想定された使い方なら便利だし、そうでないなら不便だよ
2017/07/15(土) 17:40:17.34ID:Id32lc0P0
>>255
なるほど
例えば
○年○月 の○のセルを指定する際に
「年」のセルを探してOffset(0,-1)する、みたいな感じですかね
自分はこれも名前つけて管理してましたが
セルが1つの場合はそれで良さそうですね
ただ、全く同じ内容のセルが検索範囲にないことが保証された運用にしないとバグりそうなのでちょっと怖いかも


>>256
表に対してレコードセットみたいなアクセスをしたい場合に
つい最近その方法を知って目からウロコでした
とにかくインテリセンスを効かせたい派なので・・
http://thom.hateblo.jp/entry/2015/12/17/000132
こういうことですよね

行方向に関しては、列のように各行に別々の意味を持たせるような使い方はしたことないので
問題ありませんね

>>261
自分は簡単なSQLを作る(ANDとかORで結合するだけ)に特化したStringBuilderみたいなのだけ使ってますね

>>265
やっぱ可変範囲のこと考えると名前つけるのは意味ありますよね
2017/07/15(土) 17:47:17.89ID:Id32lc0P0
>>273
>他人に使わせる事は想定されていない
これは本当に思いますね
Accessなんかはフォームでの入出力が基本だし
各データの型も指定するから
出来ること出来ないことを設計者が細かく指定しやすいですが
Excelは書式や入力データを限定させようとすると
そのノウハウの習得のことも考えたら相当な時間がかかる気が…

以前「値のみの切り取り・コピーしかできない」ようにしようとして
えらい苦労しました
2017/07/15(土) 20:37:21.43ID:VxLYhzBT0
所詮道具 しかし便利な道具 それをよりによってなんで使い辛くするのか 神経を疑うわ
改変、改ざん、変更がダメならそっちに注力すべきだろ
バックアップなりPDF出力なり変更者・変更ヶ所の記録なりなんなり
余計な仕事して会社の利益を浪費すんなよ
277デフォルトの名無しさん (アウアウウー Sa08-6eVw)
垢版 |
2017/07/15(土) 20:57:08.80ID:4AnbxIb9a
Excel VBA一本で家族養って食っていけてる人いる?
2017/07/15(土) 21:01:14.05ID:+h55DWxyM
ねーよ
2017/07/15(土) 21:06:42.25ID:DU1ghimfa
>>277
vbaしか扱わない仕事なんて無いよ
必ず何かのついで
vbaあると事務作業の確実性は上がるけどね
2017/07/16(日) 05:14:50.82ID:QwczUPDI0
>>279
プログラマー志望でvbaの仕事しかやったことないんだが。
2017/07/16(日) 05:59:58.39ID:K064oJPl0
>>280
クルマで言えば「1車種しか運転できない」のと同じ
プログラマになろうなど論外
2017/07/16(日) 06:33:45.85ID:QwczUPDI0
>>281
別の言語の方が得意なんですけどね。。
他言語のキャリアないから呼ばれない。
2017/07/16(日) 07:32:23.57ID:xeCnao79M
>>277
半年ぐらいならあるよ
社内システムの一部を担当しててVBAだけずっとやってた
もちろんそれに付随する仕様書とかマニュアル作りとかも含むけど
2017/07/16(日) 16:35:01.30ID:u74giIrqa
自分は業界デビューがAccessVBAで、そのうちC/C++もやるようになった。
で、今PHPとかJavaとか知らなくて仕事減ってきてる。
2017/07/16(日) 16:40:12.30ID:/sDyct4MM
ならVB.NETを経由してjavaへ向かえばよい
2017/07/16(日) 16:42:28.30ID:D4hbmADJ0
PHPは言語は楽ちんだけどネットワーク周りがキツイ
専サバならどうでもいいけどレンタルサーバーだと制限多くて何もできん
2017/07/16(日) 17:31:35.42ID:TYIh6T1E0
>>280
vbaでシステム開発してんの?
2017/07/16(日) 19:11:10.92ID:x6N2dGq3M
VBA4とかの時代はなぜかユーザー定義型のリファレンスをクラスモジュールに渡せなくて悩んだ覚えがあるけど最近は大丈夫なのねと
2017/07/16(日) 19:14:48.07ID:zK8m4MiwM
>>287
うん。
50万ぐらいのレコードを扱う、MySqlをバックエンドとしたC/S型のシステム作ったよ。

vbaは例外ハンドラが弱すぎて、自作スタックトレースみたいな仕組みを作ったりとか、バージョン管理大変だし、vbaでシステム開発は怖すぎてやりたくないっす。

初速はいいけど、規模が大きくなってくると生産性が著しく落ちるねー。
2017/07/16(日) 21:17:30.80ID:TYIh6T1E0
>>289
クレイジーだな
VBAでやるの間違ってね
2017/07/16(日) 21:52:55.66ID:ZbG5GhXO0
>>290
バックエンドがMySQLなら50万レコード程度は楽勝だろうしフロントエンドにExcel VBAはたいして珍しくないぞ
2017/07/17(月) 17:06:22.75ID:7pjXcMGRr
そもそも、VBA使いってエンジニアじゃないよね。

なので、エンジニア目線での会話はしないほうがいいよ。
293デフォルトの名無しさん (オッペケ Srd7-OYLW)
垢版 |
2017/07/17(月) 18:01:49.57ID:eqSf35i7r
はぁ?
2017/07/17(月) 18:28:51.63ID:3BLwA/g5M
方言で喋るヤツは日本人じゃないよねみたいな言い回しは嫌い
2017/07/17(月) 19:25:12.99ID:7pjXcMGRr
エンジニア畑の出身ではないということ。

エンジニア畑を歩いてきた人はVBAなんかには染まらないよ。
2017/07/17(月) 19:31:25.65ID:25jot5xr0
スネオみたいなやつだな。
2017/07/17(月) 19:34:15.32ID:3BLwA/g5M
じゃあ東京出身以外は日本人じゃないんだね

哀れな見識の狭さだな
2017/07/17(月) 19:41:09.32ID:7pjXcMGRr
東京出身で大阪に住んでる人は関西人じゃないし、大阪出身で東京に住んでる人は江戸っ子ではない。
2017/07/17(月) 20:03:54.32ID:8yOMdWeDM
他の言語をバリバリ使うエンジニアがVBA使うなんていくらでもあるだろ
2017/07/17(月) 20:05:31.04ID:KYGC98nRx
ID:7pjXcMGRr
スゲー承認します
2017/07/17(月) 20:12:26.22ID:7pjXcMGRr
馬鹿の一つ覚えみたいに、なんでもかんでも変数に入れちゃうし、しかもいまだにハンガリアン記法だったりする。
エラー対策もバッチリですと言わんばかりにエラー処理が延々と続くコードを晒す。
ただでさえ冗長な言語なのに輪をかけて冗長なコードを書く。
誰もお前のコードなんかコピペしねーからコアな部分だけを簡潔にかけ、と言いたくなる。
VBAが書けるぐらいでエンジニアづらするな。
2017/07/17(月) 20:14:06.57ID:7pjXcMGRr
>>299
VBAメインという人はいないよね。
2017/07/17(月) 20:19:25.98ID:ZwJXO/8Y0
vbaメインは事務職だろう
2017/07/17(月) 20:21:12.48ID:7pjXcMGRr
>>303
そうそう。エンジニアじゃないのよ。
2017/07/17(月) 20:22:42.87ID:3BLwA/g5M
>>302
あれ?
VBA使いはエンジニアじゃないんじゃなかったっけ
2017/07/17(月) 20:25:53.47ID:7pjXcMGRr
>>305
つまみ食いするエンジニアはいるでしょ。
2017/07/17(月) 20:34:45.10ID:U2FIHXXv0
>>302
VBAメイン縛りなの?
2017/07/17(月) 20:37:52.24ID:3BLwA/g5M
お前の中ではVBAからプログラムに入り今は別言語メインってやつは存在しないんだね
309デフォルトの名無しさん (ワッチョイ ef11-+gV6)
垢版 |
2017/07/17(月) 20:54:22.06ID:ZHV5JA270
エンジニアかどうかってプログラム言語に依存する概念だっけ?
実現手段なんかコロコロ変わるのに
2017/07/17(月) 20:56:09.78ID:ZwJXO/8Y0
vbaからhtml・phpに行ってなんか社内SEみたいなことやってるわ
割りと楽
2017/07/17(月) 21:13:30.47ID:7pjXcMGRr
>>307
うん、縛り。


>>308
多くのエンジニアの中で揉まれた経験があるかどうか、だよね。


>>310
ありがちだよね。「みたいなこと」止まり。
いわゆる「エンジニアもどき」ってやつw
2017/07/17(月) 21:14:47.84ID:K9hU24AK0
エンジニアは2ちゃんねるに来ないだろう
2017/07/17(月) 21:32:12.23ID:3BLwA/g5M
>>311
揉まれた経験からだと言う割にメイン言語で縛ってたりVBA出身は違うとか言ったり

主張は明確に頼む
2017/07/17(月) 21:38:42.01ID:xDa7p7Qa0
ExcelVBAの挙動が謎すぎて困る
IF xx IS NOT NULL AND xx.value = 100
みたいので例外出たときは目を疑った

nullのときも両辺評価するって決まってるならまだしも
普段は何事もなく動いてるのに
急に気まぐれに両方評価するのやめーや…
2017/07/17(月) 21:39:52.50ID:7pjXcMGRr
>>313
君こそ何が言いたいのかよくわからないけど、
まぁ、コードは簡潔に、ということ。
2017/07/17(月) 21:45:47.60ID:3BLwA/g5M
>>315
俺の言いたいことは「方言で喋るヤツは日本人じゃないよねみたいな言い回しは嫌い」ってだけ

コードは簡潔にって所は同意見だな
2017/07/17(月) 21:50:52.95ID:ZwJXO/8Y0
>>314
今更だろう
longな数値同士を文字列結合できるぐらいなんだし、何が起こっても驚かん

Sub foo()
Dim a As Long
Dim b As Long
a = 1
b = 2
Debug.Print a & "|" & b
End Sub
2017/07/17(月) 21:51:23.92ID:ZwJXO/8Y0
ってかvbaって実は内部的に全部variantで処理してない?と思うことがたまによくある
2017/07/17(月) 22:01:54.76ID:U2FIHXXv0
>>314
短絡評価が保証されてない言語で
> IF xx IS NOT NULL AND xx.value = 100
なんて書く奴の方が謎
NothingじゃなくてNULLなのも謎
あとNULLならIsNull( )じゃないのも謎
2017/07/17(月) 22:05:39.05ID:xDa7p7Qa0
知らんがな!そんな詳しくない

環境制限されて使わざるをえずに使って
ちょっとカルチャーショック受けただけ
2017/07/17(月) 22:09:42.75ID:xDa7p7Qa0
まえ2chでEXCELVBAが挙動アバウトだから使いたくないって言ったら
お前の頭がアバウトなだけでVBAはアバウトじゃないって返された

ほんとにアバウトやん
2017/07/17(月) 22:11:29.92ID:5wPRLPZU0
いつもながらの仲間内のどうでもいい戯言が続いているだけなんで、質問者の方は気になさらずにどうぞ〜
2017/07/17(月) 22:13:55.47ID:K9hU24AK0
>>314
>「nullのときも」
Nullかどうか関係なく AND 演算子がつねに両辺評価だってだけよ
2017/07/17(月) 22:16:50.48ID:K9hU24AK0
>>320
ところでちょっと興味あるんだけど「環境制限」て何がNGなの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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