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/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なの?
2017/07/17(月) 22:18:26.02ID:xDa7p7Qa0
うんそれならまだわかる、たぶんそんな気がしてきた

Nullのとき正常終了してるケースがあるように見えたんだ
たぶん見間違いだ
2017/07/17(月) 22:19:24.38ID:xDa7p7Qa0
>>324
アドイン
2017/07/17(月) 22:46:19.63ID:1pUgrDrQ0
>>326
だっふんだ
2017/07/17(月) 23:33:07.69ID:2vYuRvlWa
まあ、VBAが言語としてクソなのは認めざるを得ないよな
最近javascriptつまみ食いしてるけど、これはこれで魔境とは言え進化してるしさ、常に
2017/07/17(月) 23:33:44.68ID:PT2PKaQfM
>>319
短絡評価が保証されてないというか無いものだと思ってたけど、短絡評価される状況ってあるの?
あるなら活用したいもんだけど。
2017/07/18(火) 00:17:38.11ID:kpygt+jXd
nullの話出たから聞きたいんだけどnullとかnothingの判定を完結にやるいい方法ってないの?
やりたいのはnull,vbnull,nothing,emptyなどなど値が入ってない状態を検知したい

全部if elseifでやるのは汚すぎるからあまりやりたくない
331デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/18(火) 00:18:33.82ID:sD2l3tVa0
>>330
全部調べる関数を作ればいいのでは?
2017/07/18(火) 00:19:09.03ID:zLdSm0oAM
判定メソッド作って呼ぶ
2017/07/18(火) 00:40:40.16ID:j/Xwl1qG0
If文を可能な限り避けるとなると

Function foo(hoge) As Boolean
Select Case VarType(hoge)
Case 0,1
...
Case 9
If hoge Is Nothing Then
End Select
End Function

みたいな書き方かな
2017/07/18(火) 00:43:00.33ID:8EqWFNQax
データの値の状態を判定するならif elseif よりも
Select Case Expressionの方が無駄なく綺麗に書ける
2017/07/18(火) 06:17:21.84ID:StSxL3ktr
>>333
ていうか、このコードは何を返すの?
2017/07/18(火) 06:18:50.83ID:qfl2YypxM
>>329
保証されてない ≒ 動作する場合があるかも知れないけど面倒だしどうでもいいから調べてない
2017/07/18(火) 06:20:35.94ID:qfl2YypxM
>>335
「値が入ってない状態」かどうかだろ
2017/07/18(火) 06:30:18.74ID:StSxL3ktr
>>337
なるほど。
null判定は自分で関数作っちゃうのが早いよってことね。
2017/07/18(火) 07:14:01.44ID:9/pR+lH4x
>>333
コンパイルエラー出るコードでワロタ
2017/07/18(火) 07:42:58.67ID:StSxL3ktr
こんな感じかな。

Function IsNone(hoge) as Boolean
  Select case True
    Case IsNull(hoge)
      IsNone = True
    Case IsEmpty(hoge)
      IsNone = True     
    Case hoge is Nothing
      IsNone = True
    Case hoge = ""
      IsNone = True
    Case hoge = vbnullstring
      IsNone = True
    Case Else
      IsNone = False
  End Select
End Function
2017/07/18(火) 08:48:10.34ID:XjshxdE9M
なんでこんな初心者用のスレでVBAはゴミだのカスだのドヤ顔でほざいてるの?
どうせ普段は別の言語で仕事してる奴が、ちょっと頼まれたVBAが解らなくてファビョってるんだろ?w
2017/07/18(火) 08:49:43.17ID:adssaMMv0
ファビョるって何?
2017/07/18(火) 10:01:29.10ID:gw3uuz5O0
先ずはググればいいんでないかな
2017/07/18(火) 11:27:07.20ID:LmZYlO3Ud
>>341
その状況なら確かに愚痴りたくなるだろうね
345デフォルトの名無しさん (オッペケ Sr39-nv+z)
垢版 |
2017/07/18(火) 12:19:29.42ID:1XJz7Xgqr
どうせ自称VBAに詳しいクズと自称メインは他言語のクズしかいないんだから仲良くしろよ
2017/07/18(火) 18:53:43.35ID:QCvagJCl0
>>341
他の言語出来るやつなら自分で調べられるし聞き方も賢くできると思うぞ
2017/07/18(火) 18:57:17.26ID:adssaMMv0
>>341
vbaで仕事は暇になるも、ひたすらすることがない。
コミュニケーション能力のほうが大事と気づくのに、そう時間はかからなかった

