Excel VBA 質問スレ Part60
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part59 https://mevius.5ch.net/test/read.cgi/tech/1549692750/ 同じ個数配列で使うものはTypeを使って構造体にしろよ 構造体を配列で取る redimぐらい使えよ >>144 Do flg = False For Each url_foo In url_arr ' どれかがまだ If httpReq(index_foo).readyState < 4 Then flg = True Next DoEvents Loop While flg ↓ For Each url_foo In url_arr ' どれかがまだ Do flg = False If httpReq(index_foo).readyState < 4 Then flg = True DoEvents Loop While flg Next >>146 >コレじゃ1つでも読み込めたらループから抜ける 入れ子逆だった、スマン >set したのはリリースする httpReq is nothingがエラーになる vbaって配列 is nothing出来ないのか >処理がおもいのは 相対的に重いけど体感上重くは無いと思う >>147 vbaのclassは正直もう無理や 構造体を使うのは処理を分かりやすくするため リリースは Set オブジェクト変数 = Nothing 感覚的に難しいかな >>142 普通は以下のように、自分で状態を調べたりしない。 If httpReq.readyState < 4 Then flg = True これは、Node.js などの低レベルな書き方で、普通はこれらの状態をラップして、 簡潔に書ける方法が、ライブラリ・フレームワークに用意されている 例えば以下は、JavaScript, jQuery の非同期処理の書き方。 ready になったら、引数で定義した、callback 関数を呼んでもらう。 document.ready(function(){}〜 非同期処理には、promise, deffered, async/await の書き方もある Ruby で、Selenium WebDriver なら、非同期処理を考えなくても、普通に同期的に書ける。 非同期処理の書き方のすべてが、ラップされているから。 Timeout 設定時間までに、状態が満たさなければ、Timeout Error になるだけ 漏れなら、Ruby で、Selenium WebDriver で、 url.txt には、行区切りでURL を書いておく。 script.rb には、Selenium WebDriver での処理を書いておく main.rb には、以下を書いておいて、このファイルを、ruby main.rb で実行する File.foreach( "url.txt" ) do |line| `ruby script.rb #{ line }` end url.txtを、1行ずつ処理して、各URLを取得して、それを引数にして、 ruby script.rb URL の別プロセスを呼び出す。 ただし、Selenium WebDriverでの処理が、URLだけが異なって、他は同じ事が条件 つまり、マルチプロセス これをマルチスレッドにすると、排他処理などが面倒。 それに同一プロセス内の処理になるので、1つのエラーで、すべての処理が止まるし、やってられない! VBA以外の構造化言語で書けば綺麗に書ける まあ出来るだけ近いように書くのがよいが まあ所詮俺もこんな処理ではJavaかPHPでしか書かない まあ >>148 > vbaのclassは正直もう無理や TypeとClassは関係ないぞ Typeは単に複数の値を纏めるだけ たぶん、構造体 = Type = 型 = クラス っていうアナロジーで考えてたんだろうね まあ、コードも間違ってるし書き方も良くない 配列すら得意でないようなので・・・ あと、せっかくExcelを使ってるんだから Url等の情報はセルから読み込むよな >>151 seleniumってまだ使えんの?もう機能しなくなったと思ってた あぁvbaってclassと構造体両方あったのか >>155 コールバックの部分だけはマジで分からんかった どうやって書くんだ >>150 クソ言語乙 >>130 だから、お前が真面目に出来るとか言ってるのは、真面目な話じゃ無くてアホな話だろと言ってるんだが。 アホな例を出さなかったらそれこそアホだろw >>159 はあ? >>67 が > やろうと思えば出来んでもないのか って書いてるからやること自体は難しくないって書いてるだけだぞ そもそもExcel VBAでPowerPointを操作するのがアホとか言ってるわけじゃないことも理解できてないのかよw >>157 Excelでコールバックで受けたいって言っても、やったことないな 所詮そんなにクリティカルなルーチンを書く環境じゃないだろ そんなことしなくても、ステータスが読み込めた物から処理して 全ての配列が処理出来たら終わればいいぐらいのコーディングだな 自分で書かなきゃ意味ないぞ >>160 無能の相手はほどほどで >>161 やっぱり難しいよな >全ての配列が処理出来たら終わればいいぐらいのコーディングだな これで書いたよ DOM部分はどうせ瞬殺だからまとめて良い >>162 他の言語で簡単にかけるって言っても 所詮その言語で提供されたルーチンを使うだけだから 適した言語で書けば比較的簡単にかけることは確か コーディングに関しては直感で書いたからもう少し読んでみよう まあ、所詮夜勤から帰って書き込みしてるから 午後は、お酒が進むんでまあ気にするな >>157 > コールバックの部分だけはマジで分からんかった > どうやって書くんだ コールバックなんていらんだろ 素直にreadyStateが4になったら処理すればいいだけ スマホから打ってるからデバッグしてないけどこんな感じ Type Request Session As Object Done As Boolean End Type url_arr = Array("https://www.yahoo.co.jp/" ;, "https://urasunday.com/" ;) Dim Requests() ReDim Requests(LBound(url_arr) To UBound(url_arr)) Dim Index As Integer For Index = LBound(url_arr) To UBound(url_arr) With Requests(Index) Set .Session = CreateObject("MSXML2.XMLHTTP") .Session.Open "GET", url_arr(Index), False .Session.Send .Done = False End With Next ' 続く… ' 続き Dim AllDone As Boolean Do AllDone = True For Index = LBound(url_arr) To UBound(url_arr) With Requests(Index) If Not .Done Then If .Session.readyState < 4 Then AllDone = False Else Cells(Index + 1, 1).Value = .responseText .Done = True End If End If End With Next DoEvents Until AllDone >>160 いや、だから... それに>>67 じゃなくて>>69 だろ。 やろうと思えば出来るけど、驚いてるのはそこじゃ無いだろという指摘が理解できなかったから>>96 みたいな頓珍漢なことを言ったんだろ。 じゃなかったら>>96 みたいに噛み合わない発言にならない。 >>165 俺も使わなくてもいいと思うが 上でコールバックコールバック言ってたからな >>167 お前に何の能力もないのは分かったから落ち着け >>167 お前はアンカーもまともに見れないのかよw 157デフォルトの名無しさん2019/03/23(土) 11:18:14.30ID:sBAP9hOD >>150 クソ言語乙 142デフォルトの名無しさん2019/03/23(土) 00:41:36.68ID:sBAP9hOD こいつは荒らしじゃね? 相手しない方がよい >>170 ここはVBAのスレだよ。 そこにRubyとか持ってきたからじゃねえのw >>170 そのruby信者が荒らしだぞ あらゆるスレで「rubyなら〜」と言ってrubyを貶めしている pythonスレではスレタイにruby禁止とまで入る始末 コールバックって何? ググると、関数の引数に渡す関数って出てくるけど、 それって、複数の処理を、 ↓こうやって横着して1行に書くのと何が違うのかわからん。 a = Replace(Replace("あいうえお", "あい", ""), "えお", "") >>173 a関数の処理が終わった場合、a関数の引数を受け取ってb関数を自動的に開始する・・・という処理 非同期、特にスクレイピングが多重で続くような場合は非常に強力 https://www.sejuku.net/blog/67743 使う場面が分からないのは、使う必要が無いと思って良い jsだと死ぬほど使うが、EXCELで使う事はまずない VBAでコールバックを実装しようとしたら、 Application.Runを使うかクラスモジュールでメソッド書いてCallByName関数で呼び出すようにするかって感じになるんかね >>175 ごめんVBAでコールバックを「実装」か。 VBAの関数をコールバックするにはどうするかという問題と勘違いした >>177 そう、外部プログラムにVBA側の関数ポインタを渡す話じゃなくて、受けとる側の処理の書き方 クラスのメソッドとしてコールバック関数を実装してinterfaceか遅延バインディング使えばいい >>173 > a = Replace(Replace("あいうえお", "あい", ""), "えお", "") これは外側のReplace()に内側のReplace()の「結果」を渡してる コールバック関数は内部で呼ぶ関数を変えたい時に使う 例えば図形を描くルーチンがあったとして出力先を色々切り替えたいとかだと出力する関数を自体を渡す やり方はこの辺りを参考にして https://qiita.com/rai_suta/items/c07b22130b302682b729 >>179 やっぱりAddressOfの値を受け取ってそれをAPI経由で実行するのがいいんじゃないか ただしシグネチャは一定とする そんな事をエクセルVBAでやる意味って何? 何が何でもVBAって馬鹿のひとつ覚えって言うんだよ >>183 他言語を覚えなくて良いのは大きなメリット 環境構築、記述方法、言語仕様 この辺全部覚えなくて良いのはデカイ 特にvbaはプログラマーじゃなく事務員が使ってる場合も多いので、環境構築が苦手な事が多々ある ノコギリで刺身切ろうとして包丁使えよって言われて包丁の使い方覚えなくていいのはメリットって言ってる構図 他言語を覚えなくて良いって発想がどうかと思う 適材適所で効率良くするのも仕事だし 死にゆく言語の代表がVBA >>185 流石に頓珍漢すぎ 出刃包丁で刺し身切ろうとしたら刺身包丁買ってこいってゴネてる奴がいるだけ >>187 根拠もなく、何を見てそう思ったの? >>188 >他言語を覚えなくて良いって発想がどうかと思う >適材適所で効率良くするのも仕事だし これは同意 俺も効率化のためにphpとjsはある程度覚えてるわ ただ、人に勧めるのは現実的に厳しい面がある たまーに出てくるスクレイピングのためにphp覚えろって言うのはなかなか酷 時間がかかって良いならウンコみたいなコードでも処理できるしな ここの人でもサーバー=レンタルサーバーって発想した人いるけど、 スクレイピングのためにphp動かすならxamppで良い >死にゆく言語の代表がVBA ずっと言われてるけど全然死なないので俺も困っている。せめてバージョンアップして 既に公式にはJavaScriptに置き換わってるのに今更バージョンアップもクソも >>191 JavaScriptに置き換わってるって言ってもアドインだけでしょ >>192 だけもクソも、現在推奨されているExcelのプログラミングインターフェイスはアドインのみだよ VBAは廃止予定のレガシーな機能であり、使用は推奨されない >>193 それは知りませんでした、申し訳無い そのソースってどこかにありますか? vbaがやっと進化するのか 自分の現在分かる範囲で創意工夫してやろうとするのは良いことで出来ちゃってるんだろうけどこの先ずっと出来るかは不明 新しいのを取り入れないとダメ 特にエクセルVBAでやる必要のないのがあるなら勉強のチャンスなのに古いのでやろうとするから進歩しない xampp入れてPHP一から覚えるぐらいなら、VB.NET覚える方がはるかにマシだわ >>191 エクセルのマクロもVBAじゃなくてjavascriptになるのか? てか、もうなってるの? ボタンと押したときの動作とかもすでにjavascriptで書くようになってる? >>197 アドインがjsで書けるように鳴ったんだよ ここは言語スレじゃなくてExcel VBAスレなんだが バイクやチャリの板で日本縦断の準備とか注意点についての質問レスに対して飛行機使えよ馬鹿とレスしてるやつ居たらアホだろ >>199 何回やっても例え下手やなw もっとやっていいぞ >>198 マクロは関係ないのね。 VBAが無くなるとは考えられん >>201 マクロは単純に廃止だろうね 知らないかもしれないが、昔はVSなどMS製品には大抵VBAマクロが入ってたんだよ どんどん廃止されて、今や残ってるのはOfficeだけ >>202 ん? マクロ自身が廃止になるのか? マクロは残るがVBAじゃなくてjavascriptになるのか、って聞いたんだが >マクロ自身が廃止 上でそう言ってたけどソースが見つからない ただの噂かも >VBAじゃなくてjavascriptになるのか 現状はjsでもアドインを作れるようになっただけ 俺もvbaは廃止しないと思う だってVBAってセキュリティ的にヤバいし エクセルファイルに偽装してマルウェア的なかなりの事までやれちゃうから廃止で良いよ >>204 >俺もvbaは廃止しない 絶対あり得んよね。 今までの過去の資産がどれだけあるか それを作ってるのは理系のプログラマじゃなくて文系の経理の女の子も相当いるからな 全くバカばっかりだ。 その場で最適なのを選択すりゃ良いんだよ。 レガシーとか言ってるバカは救いようがない。 VBAで簡潔出来るならその方が良いんだよ。 VBScriptでファイル選択ダイアログを使う時にExcel.Application使うなんてのは本当はやりたくないけど他にうまい方法が無いから仕方ない。 このやりたくないというか筋が悪いと感じることが出来ない奴は結局駄目だね。 レガシーなのはその通りだが、それで別言語使って筋悪プログラミングしてたら意味が無い。 “Office アドインはVBAやVSTOを置き換えるものではないので(現時点では)、「何でこんな簡単なこともできないの!?」とイライラしてはいけない”だとさ。 Officeアドインとかいうの忌み子になりそうだよな とりまIEが消えればVBAでスクレイピングは消える OS依存の負債を作りかねない機能はどんどん省いて欲しいね セルの中に、そのセルが存在するシート名を抜き出す関数の定義ってどんなのがある? シンプルで分かり易い、エクセルの版に依存しないのが良いな。 ここはVBAのスレだから、セル内で使う計算式の質問はスレ違か。 >>210 IEが無くてもhttp通信できるぞ >>211 cell関数 https://kokodane.com/kan54.htm シンプルじゃないけどこれぐらいしか >>214 http通信でスクレイピングか 是非頑張ってくれ >>214 ありです。 残念なことに、CELL関数は Excel Online の excel では動かないんですね。 というか、IE消えても出来るぞ。Winsockとか知らんか? スクレイピングならJSで良いと思うけど何が何でもVBAなの? 何か幼少期に家庭的な問題でお父さんから虐待されてたとか? pythonスレのスレタイに、ruby禁止と入れて、スレ立てしている奴は荒らしだよ lodash 禁止とか、jQuery 禁止とか、ライブラリの話は禁止とか書いて、 テンプレを勝手に改変して、スレ立てしている奴は荒らし 色々なスレを荒らしてる 相手をすると居つくから、相手をするな! スクレイピングのために、xampp, PHP を学ぶのはキツイ。 Ruby, Nokogiri, Selenium WebDriver で良い。 JavaScript, jQuery も呼び出せるし VBScript のスレ主のピッコロ大魔王のように、 VBScript, PowerShell で、.NET のライブラリを使って、5ch をスクレイピングする猛者もいるけど、これもキツイ 書きやすいのは、やっぱりRuby! という荒らしがいるのでruby禁止をスレタイに入れるのは賛成だ スクレイピングってその分野なら必須なのでVBAなんて低速非効率でするなんて馬鹿げてる バカだよなあ。 どんな言語でも出来るがVBAでやるのが最適な場合の質問だろ。 VBAのスレなんだから。 スクレイピングのためにxampp,PHPを学ぶんだよ。 それが最適なら。 Rubyが最適ならRubyでやれ。 でもここではVBAが最適という前提。 オマエの能力が低くてVBAで答えられんことなんか知らん。 スクレイピングのために、Apache, MySQL, PHP を学ぶのは、難しすぎる Ruby なら、PowerShell から、1-liner で、 Rubyで作られた遅いウェブサーバー、WEBrick が起動する ruby -run -e httpd . -p 8080 そのフォルダに、index.html があれば、 何も考えなくても、これでブラウザからアクセスできる http://localhost:8080 DB は、sqlite3 で良い。 sqlite3.exe なら、外部プロセスとして起動できるし、 sqlite3.dll なら、Rubyプロセス内に、DLLを読み込めばよい それに多くのブラウザは、内部で、sqlite3 を使っている。 MySQL は大げさ そもそも単に、CSV・テキストファイルに、保存しちゃダメなのか? いつからスクレイピングとはWEBサーバを立てる事になったんだ スクレイピングの速度を上げすぎるとDoSと勘違いされない? pythonとかならちゃんと犯罪にならないレベルで収まるよう対策されてるの? wget が、再帰的クローラーのコマンドだけど、オプションでwait 時間も設定できる。 wgetの方が、curl よりも高機能 xampp には、Apache が含まれているから、web サーバーも立てたいのかなと思って バカは自分の無能を言い訳に相手の望まない案を提案する。 誰もRubyでやってくれなんて言ってないんだが。 VBAを覚えても馬鹿にされるだけだしVBA程度でプログラミング出来ますって言えないし 本当に辛いよな >>235 >VBAを覚えても馬鹿にされるだけ どこで? これぐらいは基本スキルと思う >VBA程度でプログラミング出来ますって言えない 誰に大して言うの? vbaは一般事務や営業が楽するためのツールだよ vbaプログラマーなんて滅多にいない 昔は同時接続5つくらいまでみたいなマナーのようなのがあったが、今はどうなの? >>236 そりゃそうだ ところで他言語連携って、A言語で作ったライブラリをB言語から呼び出すパターンと、 時間的同期を意識しなくていいバッチ的なももの組み合わせみたいなものしかイメージないんだけど、 イベント連携しながら運用するようなパターンもよくあるの? >>237 図書館のサーバーに大してかなり気を使ってスクレイピングしたにも関わらず、電子計算機損壊になった例もある どこまでokとかは言えない >>235 いや、普通に言うけどね。 C、C++、Java、VBAとかって。 それに、VBAを使うべきじゃないと言う時もある。 でも、ここで他言語のことを言う奴ってVBAの方が完全に良い場合に他のが良いとか言う無能が多いからなあ。 >>240 シートにデータ張るくらいの簡単なものなら インタフェースできてるからVBAが一番楽。 >>243 遊びでやってるならどうぞw 事務でも仕事なら取るべきだ。 許可は取らないけおd、API作ってくれとは連絡するかな VBAのエディターにはVSみたく行番号を表示する機能は標準では備わっていないのでしょうか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる