Excel VBA 質問スレ Part60
レス数が900を超えています。1000を超えると表示できなくなるよ。
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part59
https://mevius.5ch.net/test/read.cgi/tech/1549692750/ >>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 >>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 >>811
てか、WorksheetFunction.VLookup(1, Range("a1"), 1, 0)
見過ごしたけど、これ何? >>807
Trueならエラー起きないんじゃない? on errorはセンスがないように感じるのですが。
わたしのセンスがon errorを使うことを許しません。
どうしたらいいですか?
こんなとき定番のような方法はないですか? on errorで問題ないならそれで良いじゃん
そんな瑣末な事に時間を使わずにもっと生産性のある事に時間を使って組織や社会に貢献して下さい On Errorを使うのがセンス無い?
何処の初心者だ?
想定された動作なのに一緒くたにするのが嫌というならOn Errorの使い方を知らないだけだろ。 >>815
センスとか気になるならVBAに関わるのは止めた方が良いよ >>815
ID:9HZyCDJwのキチガイが起こってるぞw >>819
センスの無いお前には言われたくね―なw vbaにtrycatchが無い以上、onerrorで分岐するしかない
ただ今回に限って言えば、ワークシートにvlookup()を入れてその結果で分岐させることは可能 こんな方法もある
Range("Z1") = WorksheetFunction.VLookup( 略 )
結果をどこか空いてるセルに入れてしまえば、エラーでも止まらずに結果を判定することができる
もうひとつ、試したことはないけど
WorksheetFunction.Iferror( WorksheetFunction.Vlookup ( 略
みたいな方法でもエラーで停止するのを回避できそうな気がするけど、Vlookupで止まるかなあ >>822
間違えた
こうだった
Range("Z1") = Application.VLookup( 略 ) >>807
・VlookupじゃなくてFindを使う
・事前にcountifとかエラー値が返らないもので存在確認してから使う
・worksheetfunctionの代わりにApplication.VLookupを使うと見つからなかった場合N/Aが返るが、旧バージョンの命令だからあまりおすすめしない 質問者は、もっと具体的に書くべきだな、対応方法は多種多様にあるから
質問に対するベストな回答が、質問者の意図するベストの回答とは限らん もうね、On Error Resume Nextが嫌とか、宗教だと思うんですよ。 んて訳の分からん面倒なコードを書くとかキチってるよね >>829
でも配列の次元すらOn Error 使わないと求められないってひどくないですか? >>831
何も分かってないんだから大人しく使いなよ >>833
?
だから文句言わずにonerrorを使えば良いだけなんだが >>831
お前の言ってることは結局、コ−ド書かないと動かないって酷くないですかってのと同じ。 >>834
アスペか?
配列の次元を取得するのにOn Errorを使うなどという事自体は酷い。これは事実だ。
それに対して「何も分かってない」とdisる以上、On Errorを使わない真っ当な方法があると解釈するのが当然のこと。 そこじゃないよ
vbaの酷い点はtrycatchが無い事 客見ずにマウント取り合いってツルッパゲのする事 産毛すら無い >>835
流石にそれはないわ
VB.NETやC#は普通にプロパティあるし >>837
書き方の問題じゃね?
実質同じことが出来るんじゃないの? >>840
それはVBAに無いものをあげつらっているだけ。
VB.netやC#に無いものをあげつらうことも出来るだろ。
そもそも何が酷いのかサッパリ分からん。 On Error とか例外機構っていうのは、メモリ不足とかファイルの不在なんかのソフトウェア的には想定しづらい
例外的な事象に使うものなんだよ。
例えば「関数引数に対する事前条件がもし守られていなかったら」なんていう
ソフトウェア的に想定できるような事には例外を使うのべきじゃない。
ましてや配列の次元の取得なんてことに使うのは「ひどい」としか言いようがない。
それはセンスとかの問題じゃなくて常識だと思うよ。 >>842
> そもそも何が酷いのかサッパリ分からん。
まじで言ってるの? もともと有る機能を組み合わせて
目的の動作をするように作るしかない 例えば昔仕事で扱ったWin32APIのGetPrinterでは取得するPinterInfo2構造体のサイズを0にして渡して敢えて失敗させることによって正しい構造体のサイズを取得するなんてのがある。
再度正しいサイズで実行するやり方が想定されていて、そして失敗時はdllエラーも当然発生するなんてのが有るわけなんだが。
確かDevmode構造体を取得するする時に使うDocumentPropertiesも同じような使い方してたと思う。 >>845
結局取得できる。
何も問題無い。
お前のオナニー以外は。 >>844
まず次元の取得方が標準で用意されていない点が少しひどい。
さらにそのワークアラウンドがOn Error利用である点が一層酷い。
わかる?
これでキミもバッチリだ。 >>847
>>832じゃねーから何も考えておらん。 >>850
だからそれは無いものをあげつらっているだけ。
どんな言語にもあることだ。 >>841
実質同じ事って言い出すと何でもアリになってしまう
onerrorしかないと可読性が大きく下がる
ところでEXCELで次元数を取得する機会って一度も無いんだけど、
よく使う計算なのか >>853
可読性が下がる???
書き方が悪いんじゃ無いの?
そんなこと感じたことも無い。 >>853
多分、配列を初期化したかしてないかの話じゃないかと思うね。
UBoundでエラーが出る話だろう。
で、Sgnが嫌なんだろう。 >>848
それはちゃんとドキュメント化されてるだろ
On Errorで次元を取得するのとはレベルが違うよ
動けばいいと言うレベルのコーダーならいいのかも知れないけど >>856
何言ってるの?
On Errorしかないのが正式なら同じだし、
On Error以外に正式なものがあれば問題ないし、
同じことじゃねーかw
しかも後出ジャンケンかよw
結局言い掛かりもいいところだ。 On Error 以外に配列の次元取得方法がないと決まった訳じゃなくて、よく知られてる方法がOn Error利用だってだけだが、
割り切ってAPIを呼んでいる人もいる。 >>749
え、お前の会社って稟議書や経費精算の業務って全部署共通じゃないの?
その会社固有の業務だけど、部署間で使い回しの効く部分のことを言ってるんでしょ? >>843
とりあえず構造化例外処理すらない時代の言語にいってもしょうがない話
常識は時代で変わるんだよ
結局はVBAは古い時代の言語ってだけ
あと、配列の次元が知りたいとか設計が悪いとしか思えん >>857
はあ?
正式な方法がないって話だぞ
日本語理解できてないの?w >>860
> あと、配列の次元が知りたいとか設計が悪いとしか思えん
君には不要というだけの話
他の言語では普通に多次元配列用のライブラリとかある >>863
それさ...
平気で言うやつがいるけどさ...
ありえなくない? じゃあどうしてもOn Errorが嫌だとして、
他の方法が幾つか出てるんだから、それ試しなよ。 trycatheなら関数に封じ込める事ができるけど、
onerrrorはグローバルだから全体に影響してしまうのが最高に糞なんだ
正直、グローバルじゃなければ別にonerrorだろうとなんだろうと構わんのだよ on errror が糞とかどうとかお前の趣味に合わせて出来てる訳じゃ無いんだよアホウ >>866
君の言う通りだ
反発を受けてるのは「文句言わずにonerror使え」とか言い出した奴ですよ
ただ次元数をライブラリに渡せっていうのはナシだ うまく作れない奴が他人のせいにしたところで問題は解決しないのにな >>861
大いなる自己矛盾の中にいることに気付かないとはね。
論理的思考能力が無いならプログラムを組むのなんか辞めることだな。 >>871
何を言いたいのさっぱりかわからんw
低能が反論できずに有耶無耶にしたいときによくやる方法だな >>867
on local error …
って書くだけじゃん。アホか。 >>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 >>873
やっぱり分からんかw
お前はドキュメント化されていれば正式だと言ってる。
しかしそれは結局MSの判断ということだ。
お前はOn Errorが正式では無いという回答そ貰ったのか?
そうでなければお前の「正式な方法がないって話だぞ」というのはお前の決め付けだ。
結局お前の中には矛盾した2通りの正式が存在することになる。 local付けると局所だと思ってたけど、配下に有効みたい。
つまり、付けても動作に変わりはない(?、詳細は試してない) 昔試したときに、local有無で動作違ってたはずなんだけどな…
まあ、配下に有効だから、goto 0で無効にしてから callすれば局所化は可能かと 俺も On error Goto でtry Catchと同程度のことができると思ってた
要するに書き方かなと思ったが1回目のエラーはいいがそれ以降が使えないじゃん?
ネストするにも無理があるな、複数の場所(例えば2重ループで)でのやり方があるかもしれんが
無理じゃない?
俺は「On error Goto」で出来ると思ってた、やり方があれば申し訳ないが教えてほしい エクセルで、複数ブックの特定文字列だけ一気に変えるマクロってどこかで紹介されてますか?
例えば2018年4月21→2019年4月23日に変える感じです
日付が入力されているセルがそれぞれのブックでバラバラなので、セル指定置換はできないようです >>876
よほど多用されてるとかでない限りいちいち〇〇は正式じゃないなんて言う回答なんてするわけ無いだろ
レスが馬鹿すぎるw 例えば
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回目のエラーでメッセージボックスが出る
回避方法を教えてほしい 赤っ恥
On Error Resume Next
はこれなら大丈夫だが
On Error GoTo Nosheet
はNGって話です でもそれじゃあ書いてる意味がないので
結局
On Error Resume Next で次を考えるなかななの、一番使いたくないんだが On Errorは全体に作用しすぎるから、isError的な感じでfunction分けた方が良いんじゃないか >>884
onerrorgotoをメインの処理の流れ制御には使わない方がいいと思う。
On Error Resume Nextは、次行にエラーがあると想定されるときに使い、If Err.Numberで判定して、その値によって処理を変える。
On Error GoTo は、どちらかというと、一つの処理(subやfunct…)の頭で宣言し、想定外のエラーを検知してエラーを出すのに使う。 >>886
ありがとう、他の言語も使ってるから勘違いしていた
対応することはもちろんできるし、Excelの環境を利用しながらの
プログラムは有効なので、仕方ないのであれば考えるは
考えてなかったのが、お恥ずかしい なんかアプデ来てからwebクエリのバグが起こって実行エラー 1004で読み込めないんだけど
俺だけ? >>889
「Webクエリによって返されるデータがありません」とか言われるけど
読み込み先のWebページみても仕様の変更とかURLの変更とか見られないし明らかにExcelアプデが原因っぽいんよなー >>890
もう一度、クエーリーを作成してもダメ? >>881
どこで紹介されてるかは知らないが、1ファイルずつ中身検索して変更すればいい >>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 >>882
何言ってんの?
回答するかしないかはどうでもいい。
お前が回答を貰って無い以上、不明ということだ。
つまり、「正式な方法が無い」などという発言は明らかに矛盾している。
もはや、「正式」という言葉をどう解釈するかという問題になって全くアホらしいが
、MSに方法が無いのかと問えば、何らかの回答をするだろう。
それを正式な方法と考えれば、日本語の解釈に固執するバカ以外は問題無いわけだ。 >>886
基本的に同じ考え。
1つ付け加えると、On Error Resume Nextはエラー処理終わったらエラーをクリアしてすぐにOn Error Goto 〜とかに戻す。 >>895
vbaでエラー処理の状態って取得できる?
目視確認無しで、エラー処理の方法てすぐに戻せる?
よく考えたらこれ出来ない気がする >>894
正式な方法があると言うなら出せよw
出せない時点でお前のレスは意味がない >>898
あぁ、それは知ってるんだ・・・すまぬ
resume nextとgoto 0って判別できるんだろうか Excel VBAの例外をあてにしたロジックは危険だよな。 On Error Resume Next
↑この構文そのものがわかりにくいんだよ。 オブジェクト操作でなんだかわからないがエラーが発生しても処理を続行するというのは独特。いかにもVBAの適当さが出ている。 VBAと関係ないがT-SQLも例外の事前定義がないから、トライ、キャッチ構文が役に立たない。 >>903
Excel VBAのOn Errorは、これから出るエラーの種類や原因がわかった上で使う場合がほとんどだと思うぞ
事前に回避する処理を書くより、事後にエラー処理をした方が簡単な場合があるから >>897
完全に論理崩壊w
どうしてこんなバカがここにいるんだ?
正式な方法が無いなどと決めつけてるんだからお前がその根拠を示すべきだろ。
俺は何らかの正式な方法がある「だろう」と言ってる。
MSが出来ないなんて回答する筈が無いからな。
実際少なくともOn Error使って出来るわけだ。
MSが出来ないと回答しなければそれが正式な方法だ。 >>895
便乗で付け加えると、局所的に onerrorgoto使って、エラーリカバリーしてresumeで処理継続できる。
これ知ったときめちゃ便利やんと思ったし、出番もあったはずだが、ほとんど使ったことない。 >>907
そんなこと言うならPinterInfo2構造体のサイズを取得するのはGetPrinter()しかないことをMSに確認したのか?
って>>848に言ってやれよw レス数が900を超えています。1000を超えると表示できなくなるよ。