コミュ力も高まる言語、それがvba
2017/07/18(火) 19:02:27.52ID:FECT5IdT0
>>340
横からですが、借りてってもいいですか?
2017/07/18(火) 20:30:12.85ID:StSxL3ktr
>>348
もちろん自由に使えばいいけど、スマホで書いてるのでPCテストしてない。自己責任でよろしく。

読み返したら、Is Nothing のところは明らかにエラーになると思うので、こんな感じのほうがいいかも。(PCテストしてないので自信はない。あしからず)

Function IsNone(hoge) as Boolean
  If IsObject(hoge) Then
    If hoge Is Nothing Then IsNone = True
  End If
  Select case True
    Case IsNull(hoge)
      IsNone = True
    Case IsEmpty(hoge)
      IsNone = True
    Case hoge = ""
      IsNone = True
    Case hoge = vbnullstring
      IsNone = True
    Case Else
      IsNone = False
  End Select
End Function

なんか美しくないね。
ま、好きなように書き換えて。
2017/07/18(火) 21:03:49.93ID:FECT5IdT0
>>349
ありがとうございます。
エラーの度に色々悩んでたもので。
この辺を美しく書けるのが理想ですが、なかなか難しい。
2017/07/18(火) 21:10:08.24ID:adssaMMv0
僕は唱える 魔法の言葉 on error resume next
みんなで歌おう 魔法の言葉 on error resume next
2017/07/18(火) 21:12:18.15ID:FECT5IdT0
>>349
objectを掴めてないときのemptyとか、開放できないときのオートメーションエラーとかに悩まされて、ある程度解決してたんですが、これで最終解脱できそうな予感。
ありがたや。
2017/07/18(火) 21:59:56.82ID:jNcdEVA90
ExcelからOutlookを起動し、予定表から会議依頼を作成するマクロを作成しています
あらかた思っていたものは作れたのですが、自分の予定表ではなく共有の予定表に保存する場合のコードがさっぱり分かりません
共有の予定表での作成方法をご教示頂けますでしょうか
2017/07/18(火) 23:28:16.64ID:PXBpilE0x
>>349
IsObject(Expression)の判定をしてるIfブロックの終了間際にExit Function入れないとダメなんじゃね?
2017/07/19(水) 00:59:23.29ID:r34rJ2pSr
>>354
おっしゃるとおり。
あるいは、Select以下をElseでつなげるか。

でも美しくないので書き換えてみた。
結構いいんじゃね?(軽くテスト済み)

結局、>>333 が最適解だったわけね。
なかなかの実力者とみた。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty, vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case Else
      IsNone = False
  End Select
End Function
356デフォルトの名無しさん (ワッチョイ f191-+gV6)
垢版 |
2017/07/19(水) 02:45:10.33ID:3ENxF81t0
>>355
isNoneが未定になるパスがあるんじゃね
2017/07/19(水) 03:16:22.21ID:QlVhZGqo0
値とかオブジェクトが普通に入っている場合がすっぽり抜けてるんですがそれは
2017/07/19(水) 05:14:51.84ID:uwa7S77b0
>>355
Sub buf()
On Error Resume Next
For i = 1 to n
Set MyObj = SPAM
If Err then
If not IsNone(SPAM) then Brake
Else
Goto Continue
End if
Else
ここで処理。
Continue:
Err.clear
Set MyObj = Nothing
End if
Next
End sub

