X



VBAなんでも質問スレ Part2 [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2015/05/21(木) 10:52:44.71ID:KLv0vQmm
VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK

ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください

VBAを開発環境としていろいろ作っちゃいましょう

前スレ

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/

関連スレ

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/

Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/

VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/

Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/
0766デフォルトの名無しさん
垢版 |
2019/03/24(日) 01:38:23.22ID:Y3S3b5Ai
一括処理なら、この方がコンパクト
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next
0767デフォルトの名無しさん
垢版 |
2019/03/24(日) 08:29:39.64ID:myNgr9GS
>>765
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い
0769デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:28:46.47ID:3PVCt58k
>>766
それだとサイズのでかいページで待ちが発生する

Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop
0770デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:33:07.42ID:Mw3X0nZC
>>769
投げてからの待ちだからいいんじゃねえの?
俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ
で全部取ってから次の処理なら問題ない
でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの
だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは
ばたばたと進んで終了、と理解している
0771デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:52:55.88ID:Mw3X0nZC
>>769
ああ、すまん。それがわかってる上で待ち時間がもったいない、ということね
>>766もそこは注意書きはしているな
0772デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:56:37.24ID:OZ1kvGmt
IEはマイクロソフトも使うなって言ってるのに
VBAって不便だよね
0773デフォルトの名無しさん
垢版 |
2019/03/24(日) 11:58:25.29ID:yYEn14s6
IE使えなくなったら、どうやってブラウザ制御するの?
UIAutomation面倒くさいかから、
0775デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:34:48.16ID:4ve/ST91
IE使えなくなったらってもう使ってる人なんていない
セキュリティに甘いとこは使えるのか?
0776デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:28:35.85ID:Y3S3b5Ai
ちゃんと動くのか試してみた
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん
0778デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:36:50.26ID:PYh3zpOu
大昔からあるファイルシステムだって非同期読み書きできる
1000倍遅いネットワークで出来ないはずがないだろうが
0780デフォルトの名無しさん
垢版 |
2019/03/24(日) 14:55:03.02ID:gZMjxNOF
現実的には50並列で全ページ完了待ちするのはどうもなぁ

あと全力でループまわして完了待ちするのも無反応になるんじゃね
とりあえずDoEvents挟もうぜ

>>776
スレッド以前に、IEオブジェクトが別プロセスだから
アウトプロセスのCOM使うのはVBAで並列やる、おそらく安全で簡単な唯一の方法
まあCOM作る方は大変だがな

>>777
OSがサポートしてるだけで、VBAから使えるかどうかとは別の話
VBAで非同期並列やりたければ、基本的にはイベントベースでしかサポートされていない
0781デフォルトの名無しさん
垢版 |
2019/03/24(日) 17:00:18.75ID:cASdygc2
>>776
これ、1つずつ待つ部分がVBAでマルチにしたいって話だったけどCreateObjectで既に別プロセスだから全部投げてから全部の完了を待つので正解なんだよな。

勘違いしてマルチプロセスでやろうとしちゃったよ。
ついでにApplication.Runで出来なくて、迷ってたんだけど、またまた勘違いでApplication.OnTimeが正解だった。
でもOnTimeって戻り値が取れないんだよな。
0782デフォルトの名無しさん
垢版 |
2019/03/24(日) 17:02:38.91ID:cASdygc2
あと、ExcelVBAスレにあるようにInternetExplorer.Applicationじゃなくて別のオブジェクトの方が早いと思うよ。
0785デフォルトの名無しさん
垢版 |
2019/03/24(日) 21:00:07.33ID:IVIO7oct
取りあえず書いてみたんだが、1つずつ待っても速度が変わらん。
テスト用に繋げた所があんまり時間が掛からん所でReadyStateのループに入らんのよ。

取りあえずInternetExplorer.Applicationはやっぱり遅かった。
59個のURLから同じ場所にある特定のデータを取ってくる処理でMSXML2.XMLHttpなら5秒のところIEだと60秒くらい掛かった。
0786デフォルトの名無しさん
垢版 |
2019/03/24(日) 23:42:52.24ID:Y3S3b5Ai
IEを普通にUIを持ったアプリケーションとして開けば、クッキーや画面のレンダリングからアクセス履歴の更新やキャッシュの整理までいろんな処理が走るから、そりゃ実質GETだけのXMLHTTPと比べたら遅くなるのは当たり前と言うか

>>785
画像検索にそれぞれ違うキーワードを設定すれば、それなりに時間がかかるようになるから負荷のテストにはおすすめ
0787デフォルトの名無しさん
垢版 |
2019/03/25(月) 08:15:58.30ID:O3TyiYmg
>>786
そんなことは知ってるが、ここの話で具体的なのがIEだから、いやいや、IEはこんなに遅いですよと注意喚起したんだよ。

まあ、Script関連でIEじゃないと駄目な場合もあるけどね。
0788デフォルトの名無しさん
垢版 |
2019/03/25(月) 21:50:57.49ID:D+uIa6Au
真のエクセラーならieなんか使わずにwebクエリーとか使って何とかするべきだろうが
0789デフォルトの名無しさん
垢版 |
2019/03/25(月) 23:08:06.35ID:DuFQaNpH
getElementByもWebクエリも使ったことあるけど、
Webクエリはどうやって取ってきてるのか謎。
0791デフォルトの名無しさん
垢版 |
2019/03/26(火) 00:39:52.05ID:ke9zWH00
誰もSelenium basic使わんの?
IE使わなくていいしセッション維持とかも楽だぉ?
0792デフォルトの名無しさん
垢版 |
2019/03/26(火) 18:58:02.34ID:ADoE3fhW
readystateが信用ならんのがな
completeになっても完全に読み込めてなくてその後の要素取得処理に失敗とか高確率で起こるし
WinHTTP使うのが確実だと思う
0793デフォルトの名無しさん
垢版 |
2019/03/26(火) 22:23:16.17ID:0P7j5sat
>>791
x だぉ
o だよ
正しい日本語を使いたまえ
0795デフォルトの名無しさん
垢版 |
2019/03/27(水) 00:00:47.48ID:sk2gWEk1
>>794
x 結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。
o 結局Do LoopとOn Error Resume Nextで逃げるしかないっていうことですね。
正しい日本語を使いたまえ
0798デフォルトの名無しさん
垢版 |
2019/03/27(水) 07:39:47.73ID:qB5RyyD6
では、教えてくれ。
正しい日本語の"正しい"とはなんのことだ。
先に言っておくが、国語辞典や義務教育は関係ないぞ。
0800デフォルトの名無しさん
垢版 |
2019/03/27(水) 12:48:07.16ID:Mdwmg5PN
>>798
国語辞典や義務教育関係ないと言うのならば口語体でも問題ないと思うが…。
例えば力不足、役不足のように意味を間違えて使っていては当然正しい日本語ではないが、今回の様な場合では相手方に伝われば良いということにならないか。
0803デフォルトの名無しさん
垢版 |
2019/03/28(木) 21:53:50.06ID:cIkPDI6N
>>796
x 口語体が理解できないやつが正しい日本語とか
o 口語体が理解できないやつが正しい日本語とかどういうこと?
0804デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:24:25.12ID:Q+Q3MpKo
長いのでWithするかSetしましょう。

With 口語体が理解できないやつが正しい日本語
  とか = ×
  とかどういうこと? = 〇
End With
0805デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:39:02.51ID:cIkPDI6N
Sub CorrectJapanese()
Dim text As String
Dim inputText As String
text = "口語体が理解できないやつが正しい日本語とか"
inputText = InputBox("あなたの日本語は?")
If inputText = text Then
MsgBox "アホ"
ElseIf inputText = text & "どういうこと?" Then
MsgBox "そのとおり"
End If
End Sub
0806デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:57:12.09ID:OmRArJOr
日付フィルターを使うときにCriteriaに設定する値って、必ず一旦Double型に型変換したDate型データをもとにしてFormat変換しなきゃいけないのかな?
Date関数の戻り値をそのままFormat変換してもうまくフィルターがかからなくて危うくハマりかけたんだが、後学のために識者がいたら教えてほしい
0808デフォルトの名無しさん
垢版 |
2019/03/29(金) 00:47:46.11ID:MmeaYZo8
>>807
x まともなレスには異論返せないのな
o まともなレスには異論返せないのね
0814デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:25:26.20ID:Fw0ogXHz
VBAで実行時にシンタックスエラーが出るのはどういう場合だろう
デフォルト設定だと1行入力ごとに構文解析するし
0815デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:27:30.74ID:uS2atdcl
>>814
それ、1行ごとの構文解析だろ
For Next Do Loop If End If
のチェックまではしてないと思うぞ
0816デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:28:29.64ID:uS2atdcl
ああすまん。これってシンタックスエラーではないんだっけ
でもエラーになるよね
0817デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:41:55.36ID:Fw0ogXHz
Nextを書かなかった場合は
「コンパイル エラー:For に対応する Next がありません。」
だった

もしシンタックスエラーのエラーコード(変数Errの値)が存在すれば出る可能性があるってことだと思うけど、コードの一覧てどこにあるんだ?
検索してVBのは出るけどVBAのが見つからん
0818デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:49:53.73ID:uS2atdcl
シンタックスって言葉自体は構文規則だけど、コンパイルエラーって出るんだね
0819デフォルトの名無しさん
垢版 |
2019/04/06(土) 00:50:26.14ID:ocPEvB9Z
ExcelVBAでListViewを参照設定で追加して
フォームに配置して使っているんですが、
別フォームからshowしてすでに項目をいくつか追加してある
ListViewのあるフォームを表示したときに
ListViewをアクティブ(そのままの状態から矢印キーで項目を選択できるようにする)
にすることは可能ですが?
例えば

Public Sub UserForm_Active()
With listview1
.ListItems(1).Select
.SetFocus
End With
End Sub

とした場合に、フォーカスは確かにListView1にあるのですが、
その状態では項目が矢印キーの上下で選択することができません。
ListView1.SetFocusではListView1全体にフォーカスはあるが
肝心の中身の項目にはフォーカスがない状態ということなのでしょうか?

なにかよい方法はありますでしょうか?
0823デフォルトの名無しさん
垢版 |
2019/05/10(金) 13:15:01.20ID:SsAAf7AE
VBA勉強中のものです。

Setステートメントを勉強しているのですが、オブジェクト型についてお聞きしたいです。RangeオブジェクトとかWorksheetオブジェクトなど、いろんなサイトなど見ても使いどころがよくつかめてないです。

どんなときに使うのか、教えてもらえるとありがたいです。
0825デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:32:02.86ID:0u/cIV/f
>>823
オブジェクトなら同じものを頻繁に扱うときにコーディングミスをしにくくなる。

毎回、名前でアクセスしていると、ちょっとしたことで、別のものを間違って扱う可能性が高まって、実行時エラーを発生させやすくなる。

定数化していれば防げるが、定数のスコープを大きくしないといけないので、定数の値を変えるときにあっちこっちを確認しながら、直すことになり面倒なことになりやすい。
0826デフォルトの名無しさん
垢版 |
2019/05/13(月) 13:34:22.56ID:p6Zrf1zY
object型の初期状態はNothing
参照先が存在しない場合もNothing返るのがあってis式で判定できる
一方でvariantの初期状態はemptyなのでis式がエラーになる
0827デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:12:50.85ID:/95lNMvT
オブジェクトの値がNothingかどうかで判断するロジックはセンスがいいとは思えない。
0829デフォルトの名無しさん
垢版 |
2019/05/13(月) 23:46:53.76ID:4/CDP/BQ
自分で変数の値をコントロールしているのに、Nothingかどうかをあちこちで確認しているクソプログラマと1年前に仕事した。
0830デフォルトの名無しさん
垢版 |
2019/05/14(火) 08:31:35.00ID:BLcva127
>>827
ライブラリ側は何で判定すべきなんだ?
それともNothingを渡されたら挙動は未定義とするとか?
0831デフォルトの名無しさん
垢版 |
2019/05/14(火) 11:18:55.94ID:4FRIObo4
>>830
そのライブラリは他人が作ったものなのか?自分が作ったものなのか?
0833デフォルトの名無しさん
垢版 |
2019/05/14(火) 12:37:11.77ID:W+bs/bzK
ライブラリに状態を持つプロパティがあればいい。

他人が作ったものを使うしかなく、オブジェクトがNothingかどうかでしか判断できないのなら、そうするしかない。
0835デフォルトの名無しさん
垢版 |
2019/05/14(火) 16:16:33.74ID:E8REZJpG
いきなりライブラリと言われても何のことやらわからない。
0836デフォルトの名無しさん
垢版 |
2019/05/14(火) 17:30:53.68ID:UTGAJPws
>>835
>>827 が「オブジェクトの値がNothingかどうかで判断するロジック」って言ってるじゃん。
ある関数がオブジェクトを受け取ったときの判断方法の話だと思うんだけど、
自分はライブラリ作者なのでその場合どうするのがいいのか気になった。
0838デフォルトの名無しさん
垢版 |
2019/05/14(火) 22:22:18.25ID:jcYCvcdA
>>837
エラーとは限らないけど変数の状態に応じて処理を分けたいと言うのはある。
空のオブジェクトに対してはまた空を返すとかね。
>>829の言ってることはわかるんだけど、>>827>>828の主張がわからん。
Nothing判定はシンプルだけどTypeNameやenumだともっと分岐のパターンが増えちゃうじゃん。
0839デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:23:54.78ID:+OBjJPst
>>836
世の中、変なやつがいて、オブジェクト変数に値をセットして、何も変わるはずがないのに、直後にオブジェクト変数の値がNothingかどうか判定するコードを書くやつがいる。
0840デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:30:59.65ID:KmX6ljlC
代入が成功したかどうか確認するテクニックも存在するから、そういう分野からの転職かな?
具体的には、コンパイラの型チェックを使った裏技だったり、ハードウェアの故障チェックなんかで使われる
0841デフォルトの名無しさん
垢版 |
2019/05/15(水) 00:37:47.48ID:yOOg6UjC
直後であってもサブルーチンに分かれてるなら
入力情報のチェックを行うのは普通のこと
0842デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:24:21.58ID:MwugOkQt
なんか例のCプログラマがしつこいけど、いまどき関係ない別プロセスがメモリ上の値を書き換えたりするミスは、OSレベルでもCPUレベルでもあるので、持論を批判されていると思って反論しなくていいよ。

ここは漠然としたVBAのスレッドだから、見ているひとにはあなたの言うことは難しくて理解できないと思うよ。

スルー力がないのか、寂しくてかまってほしいのか知らないけど、要はクソコードを書くなと言ってるだけだ。
0843デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:28:07.88ID:MwugOkQt
なんでVBAスレで組み込み系のショボいハードウェアでのプログラミングを語っているのか?

ハードウェア、OS、ミドルウェア、プログラミング言語によって考え方やどこまで想定するのかは全然、違うからいっしょくたにしないでもらいたい。
0844デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:29:01.28ID:O3OiMSIx
一般ユーザー権限のアプリで別プロセスのメモリにアクセスできたのは、平成どころか昭和時代の話ですよ、おじいちゃん
希にOSやCPUのバグ騒ぎが起きますが、そんなのは例外中の例外なんで普通は気にしなくていいことです
0845デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:37:35.16ID:MwugOkQt
Windows 95、98、98SE、MeがいつのOSかもわからないのか
0848デフォルトの名無しさん
垢版 |
2019/05/15(水) 20:12:16.23ID:XVltvZnu
せっかくのイベントなのにPrivateにしたら星飛雄馬のクリスマスパーティーみたいになるじゃん
0850デフォルトの名無しさん
垢版 |
2019/05/15(水) 20:49:39.00ID:WHH9UP0v
何か面白いこと言った?
全然わからない。
興味あるからなぜ面白いか教えて?
0852デフォルトの名無しさん
垢版 |
2019/05/16(木) 14:30:12.55ID:wWtnEH3A
コード書く画面を
背景は黒に、文字は白に、する方法を教えれ
0855デフォルトの名無しさん
垢版 |
2019/05/23(木) 22:41:23.89ID:ufKYoT27
Wordで文字置換をしたいのですが、特定のフォントの文字列を検索して、文字列は変えずにフォントだけ変えたいです。半角を全角にしたいのですが可能でしょうか。ヒントだけでも教えていただけると有り難いです。
0856デフォルトの名無しさん
垢版 |
2019/05/23(木) 23:01:54.16ID:ubNtK04k
>>855
できる
任意のRangeのCharactersのフォントを一字ずつ調べて、探しているフォントが適用されている文字が見つかったらその文字のフォントを修正すればいい
半角から全角に変換するにはStrConv関数を使用し、第2引数conversionには列挙定数のvbWideを指定する
0859859
垢版 |
2019/05/28(火) 16:00:47.95ID:JWvhlEsx
Findを利用したコードについて教えて下さい。

書籍、サイトで掲載されていたコードを利用し、少し変えたものです。
Findメソッドを使ってC列の”たろう”を検索します。
探し出したら、A〜C列の文字列をE列に結果を返すように作り替えてみましたが、結果がE1〜G1に上書きされてしまいます。
Cells(Rows,count を理解しきれていない、11行目のCells(i,”E”)の部分も理解していないと感じます。
どのように違うのか、ご指導お願いします。


ワークシートはこんなかんじ E列からG列は実行後の結果をイメージしたものです
  A  B   C   D  E    F  G
1 日付 売上 担当者    000  AAA たろう
2 000 AAA たろう     333  DDD たろう
3 111 BBB はなこ
4 222 CCC たかし
5 333 DDD たろう
6 444 EEE はなこ
7 555 FFF くみこ
0860859
垢版 |
2019/05/28(火) 16:01:28.69ID:JWvhlEsx
859の続き

Sub Find()
Dim temp As Range, tempAddress As String, i As Long

With Range("A1").CurrentRegion.Resize(, 1).Offset(, 2)
Set temp = .Find(what:=“たろう”)
If Not temp Is Nothing Then
tempAddress = temp.Address
i = Cells(Rows.Count, "E").End(xlUp).Row

Do
temp.Offset(columnoffset:=-2).Resize(, 3).copy Cells(i, "E")
Set temp = .FindNext(temp)
Loop While temp.Address <> tempAddress
End If
End With
End Sub

Sub copy()
Range("A:G").Clear
Worksheets("template").Range("A1:C7").copy Destination:=Worksheets("Sheet1").Range("A1")
End Sub
0863859
垢版 |
2019/05/28(火) 17:30:10.75ID:xKlK3b52
>>861
ファッ!それかも!
マジでありがとうです!
何かあったらまた聞きます
ホントありがとう、頭いい人!
0864デフォルトの名無しさん
垢版 |
2019/05/28(火) 18:33:24.92ID:1J9FOJWe
初心者です。
Wordのユーザーフォームを作りたいのですがExcelの書籍しかなくて詰みました。
Excelのセル番地『A1』に相当するのが『ActiveDocument .tables (1) .cell (1.1)』というところまで突き止めて、
とりあえずテキストボックスに打ち込んだ文字列をセルに転記するところまではできたのですが、それ以上のことができません。
例えば繰り返し同じフォームを使う前提で、古いデータを削除したい時、Excelならば
『Range("A1") .CleanContents』で済むっぽい(うろ覚え)ですが
これをActiveDocumentで再現するにはどうすればよいでしょうか。

まだ文法など全く理解できていませんが、素人目に『Range(”ActiveDocument .tables (1) .cell (1.1)”).Select .CleanContents』
などと書いてしまいたい訳です(当然、動きませんでした)
加えて、WordVBAを中心にお勧めの書籍などありましたら教えていただきたいです。
今の書籍は痒いところに手が届かず…
0865859
垢版 |
2019/05/28(火) 19:44:38.82ID:xKlK3b52
>>861
set temp = .findnext(temp)の下に
i=i+1を入れた所、できました。
本当にありがとう!助かりました(T^T)
■ このスレッドは過去ログ倉庫に格納されています

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