X



Excel VBA 質問スレ Part60

レス数が900を超えています。1000を超えると表示できなくなるよ。
0809デフォルトの名無しさん
垢版 |
2019/04/20(土) 12:29:15.35ID:lNRl64h3
>>807
'forなどで回す時はラベル付けて飛ばす
Sub foo()
On Error GoTo err
For i = 1 To 5
bar = WorksheetFunction.VLookup(1, Range("a1"), 1, 0)
'エラーじゃない時の処理
err:
'共通の処理。無ければ何も書かない
Next
End Sub

'使い捨てプログラムならonerrorで囲んでしまうという手もあるが、あまりオススメできない
Sub foo()
On Error Resume Next 'エラーを無視
bar = WorksheetFunction.VLookup(1, Range("a1"), 1, 0)
On Error GoTo 0 '無視を無効化
End Sub
0810デフォルトの名無しさん
垢版 |
2019/04/20(土) 12:43:34.58ID:50ElbllH
>>809
お前ね何度書けば・・・
Sub foo()
On Error GoTo err
For i = 1 To 5
bar = WorksheetFunction.VLookup(1, Range("a1"), 1, 0)
'エラーじゃない時の処理
goto 共通
err:
ERR時の処理
共通:
'共通の処理。無ければ何も書かない
Next
End Sub
0815807
垢版 |
2019/04/20(土) 15:39:14.34ID:J0kjNxAu
on errorはセンスがないように感じるのですが。
わたしのセンスがon errorを使うことを許しません。
どうしたらいいですか?
こんなとき定番のような方法はないですか?
0816デフォルトの名無しさん
垢版 |
2019/04/20(土) 15:49:30.44ID:Khb9FcyX
on errorで問題ないならそれで良いじゃん
そんな瑣末な事に時間を使わずにもっと生産性のある事に時間を使って組織や社会に貢献して下さい
0817デフォルトの名無しさん
垢版 |
2019/04/20(土) 15:56:13.97ID:9HZyCDJw
On Errorを使うのがセンス無い?
何処の初心者だ?

想定された動作なのに一緒くたにするのが嫌というならOn Errorの使い方を知らないだけだろ。
0821デフォルトの名無しさん
垢版 |
2019/04/20(土) 16:44:47.04ID:lNRl64h3
vbaにtrycatchが無い以上、onerrorで分岐するしかない
ただ今回に限って言えば、ワークシートにvlookup()を入れてその結果で分岐させることは可能
0822デフォルトの名無しさん
垢版 |
2019/04/20(土) 17:45:57.42ID:V7SrR6WW
こんな方法もある

Range("Z1") = WorksheetFunction.VLookup( 略 )

結果をどこか空いてるセルに入れてしまえば、エラーでも止まらずに結果を判定することができる
もうひとつ、試したことはないけど