みたいな使い方を考えたんですが、全然美しくない・・・
どうすれば良いでしょうか。
2017/07/19(水) 07:05:15.04ID:n0rSSeVEd
空の配列チェックも必要だと思うな
2017/07/19(水) 08:00:32.56ID:r34rJ2pSr
>>357
IsNoneの初期値をFalseにすればいいんじゃね?
2017/07/19(水) 08:37:45.43ID:pHR1WedN0
As Booleanで指定した場合はデフォルトがFalseだからTrueになる条件だけ書いていけばいい。
2017/07/19(水) 09:22:45.29ID:hbRH2SWGM
ああなるほど、初期化って頭が全くなかった。サンクスです。
2017/07/19(水) 11:14:00.22ID:r34rJ2pSr
>>359
Case vbarray を加えればいいだけじゃね?

…って思ったら、配列の空判定は結構やっかいかも。

配列判定いる?
2017/07/19(水) 12:01:18.52ID:pHR1WedN0
どういうものを実装するかにもよるけど経験から言うと配列の判定は別の方がいい。
アプローチの仕方が違うから、変数単体で認識させていたものを配列突っ込める様にした時なんかにバグの温床になる。
2017/07/19(水) 12:23:01.26ID:n0rSSeVEd
>>364
もちろん目的によるけどね。
個人的には空の文字列は正常側だと思うし
2017/07/19(水) 12:24:14.19ID:n0rSSeVEd
あと空の配列チェックはIsMissingと同等
367デフォルトの名無しさん (オッペケ Sr5f-nv+z)
垢版 |
2017/07/19(水) 12:28:40.18ID:oLf4rjVBr
variant型は脊髄反射で否定するくせにvariantみたいなヤリマン関数が大好きなお前らってw
2017/07/19(水) 12:36:53.61ID:kmkgyzX6M
variantのみを使うor絶対variantは使わない
みたいな論争は見たこと無いな
2017/07/19(水) 14:51:31.77ID:pHR1WedN0
前スレかその前かの最後の方でVariant型絶対使わないマン出てきていた様な気がするけど。

そういう信条自体は別に良いんだけど、Variant型使えば解決出来る事を信条のせいで解決出来ず、
その結果として「VBAは欠陥」って言い出す変な人はこのスレでよく見かける。
2017/07/19(水) 15:28:03.09ID:GaPiK1nh0
便利な道具を使いこなせないドンくさい奴ってことだよ
2017/07/19(水) 18:00:12.50ID:3A2F1Rqpd
すいません、353ですが自決しましたのでスルーで結構です
コピペだけでなく内容も理解できるようもっと勉強します
2017/07/19(水) 18:04:33.44ID:n0rSSeVEd
自決
2017/07/19(水) 18:31:39.20ID:r34rJ2pSr
>>364-365
配列は要素数の空判定でお茶を濁そう。

これ以上のブラッシュアップは断念。
コードとしてはそこそこ美しいと思う。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty
      IsNone = True
    Case vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case vbArray + vbVariant
      If Ubound(hoge) = -1 Then IsNone = False
  End Select
End Function
2017/07/19(水) 18:35:56.55ID:r34rJ2pSr
訂正。最後、Trueだった。。(^_^;)

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty
      IsNone = True
    Case vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case vbArray + vbVariant
      If Ubound(hoge) = -1 Then IsNone = True
  End Select
End Function
2017/07/19(水) 18:47:58.49ID:pHR1WedN0
>>373
Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty,vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If Len(Trim(hoge)) = 0 Then IsNone = True
    Case Is >= vbArray
      IsNone = True
  End Select
End Function

ArrayはVariant型以外の場合もあるから、この方がいい。
2017/07/19(水) 19:22:16.26ID:r34rJ2pSr
>>375
おおー、まだブラッシュアップできたか。
素晴らしい。

それなりに使える関数になったかもね。
2017/07/19(水) 19:26:12.74ID:uwa7S77b0
素晴らしい。
2017/07/19(水) 19:29:01.56ID:+D5BELFr0
配列と型のチェックを同時にする時はとりあえず一次元配列に直せば楽ってばっちゃが言ってた
2017/07/19(水) 20:01:06.21ID:bbPNdV8fd
書いてから気づいたけどvbnullは型ではなくてただの列挙体なので判定しなくてもいいよな

あと““はなんかダサいからvbnullstring使うのがいいかも
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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