WorksheetFunction.Iferror( WorksheetFunction.Vlookup ( 略

みたいな方法でもエラーで停止するのを回避できそうな気がするけど、Vlookupで止まるかなあ
0827デフォルトの名無しさん
垢版 |
2019/04/20(土) 19:43:05.64ID:qwsd80fG
>>807
・VlookupじゃなくてFindを使う
・事前にcountifとかエラー値が返らないもので存在確認してから使う
・worksheetfunctionの代わりにApplication.VLookupを使うと見つからなかった場合N/Aが返るが、旧バージョンの命令だからあまりおすすめしない
0828デフォルトの名無しさん
垢版 |
2019/04/21(日) 10:03:39.80ID:fPscZosh
質問者は、もっと具体的に書くべきだな、対応方法は多種多様にあるから
質問に対するベストな回答が、質問者の意図するベストの回答とは限らん
0830デフォルトの名無しさん
垢版 |
2019/04/21(日) 15:59:22.44ID:IGJB+uLA
んて訳の分からん面倒なコードを書くとかキチってるよね
0835デフォルトの名無しさん
垢版 |
2019/04/21(日) 17:37:30.55ID:VJZKP3mE
>>831
お前の言ってることは結局、コ−ド書かないと動かないって酷くないですかってのと同じ。
0836デフォルトの名無しさん
垢版 |
2019/04/21(日) 17:51:22.14ID:fXlSQHRa
>>834
アスペか?
配列の次元を取得するのにOn Errorを使うなどという事自体は酷い。これは事実だ。
それに対して「何も分かってない」とdisる以上、On Errorを使わない真っ当な方法があると解釈するのが当然のこと。
0842デフォルトの名無しさん
垢版 |
2019/04/21(日) 18:19:22.95ID:VJZKP3mE
>>840
それはVBAに無いものをあげつらっているだけ。
VB.netやC#に無いものをあげつらうことも出来るだろ。

そもそも何が酷いのかサッパリ分からん。
0843デフォルトの名無しさん
垢版 |
2019/04/21(日) 18:26:29.16ID:fXlSQHRa
On Error とか例外機構っていうのは、メモリ不足とかファイルの不在なんかのソフトウェア的には想定しづらい
例外的な事象に使うものなんだよ。
例えば「関数引数に対する事前条件がもし守られていなかったら」なんていう
ソフトウェア的に想定できるような事には例外を使うのべきじゃない。
ましてや配列の次元の取得なんてことに使うのは「ひどい」としか言いようがない。
それはセンスとかの問題じゃなくて常識だと思うよ。
0848デフォルトの名無しさん
垢版 |
2019/04/21(日) 18:47:06.02ID:VJZKP3mE
例えば昔仕事で扱ったWin32APIのGetPrinterでは取得するPinterInfo2構造体のサイズを0にして渡して敢えて失敗させることによって正しい構造体のサイズを取得するなんてのがある。
再度正しいサイズで実行するやり方が想定されていて、そして失敗時はdllエラーも当然発生するなんてのが有るわけなんだが。

確かDevmode構造体を取得するする時に使うDocumentPropertiesも同じような使い方してたと思う。
0850デフォルトの名無しさん
垢版 |
2019/04/21(日) 18:48:56.55ID:fXlSQHRa
>>844
まず次元の取得方が標準で用意されていない点が少しひどい。
さらにそのワークアラウンドがOn Error利用である点が一層酷い。
わかる?
これでキミもバッチリだ。
0853デフォルトの名無しさん
垢版 |
2019/04/21(日) 19:11:57.22ID:jEVddS48
>>841
実質同じ事って言い出すと何でもアリになってしまう
onerrorしかないと可読性が大きく下がる

ところでEXCELで次元数を取得する機会って一度も無いんだけど、
よく使う計算なのか
0855デフォルトの名無しさん
垢版 |
2019/04/21(日) 19:17:57.47ID:sGJaU8ZR
>>853
多分、配列を初期化したかしてないかの話じゃないかと思うね。
UBoundでエラーが出る話だろう。
で、Sgnが嫌なんだろう。
0856デフォルトの名無しさん
垢版 |
2019/04/21(日) 19:35:22.79ID:uW2zy1zl
>>848
それはちゃんとドキュメント化されてるだろ
On Errorで次元を取得するのとはレベルが違うよ
動けばいいと言うレベルのコーダーならいいのかも知れないけど
0857デフォルトの名無しさん
垢版 |
2019/04/21(日) 19:54:31.81ID:sGJaU8ZR
>>856
何言ってるの?
On Errorしかないのが正式なら同じだし、
On Error以外に正式なものがあれば問題ないし、
同じことじゃねーかw
しかも後出ジャンケンかよw

結局言い掛かりもいいところだ。
0858デフォルトの名無しさん
垢版 |
2019/04/21(日) 20:04:00.06ID:fXlSQHRa
On Error 以外に配列の次元取得方法がないと決まった訳じゃなくて、よく知られてる方法がOn Error利用だってだけだが、
割り切ってAPIを呼んでいる人もいる。
0859デフォルトの名無しさん
垢版 |
2019/04/21(日) 20:08:00.46ID:x8017e7/
>>749
え、お前の会社って稟議書や経費精算の業務って全部署共通じゃないの?
その会社固有の業務だけど、部署間で使い回しの効く部分のことを言ってるんでしょ?
0860デフォルトの名無しさん
垢版 |
2019/04/21(日) 20:13:12.66ID:xKbBXXRb
>>843
とりあえず構造化例外処理すらない時代の言語にいってもしょうがない話
常識は時代で変わるんだよ
結局はVBAは古い時代の言語ってだけ

あと、配列の次元が知りたいとか設計が悪いとしか思えん
0862デフォルトの名無しさん
垢版 |
2019/04/21(日) 20:28:15.67ID:uW2zy1zl
>>860
> あと、配列の次元が知りたいとか設計が悪いとしか思えん
君には不要というだけの話
他の言語では普通に多次元配列用のライブラリとかある
0866デフォルトの名無しさん
垢版 |
2019/04/21(日) 21:27:51.81ID:4kO5c1T5
じゃあどうしてもOn Errorが嫌だとして、
他の方法が幾つか出てるんだから、それ試しなよ。
0867デフォルトの名無しさん
垢版 |
2019/04/21(日) 21:47:12.89ID:jEVddS48
trycatheなら関数に封じ込める事ができるけど、
onerrrorはグローバルだから全体に影響してしまうのが最高に糞なんだ
正直、グローバルじゃなければ別にonerrorだろうとなんだろうと構わんのだよ
0868デフォルトの名無しさん
垢版 |
2019/04/21(日) 22:30:28.20ID:lDsGwf3y
on errror が糞とかどうとかお前の趣味に合わせて出来てる訳じゃ無いんだよアホウ
0869デフォルトの名無しさん
垢版 |
2019/04/21(日) 22:32:03.89ID:fXlSQHRa
>>866
君の言う通りだ
反発を受けてるのは「文句言わずにonerror使え」とか言い出した奴ですよ

ただ次元数をライブラリに渡せっていうのはナシだ
0871デフォルトの名無しさん
垢版 |
2019/04/21(日) 22:57:54.67ID:sGJaU8ZR
>>861
大いなる自己矛盾の中にいることに気付かないとはね。
論理的思考能力が無いならプログラムを組むのなんか辞めることだな。
0872デフォルトの名無しさん
垢版 |
2019/04/21(日) 23:18:19.59ID:FIa/C0XL
ついに公務員の副業が解禁される時代が到来した
https://hybridstyle.net/side-job065/
フリーランス市場規模が20兆円を突破 -副業は8兆円-
https://hybridstyle.net/work-style020/
時代は週休3日制へ【週休3日制導入企業まとめ】
https://hybridstyle.net/work-style016/
会社員の副業が急増、副業フリーランス4年で3倍、経済規模は約8兆円??副業収入は平均74万円
https://www.businessinsider.jp/post-165077#cxrecs_s
本業のストレス解消、副業で月70万、転職のお試し…会社に内緒で副業する人たちの本音
https://www.businessinsider.jp/post-176835#cxrecs_s
どんな仕事でいくら稼いでいる? 副業をしている13人に聞いたそのリアル
https://www.businessinsider.jp/post-180772#cxrecs_s
会社が個人を縛り付ける時代は終わった。これからは、個人が仕事を求めて、チャンネルのように会社を切り替えていく。
https://www.wantedly.com/companies/newpeace/post_articles/65530
誰も教えてくれなかった「フリーランスは厳しい」ではなく「甘い」という真実。
https://www.wantedly.com/companies/newpeace/post_articles/54124
【特集】年収1000万円以上「フリーランスの流儀」vol.2
https://tabi-labo.com/286733/journey-six-figure-freelance-nathan
「排出物ゼロ、廃棄物ゼロ、貧困ゼロ」究極のエコ・リゾートがフィリピンに
https://tabi-labo.com/284193/nautilus-eco-resort
仕事は9割外注すれば売り上げが爆増する
https://headlines.yahoo.co.jp/article?a=20190416-00028392-president-bus_all
0873デフォルトの名無しさん
垢版 |
2019/04/22(月) 04:52:26.38ID:PMsDbBhF
>>871
何を言いたいのさっぱりかわからんw
低能が反論できずに有耶無耶にしたいときによくやる方法だな
0875デフォルトの名無しさん
垢版 |
2019/04/22(月) 08:55:19.16ID:aI1C8h9/
>>867,.874
onlocalerrorってなんだ、初めて聞いたわ
そもそもon errorはグローバルじゃないぞ

Sub foo()
Call bar
a = 1 / 0 'ここでエラーになる

End Sub

Sub bar()
On Error Resume Next
a = 1 / 0 'エラーにならない
End Sub
0876デフォルトの名無しさん
垢版 |
2019/04/22(月) 09:24:57.57ID:J7q/uljF
>>873
やっぱり分からんかw
お前はドキュメント化されていれば正式だと言ってる。
しかしそれは結局MSの判断ということだ。

お前はOn Errorが正式では無いという回答そ貰ったのか?
そうでなければお前の「正式な方法がないって話だぞ」というのはお前の決め付けだ。

結局お前の中には矛盾した2通りの正式が存在することになる。
0877デフォルトの名無しさん
垢版 |
2019/04/22(月) 11:15:47.81ID:5Mb1x8/S
local付けると局所だと思ってたけど、配下に有効みたい。
つまり、付けても動作に変わりはない(?、詳細は試してない)
0878デフォルトの名無しさん
垢版 |
2019/04/22(月) 11:20:03.08ID:5Mb1x8/S
昔試したときに、local有無で動作違ってたはずなんだけどな…
まあ、配下に有効だから、goto 0で無効にしてから callすれば局所化は可能かと
0879デフォルトの名無しさん
垢版 |
2019/04/22(月) 11:24:44.90ID:aI1C8h9/
>>877
呼び出し先で親要素のon erroの状態が有効なのはもともとなので、使ってもあまり意味は無い気がする

on local もう廃止されたっぽい?MSDNにも無い
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/on-error-statement#see-also

互換性のためにあるってブログ記事見つけたけど、かなり古い
https://www.papy.in/bbs/vb2/200401/04010015.html

なんやろね
0880デフォルトの名無しさん
垢版 |
2019/04/22(月) 12:01:35.50ID:16RvV/Xe
俺も On error Goto でtry Catchと同程度のことができると思ってた
要するに書き方かなと思ったが1回目のエラーはいいがそれ以降が使えないじゃん?
ネストするにも無理があるな、複数の場所(例えば2重ループで)でのやり方があるかもしれんが
無理じゃない?
俺は「On error Goto」で出来ると思ってた、やり方があれば申し訳ないが教えてほしい
0881デフォルトの名無しさん
垢版 |
2019/04/22(月) 12:11:57.97ID:iJf9Bl/o
エクセルで、複数ブックの特定文字列だけ一気に変えるマクロってどこかで紹介されてますか?

例えば2018年4月21→2019年4月23日に変える感じです

日付が入力されているセルがそれぞれのブックでバラバラなので、セル指定置換はできないようです
0882デフォルトの名無しさん
垢版 |
2019/04/22(月) 12:22:36.94ID:CZHT0AcU
>>876
よほど多用されてるとかでない限りいちいち〇〇は正式じゃないなんて言う回答なんてするわけ無いだろ
レスが馬鹿すぎるw
0883880
垢版 |
2019/04/22(月) 12:24:36.91ID:16RvV/Xe
例えば
Private Sub CommandButton1_Click()
Dim ShNM
For i = 1 To 6
Sheets(1).Activate
ShNM = Range("A" & i).Value
On Error Resume Next
Sheets(ShNM).Activate
GoTo Kyoutuu
Nosheet:
Kyoutuu:
Next i
End Sub
この式は最初のシートを「Z」としそのA列の行1〜6に例えば「A」〜「F」まで書いて
シートを「Z」以外にシート名を「A」〜「F」までの内3つしか作ってないと、「.Activate」で2回エラーになるが1回目は意図した動作だが
2回目のエラーでメッセージボックスが出る
回避方法を教えてほしい
0884デフォルトの名無しさん
垢版 |
2019/04/22(月) 12:30:37.21ID:16RvV/Xe
赤っ恥
On Error Resume Next
はこれなら大丈夫だが
On Error GoTo Nosheet
はNGって話です でもそれじゃあ書いてる意味がないので
結局
On Error Resume Next で次を考えるなかななの、一番使いたくないんだが
0885デフォルトの名無しさん
垢版 |
2019/04/22(月) 12:39:43.58ID:aI1C8h9/
On Errorは全体に作用しすぎるから、isError的な感じでfunction分けた方が良いんじゃないか
0886デフォルトの名無しさん
垢版 |
2019/04/22(月) 14:10:46.51ID:5Mb1x8/S
>>884
onerrorgotoをメインの処理の流れ制御には使わない方がいいと思う。

On Error Resume Nextは、次行にエラーがあると想定されるときに使い、If Err.Numberで判定して、その値によって処理を変える。

On Error GoTo は、どちらかというと、一つの処理(subやfunct…)の頭で宣言し、想定外のエラーを検知してエラーを出すのに使う。
0887デフォルトの名無しさん
垢版 |
2019/04/22(月) 15:22:43.51ID:16RvV/Xe
>>886
ありがとう、他の言語も使ってるから勘違いしていた
対応することはもちろんできるし、Excelの環境を利用しながらの
プログラムは有効なので、仕方ないのであれば考えるは
考えてなかったのが、お恥ずかしい
0888デフォルトの名無しさん
垢版 |
2019/04/22(月) 15:50:34.25ID:NGsjV6Cl
なんかアプデ来てからwebクエリのバグが起こって実行エラー 1004で読み込めないんだけど
俺だけ?
0890デフォルトの名無しさん
垢版 |
2019/04/22(月) 16:30:51.55ID:NGsjV6Cl
>>889
「Webクエリによって返されるデータがありません」とか言われるけど
読み込み先のWebページみても仕様の変更とかURLの変更とか見られないし明らかにExcelアプデが原因っぽいんよなー
0893デフォルトの名無しさん
垢版 |
2019/04/22(月) 20:20:53.32ID:TdnLJYYl
>>883
シートの存在チェックをしないままActivateメソッドをコールしてるからエラーになるんだろ

Private Sub CommandButton1_Click()
Dim ShNM As String
For i = 1 To 6
Sheets(1).Activate
ShNM = Range("A" & i).Value
If SheetExists Then
Sheets(ShNM).Activate
Else
'Nosheetのラベルの箇所に書いていた処理
End If
'Kyoutuuの所に書いていた処理
Next i
End Sub

Function SheetExists(ByVal name As String) As Boolean
Dim sh As Worksheet
For Each sh In Sheets
If sh.name = name Then
SheetExists = True
Exit Function
End If
Next
SheetExists = False
End Function
0894デフォルトの名無しさん
垢版 |
2019/04/22(月) 20:57:12.59ID:J7q/uljF
>>882
何言ってんの?
回答するかしないかはどうでもいい。
お前が回答を貰って無い以上、不明ということだ。
つまり、「正式な方法が無い」などという発言は明らかに矛盾している。

もはや、「正式」という言葉をどう解釈するかという問題になって全くアホらしいが
、MSに方法が無いのかと問えば、何らかの回答をするだろう。
それを正式な方法と考えれば、日本語の解釈に固執するバカ以外は問題無いわけだ。
0895デフォルトの名無しさん
垢版 |
2019/04/22(月) 21:03:25.39ID:J7q/uljF
>>886
基本的に同じ考え。
1つ付け加えると、On Error Resume Nextはエラー処理終わったらエラーをクリアしてすぐにOn Error Goto 〜とかに戻す。
0896デフォルトの名無しさん
垢版 |
2019/04/22(月) 21:10:24.20ID:aI1C8h9/
>>895
vbaでエラー処理の状態って取得できる?
目視確認無しで、エラー処理の方法てすぐに戻せる?
よく考えたらこれ出来ない気がする
0900デフォルトの名無しさん
垢版 |
2019/04/23(火) 02:07:57.42ID:0gP7mQx4
Excel VBAの例外をあてにしたロジックは危険だよな。
0901デフォルトの名無しさん
垢版 |
2019/04/23(火) 02:16:09.43ID:0gP7mQx4
On Error Resume Next

↑この構文そのものがわかりにくいんだよ。
0903デフォルトの名無しさん
垢版 |
2019/04/23(火) 02:22:13.18ID:0gP7mQx4
オブジェクト操作でなんだかわからないがエラーが発生しても処理を続行するというのは独特。いかにもVBAの適当さが出ている。
0904デフォルトの名無しさん
垢版 |
2019/04/23(火) 02:26:37.40ID:0gP7mQx4
VBAと関係ないがT-SQLも例外の事前定義がないから、トライ、キャッチ構文が役に立たない。
0905デフォルトの名無しさん
垢版 |
2019/04/23(火) 03:09:34.52ID:EzLBs57R
>>903
Excel VBAのOn Errorは、これから出るエラーの種類や原因がわかった上で使う場合がほとんどだと思うぞ
事前に回避する処理を書くより、事後にエラー処理をした方が簡単な場合があるから
0907デフォルトの名無しさん
垢版 |
2019/04/23(火) 08:14:21.83ID:5pALgJfd
>>897
完全に論理崩壊w
どうしてこんなバカがここにいるんだ?
正式な方法が無いなどと決めつけてるんだからお前がその根拠を示すべきだろ。

俺は何らかの正式な方法がある「だろう」と言ってる。
MSが出来ないなんて回答する筈が無いからな。
実際少なくともOn Error使って出来るわけだ。
MSが出来ないと回答しなければそれが正式な方法だ。
0908デフォルトの名無しさん
垢版 |
2019/04/23(火) 08:21:09.21ID:fXkN/03K
>>895
便乗で付け加えると、局所的に onerrorgoto使って、エラーリカバリーしてresumeで処理継続できる。
これ知ったときめちゃ便利やんと思ったし、出番もあったはずだが、ほとんど使ったことない。
0909デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:25:16.87ID:on29KSlM
>>907
そんなこと言うならPinterInfo2構造体のサイズを取得するのはGetPrinter()しかないことをMSに確認したのか?
って>>848に言ってやれよw
レス数が900を超えています。1000を超えると表示できなくなるよ。

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