VBAなんでも質問スレ Part2
at TECH
[前50を表示]
750:デフォルトの名無しさん
19/03/20 00:38:39.23 vmDq6MjZ.net
>>732
使えるよ
Application.Namesでコレクション取得して名前つき範囲にアクセスできるし、シートのRangeプロパティの引数ラベルとして名前をそのまま使ってセル取得できる
751:デフォルトの名無しさん
19/03/20 16:11:53.05 VkiUMgxP.net
>>733
横からだけど、どう面倒になるの?
752:デフォルトの名無しさん
19/03/20 19:48:02.99 lxQ2zmLg.net
>>735
セルの編集したときに壊れてた
753:デフォルトの名無しさん
19/03/20 21:06:17.96 ad3N4bFR.net
名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる
754:デフォルトの名無しさん
19/03/21 01:35:24.94 XMapNPTs.net
なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない
755:デフォルトの名無しさん
19/03/21 07:27:32.08 u3u8nbsq.net
>>736
それおま環だろ
756:デフォルトの名無しさん
19/03/21 07:34:08.81 u3u8nbsq.net
>>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う
757:デフォルトの名無しさん
19/03/22 17:57:33.45 DJ7JSKt5.net
会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らない
758:ッどJavaでいうスレッドみたいな?
759:デフォルトの名無しさん
19/03/22 18:35:53.24 HaipTOms.net
>>741
VBAはマルチスレッド非対応だから無理
760:デフォルトの名無しさん
19/03/22 19:06:27.17 DJ7JSKt5.net
>>742
そりゃないよ、かあちゃん
761:デフォルトの名無しさん
19/03/22 19:28:02.41 s6oj+Xdm.net
>>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。
1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす
たぶん、こんな感じでできたはず。
762:デフォルトの名無しさん
19/03/22 19:35:54.55 DJ7JSKt5.net
>>744
ありがとうございます。
しかし、もし50個URLがあれば50個新しくExcel自体を起動しないといけないのですか?
そんなことしたら激重になってしまうように思うのですが。
763:デフォルトの名無しさん
19/03/22 19:38:23.65 ls5du2vw.net
複数のInternetExplorer.Applicationのインスタンス立ち上げれば行けんじゃないか
764:デフォルトの名無しさん
19/03/22 19:57:22.45 HaipTOms.net
>>746
今それができないって会話をしてたところだけど理解してる?
765:デフォルトの名無しさん
19/03/22 20:04:27.42 ls5du2vw.net
>>747
どこでそれが出来ないって話をしてる?
766:デフォルトの名無しさん
19/03/22 20:19:56.99 HaipTOms.net
>>748
>>742
767:デフォルトの名無しさん
19/03/22 20:49:35.12 n3e2TSgf.net
>>741
フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる
768:デフォルトの名無しさん
19/03/22 21:25:13.65 uvzdlIQp.net
なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな
IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ
769:デフォルトの名無しさん
19/03/22 22:10:54.82 HaipTOms.net
>>751
そのプロセスを制御するVBAがシングルスレッドだろ
770:デフォルトの名無しさん
19/03/22 22:13:33.32 HaipTOms.net
>>751
あ、開けば終わりと勘違いしてる?
771:デフォルトの名無しさん
19/03/22 22:13:49.76 LAgBLCyu.net
IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。
772:デフォルトの名無しさん
19/03/22 22:15:47.88 CAtaruvO.net
>>752
VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの?
773:デフォルトの名無しさん
19/03/22 22:38:21.07 DJ7JSKt5.net
>>750
?
>>751
その具体的な方法をコードで例示する形で教えていただきたいのでござるよ。
いまだと
Do While readyState < 4
Do Events
Loop
の待ちを50個のURLで1つ1つ順番にやってて
1つのURLを読んでデータ取って閉じる、というのをやるのが社内ネットワークが遅いため(データベースからの読み込みも含まれるからの)1つあたり1分近くかかってる。
だから異常に時間がかかる。
一気に全部同時にやれないかなと。
774:デフォルトの名無しさん
19/03/22 22:40:55.80 tgov+uRX.net
そんなもんそれこそ流行りのRPAでやればいいのでは
775:デフォルトの名無しさん
19/03/22 22:40:56.05 HaipTOms.net
できるっていうくせにコードは出てこないのね
776:デフォルトの名無しさん
19/03/22 22:57:51.11 HaipTOms.net
そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない
777:デフォルトの名無しさん
19/03/23 01:14:24.21 BU4e6Kdq.net
趣味でやってるんじゃなかったら
適当なダウンロードソフト使ったほうが良いんじゃない
778:デフォルトの名無しさん
19/03/23 12:00:24.62 36Js1rz1.net
動くかどうか試してないけど、こんな感じでいいんじゃない?
もう少し効率を上げるなら、読み込めたページからさっさと処理してもいいし
Sub test()
pg = 50 ' 同時に開きたいページ数
Dim ie() As Object
Dim url() As String
ReDim ie(pg-1)
ReDim url(pg-1)
'ここでURL設定
For i = 0 To pg-1
Set ie(i) = CreateObject("InternetExplorer.Application")
' ie(i).Visible = True '表示しない
ie(i).navigate url(i)
Next
Do
flg = True
For i = 0 To pg-1
If ie(i).readyState < 4 Then
flg = False
End If
Next
Loop Until flg '全ページの読み込み待ち
'ここで読み込んだページを処理
End Sub
779:デフォルトの名無しさん
19/03/23 15:33:38.79 BqJUz3fJ.net
>>761
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。
780:デフォルトの名無しさん
19/03/23 19:47:18.63 h2FSWEPH.net
>>761
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います
あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。
781:デフォルトの名無しさん
19/03/24 00:51:51.95 gZMjxNOF.net
>>752
まさかIEオブジェクトの読み込み動作がVBAのスレッドで処理されてると思ってるのか?
>>753
終わりじゃないので考慮点はある
コード書こうかと思ったけど、>>761さんが書いてるからまあいいか
読み込み完了の検出とかどうするか悩みどころではある
イベントハンドラの動的設定か、せめてWithEventsが配列にも宣言出来ればなぁ
まあ50も多重化してもオーバーヘッドかかるだけで高速化しない気がするから
数個固定で持たしてイベントハンドリングするのが現実的かもしれん
782:デフォルトの名無しさん
19/03/24 01:34:57.18 Y3S3b5Ai.net
この場合Do Loopを抜ける条件が全ページの完了だから、Exit Forはあってもなくても結果というかスピードは変わらないね
さっさと抜けたところで、またForループに戻るだけだし
個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか
783:デフォルトの名無しさん
19/03/24 01:38:23.22 Y3S3b5Ai.net
一括処理なら、この方がコンパクト
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next
784:デフォルトの名無しさん
19/03/24 08:29:39.64 myNgr9GS.net
>>765
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い
785:デフォルトの名無しさん
19/03/24 08:58:33.34 Mw3X0nZC.net
>>766
ははは、これは笑った。確かにこれが単純明快でコンパクト w
786:デフォルトの名無しさん
19/03/24 10:28:46.47 3PVCt58k.net
>>766
それだとサイズのでかいページで待ちが発生する
Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop
787:デフォルトの名無しさん
19/03/24 10:33:07.42 Mw3X0nZC.net
>>769
投げてからの待ちだからいいんじゃねえの?
俺はやった
788:アとないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ で全部取ってから次の処理なら問題ない でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは ばたばたと進んで終了、と理解している
789:デフォルトの名無しさん
19/03/24 10:52:55.88 Mw3X0nZC.net
>>769
ああ、すまん。それがわかってる上で待ち時間がもったいない、ということね
>>766もそこは注意書きはしているな
790:デフォルトの名無しさん
19/03/24 10:56:37.24 OZ1kvGmt.net
IEはマイクロソフトも使うなって言ってるのに
VBAって不便だよね
791:デフォルトの名無しさん
19/03/24 11:58:25.29 yYEn14s6.net
IE使えなくなったら、どうやってブラウザ制御するの?
UIAutomation面倒くさいかから、
792:デフォルトの名無しさん
19/03/24 11:58:47.29 yYEn14s6.net
getElementByしたいんだけど。
793:デフォルトの名無しさん
19/03/24 12:34:48.16 4ve/ST91.net
IE使えなくなったらってもう使ってる人なんていない
セキュリティに甘いとこは使えるのか?
794:デフォルトの名無しさん
19/03/24 13:28:35.85 Y3S3b5Ai.net
ちゃんと動くのか試してみた
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん
795:デフォルトの名無しさん
19/03/24 13:33:22.28 gDjNFFGJ.net
>>776
まだそこ?
796:デフォルトの名無しさん
19/03/24 13:36:50.26 PYh3zpOu.net
大昔からあるファイルシステムだって非同期読み書きできる
1000倍遅いネットワークで出来ないはずがないだろうが
797:デフォルトの名無しさん
19/03/24 13:55:48.62 gDjNFFGJ.net
>>778
無能管理職かよ
798:デフォルトの名無しさん
19/03/24 14:55:03.02 gZMjxNOF.net
現実的には50並列で全ページ完了待ちするのはどうもなぁ
あと全力でループまわして完了待ちするのも無反応になるんじゃね
とりあえずDoEvents挟もうぜ
>>776
スレッド以前に、IEオブジェクトが別プロセスだから
アウトプロセスのCOM使うのはVBAで並列やる、おそらく安全で簡単な唯一の方法
まあCOM作る方は大変だがな
>>777
OSがサポートしてるだけで、VBAから使えるかどうかとは別の話
VBAで非同期並列やりたければ、基本的にはイベントベースでしかサポートされていない
799:デフォルトの名無しさん
19/03/24 17:00:18.75 cASdygc2.net
>>776
これ、1つずつ待つ部分がVBAでマルチにしたいって話だったけどCreateObjectで既に別プロセスだから全部投げてから全部の完了を待つので正解なんだよな。
勘違いしてマルチプロセスでやろうとしちゃったよ。
ついでにApplication.Runで出来なくて、迷ってたんだけど、またまた勘違いでApplication.OnTimeが正解だった。
でもOnTimeって戻り値が取れないんだよな。
800:デフォルトの名無しさん
19/03/24 17:02:38.91 cASdygc2.net
あと、ExcelVBAスレにあるようにInternetExplorer.Applicationじゃなくて別のオブジェクトの方が早いと思うよ。
801:デフォルトの名無しさん
19/03/24 17:15:34.95 3PVCt58k.net
講釈垂れはいいからコードはよ
802:デフォルトの名無しさん
19/03/24 17:48:52.18 yrUzMInJ.net
とりあえずDoEvents。
803:デフォルトの名無しさん
19/03/24 21:00:07.33 IVIO7oct.net
取りあえず書いてみたんだが、1つずつ待っても速度が変わらん。
テスト用に繋げた所があんまり時間が掛からん所でReadyStateのループに入らんのよ。
取りあえずInternetExplorer.Applicationはやっぱり遅かった。
59個のURLから同じ場所にある特定のデータを取ってくる処理でMSXML2.XMLHttpなら5秒のところIEだと60秒くらい掛かった。
804:デフォルトの名無しさん
19/03/24 23:42:52.24 Y3S3b5Ai.net
IEを普通にUIを持ったアプリケーションとして開けば、クッキーや画面のレンダリングからアクセス履歴の更新やキャッシュの整理までいろんな処理が走るから、そりゃ実質GETだけのXMLHTTPと比べたら遅くなるのは当たり前と言うか
>>785
画像検索にそれぞれ違うキーワードを設定すれば、それなりに時間がかかるようになるから負荷のテストにはおすすめ
805:デフォルトの名無しさん
19/03/25 08:15:58.30 O3TyiYmg.net
>>786
そんなことは知ってるが、ここの話で具体的なのがIEだから、いやいや、IEはこんなに遅いですよと注意喚起したんだよ。
まあ、Script関連でIEじゃないと駄目な場合もあるけどね。
806:デフォルトの名無しさん
19/03/25 21:50:57.49 D+uIa6Au.net
真のエクセラーならieなんか使わずにwebクエリーとか使って何とかするべきだろうが
807:デフォルトの名無しさん
19/03/25 23:08:06.35 DuFQaNpH.net
getElementByもWebクエリも使ったことあるけど、
Webクエリはどうやって取ってきてるのか謎。
808:デフォルトの名無しさん
19/03/25 23:19:23.02 XpTM98r8.net
レンダリングしないでペイロードのパースだけやってるんでしょ
809:デフォルトの名無しさん
19/03/26 00:39:52.05 ke9zWH00.net
誰もSelenium basic使わんの?
IE使わなくていいしセッション維持とかも楽だぉ?
810:デフォルトの名無しさん
19/03/26 18:58:02.34 ADoE3fhW.net
readystateが信用ならんのがな
completeになっても完全に読み込めてなくてその後の要素取得処理に失敗とか高確率で起こるし
WinHTTP使うのが確実だと思う
811:デフォルトの名無しさん
19/03/26 22:23:16.17 0P7j5sat.net
>>791
x だぉ
o だよ
正しい日本語を使いたまえ
812:デフォルトの名無しさん
19/03/26 23:48:15.28 KxwbGcFA.net
結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。
813:デフォルトの名無しさん
19/03/27 00:00:47.48 sk2gWEk1.net
>>794
x 結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。
o 結局Do LoopとOn Error Resume Nextで逃げるしかないっていうことですね。
正しい日本語を使いたまえ
814:デフォルトの名無しさん
19/03/27 00:54:24.99 bUJXWn5A.net
口語体が理解できないやつが正しい日本語とか
815:デフォルトの名無しさん
19/03/27 06:30:58.48 61Xepw/0.net
アスペかしら…
816:デフォルトの名無しさん
19/03/27 07:39:47.73 qB5RyyD6.net
では、教えてくれ。
正しい日本語の"正しい"とはなんのことだ。
先に言っておくが、国語辞典や義務教育は関係ないぞ。
817:デフォルトの名無しさん
19/03/27 08:38:29.06 oJzskUWb.net
>>798
お前のようなノイズではないこと
818:デフォルトの名無しさん
19/03/27 12:48:07.16 Mdwmg5PN.net
>>798
国語辞典や義務教育関係ないと言うのならば口語体でも問題ないと思うが…。
例えば力不足、役不足のように意味を間違えて使っていては当然正しい日本語ではないが、今回の様な場合では相手方に伝われば良いということにならないか。
819:デフォルトの名無しさん
19/03/28 20:50:35.86 GAoTTZZk.net
関西弁は正しい日本語ではない
820:デフォルトの名無しさん
19/03/28 20:59:08.44 M/yCVQ4H.net
正しい日本語とは
821:デフォルトの名無しさん
19/03/28 21:53:50.06 cIkPDI6N.net
>>796
x 口語体が理解できないやつが正しい日本語とか
o 口語体が理解できないやつが正しい日本語とかどういうこと?
822:デフォルトの名無しさん
19/03/28 23:24:25.12 Q+Q3MpKo.net
長いのでWithするかSetしましょう。
With 口語体が理解できないやつが正しい日本語
とか = ×
とかどういうこと? = 〇
End With
823:デフォルトの名無しさん
19/03/28 23:39:02.51 cIkPDI6N.net
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
824:デフォルトの名無しさん
19/03/28 23:57:12.09 OmRArJOr.net
日付フィルターを使うときにCriteriaに設定する値って、必ず一旦Double型に型変換したDate型データをもとにしてFormat変換しなきゃいけないのかな?
Date関数の戻り値をそのままFormat変換してもうまくフィルターがかからなくて危うくハマりかけたんだが、後学のために識者がいたら教えてほしい
825:デフォルトの名無しさん
19/03/29 00:17:35.48 PdUuDb+g.net
まともなレスには異論返せないのな
826:デフォルトの名無しさん
19/03/29 00:47:46.11 MmeaYZo8.net
>>807
x まともなレスには異論返せないのな
o まともなレスには異論返せないのね
827:デフォルトの名無しさん
19/03/29 06:46:41.33 YUbMxDIL.net
>>804
ピリオド抜けてる
828:デフォルトの名無しさん
19/03/29 12:23:42.03 Fu/JMZl+.net
異論返せていないまともなレスとはどれ
829:デフォルトの名無しさん
19/03/29 12:35:07.47 7DnII+1F.net
>>810
この辺りじゃないか?
>>799
>>800
830:デフォルトの名無しさん
19/03/29 12:37:39.38 FHKNInbw.net
どうでも良いことで延々と論じるのは如何なものか。
831:デフォルトの名無しさん
19/03/29 18:52:59.03 DRFZR9Lo.net
>>809
シンタックスエラーになります
832:デフォルトの名無しさん
19/03/30 09:25:26.20 Fw0ogXHz.net
VBAで実行時にシンタックスエラーが出るのはどういう場合だろう
デフォルト設定だと1行入力ごとに構文解析するし
833:デフォルトの名無しさん
19/03/30 09:27:30.74 uS2atdcl.net
>>814
それ、1行ごとの構文解析だろ
For Next Do Loop If End If
のチェックまではしてないと思うぞ
834:デフォルトの名無しさん
19/03/30 09:28:29.64 uS2atdcl.net
ああすまん。これってシンタックスエラーではないんだっけ
でもエラーになるよね
835:デフォルトの名無しさん
19/03/30 09:41:55.36 Fw0ogXHz.net
Nextを書かなかった場合は
「コンパイル エラー:For に対応する Next がありません。」
だった
もしシンタックスエラーのエラーコード(変数Errの値)が存在すれば出る可能性があるってことだと思うけど、コードの一覧てどこにあるんだ?
検索してVBのは出るけどVBAのが見つからん
836:デフォルトの名無しさん
19/03/30 09:49:53.73 uS2atdcl.net
シンタックスって言葉自体は構文規則だけど、コンパイルエラーって出るんだね
837:デフォルトの名無しさん
19/04/06 00:50:26.14 ocPEvB9Z.net
ExcelVBAでListViewを参照設定で追加して
フォームに配置して使っているんですが、
別フォームからshowしてすでに項目をいくつか追加してある
ListViewのあるフォームを表示したときに
ListViewをアクティブ(そのままの状態から矢印キーで項目を選択できるようにする)
にすることは可能ですが?
例えば
Public Sub UserForm_Active()
With listview1
.ListItems(1).Select
.SetFocus
End With
End Sub
とした場合に、フォーカスは確かにListView1にあるのですが、
その状態では項目が矢印キーの上下で選択することができません。
ListView1.SetFocusではListView1全体にフォーカスはあるが
肝心の中身の項目にはフォーカスがない状態ということなのでしょうか?
なにかよい方法はありますでしょうか?
838:デフォルトの名無しさん
19/04/07 19:10:32.15 nvpN9j7Q.net
sendkeysで Alt↓までやっちゃうとか
あまりおすすめできる方法ではないが
839:デフォルトの名無しさん
19/04/21 00:26:59.66 WKly27nG.net
このスレは生きてますか
840:デフォルトの名無しさん
19/04/21 17:39:05.84 VJZKP3mE.net
一応生きてるでしょ。
841:デフォルトの名無しさん
19/05/10 13:15:01.20 SsAAf7AE.net
VBA勉強中のものです。
Setステートメントを勉強しているのですが、オブジェクト型についてお聞きしたいです。RangeオブジェクトとかWorksheetオブジェクトなど、いろんなサイトなど見ても使いどころがよくつかめてないです。
どんなときに使うのか、教えてもらえるとありがたいです。
842:デフォルトの名無しさん
19/05/10 16:53:41.17 SsAAf7AE.net
Excel VBA 質問スレで質問してみます。お邪魔しました m( _ _ )m
843:デフォルトの名無しさん
19/05/12 02:32:02.86 0u/cIV/f.net
>>823
オブジェクトなら同じものを頻繁に扱うときにコーディングミスをしにくくなる。
毎回、名前でアクセスしていると、ちょっとしたことで、別のものを間違って扱う可能性が高まって、実行時エラーを発生させやすくなる。
定数化していれば防げるが、定数のスコープを大きくしないといけないので、定数の値を変えるときにあっちこっちを確認しながら、直すことになり面倒なことになりやすい。
844:デフォルトの名無しさん
19/05/13 13:34:22.56 p6Zrf1zY.net
object型の初期状態はNothing
参照先が存在しない場合もNothing返るのがあってis式で判定できる
一方でvariantの初期状態はemptyなのでis式がエラーになる
845:デフォルトの名無しさん
19/05/13 18:12:50.85 /95lNMvT.net
オブジェクトの値がNothingかどうかで判断するロジックはセンスがいいとは思えない。
846:デフォルトの名無しさん
19/05/13 22:51:51.62 RqskJpsp.net
Typenameとか列挙定数とかポインタ関数の値で判定するのが良いわな
847:デフォルトの名無しさん
19/05/13 23:46:53.76 4/CDP/BQ.net
自分で変数の値をコントロールしているのに、Nothingかどうかをあちこちで確認しているクソプログラマと1年前に仕事した。
848:デフォルトの名無しさん
19/05/14 08:31:35.00 BLcva127.net
>>827
ライブラリ側は何で判定すべきなんだ?
それともNothingを渡されたら挙動は未定義とするとか?
849:デフォルトの名無しさん
19/05/14 11:18:55.94 4FRIObo4.net
>>830
そのライブラリは他人が作ったものなのか?自分が作ったものなのか?
850:デフォルトの名無しさん
19/05/14 11:29:20.25 5X9vxJLP.net
判定すべきものが、誰が作ったかによって変わる?
851:デフォルトの名無しさん
19/05/14 12:37:11.77 W+bs/bzK.net
ライブラリに状態を持つプロパティがあればいい。
他人が作ったものを使うしかなく、オブジェクトがNothingかどうかでしか判断できないのなら、そうするしかない。
852:デフォルトの名無しさん
19/05/14 13:35:55.15 UTGAJPws.net
>>833
ライブラリ関数が引数として受け取ったオブジェクトをどうNullチェックするかの話だぞ?
853:デフォルトの名無しさん
19/05/14 16:16:33.74 E8REZJpG.net
いきなりライブラリと言われても何のことやらわからない。
854:デフォルトの名無しさん
19/05/14 17:30:53.68 UTGAJPws.net
>>835
>>827 が「オブジェクトの値がNothingかどうかで判断するロジック」って言ってるじゃん。
ある関数がオブジェクトを受け取ったときの判断方法の話だと思うんだけど、
自分はライブラリ作者なのでその場合どうするのがいいのか気になった。
855:デフォルトの名無しさん
19/05/14 21:45:48.80 s0Vi/y5R.net
普通にエラーでブレイクすればいいじゃん
856:デフォルトの名無しさん
19/05/14 22:22:18.25 jcYCvcdA.net
>>837
エラーとは限らないけど変数の状態に応じて処理を分けたいと言うのはある。
空のオブジェクトに対してはまた空を返すとかね。
>>829の言ってることはわかるんだけど、>>827と>>828の主張がわからん。
Nothing判定はシンプルだけどTypeNameやenumだともっと分岐のパターンが増えちゃうじゃん。
857:デフォルトの名無しさん
19/05/14 23:23:54.78 +OBjJPst.net
>>836
世の中、変なやつがいて、オブジェクト変数に値をセットして、何も変わるはずがないのに、直後にオブジェクト変数の値がNothingかどうか判定するコードを書くやつがいる。
858:デフォルトの名無しさん
19/05/14 23:30:59.65 KmX6ljlC.net
代入が成功したかどうか確認するテクニックも存在するから、そういう分野からの転職かな?
具体的には、コンパイラの型チェックを使った裏技だったり、ハードウェアの故障チェックなんかで使われる
859:デフォルトの名無しさん
19/05/15 00:37:47.48 yOOg6UjC.net
直後であってもサブルーチンに分かれてるなら
入力情報のチェックを行うのは普通のこと
860:デフォルトの名無しさん
19/05/15 02:24:21.58 MwugOkQt.net
なんか例のCプログラマがしつこいけど、いまどき関係ない別プロセスがメモリ上の値を書き換えたりするミスは、OSレベルでもCPUレベルでもあるので、持論を批判されていると思って反論しなくていいよ。
ここは漠然としたVBAのスレッドだから、見ているひとにはあなたの言うことは難しくて理解できないと思うよ。
スルー力がないのか、寂しくてかまってほしいのか知らないけど、要はクソコードを書くなと言ってるだけだ。
861:デフォルトの名無しさん
19/05/15 02:28:07.88 MwugOkQt.net
なんでVBAスレで組み込み系のショボいハードウェアでのプログラミングを語っているのか?
ハードウェア、OS、ミドルウェア、プログラミング言語によって考え方やどこまで想定するのかは全然、違うからいっしょくたにしないでもらいたい。
862:デフォルトの名無しさん
19/05/15 02:29:01.28 O3OiMSIx.net
一般ユーザー権限のアプリで別プロセスのメモリにアクセスできたのは、平成どころか昭和時代の話ですよ、おじいちゃん
希にOSやCPUのバグ騒ぎが起きますが、そんなのは例外中の例外なんで普通は気にしなくていいことです
863:デフォルトの名無しさん
19/05/15 02:37:35.16 MwugOkQt.net
Windows 95、98、98SE、MeがいつのOSかもわからないのか
864:デフォルトの名無しさん
19/05/15 05:12:46.46 TahQLJDH.net
そこまでわかってるのに、タチの悪いやつだな
865:デフォルトの名無しさん
19/05/15 16:00:34.96 D3RbfE7K.net
イベント用インスタンスはPublicでやるの?
866:デフォルトの名無しさん
19/05/15 20:12:16.23 XVltvZnu.net
せっかくのイベントなのにPrivateにしたら星飛雄馬のクリスマスパーティーみたいになるじゃん
867:デフォルトの名無しさん
19/05/15 20:14:51.37 RIeke8Yt.net
>>848
座蒲団3枚あげる
868:デフォルトの名無しさん
19/05/15 20:49:39.00 WHH9UP0v.net
何か面白いこと言った?
全然わからない。
興味あるからなぜ面白いか教えて?
869:デフォルトの名無しさん
19/05/16 02:08:04.88 Ab5DOH6n.net
>>850
ニコ動
URLリンク(www.nicovideo.jp)
870:デフォルトの名無しさん
19/05/16 14:30:12.55 wWtnEH3A.net
コード書く画面を
背景は黒に、文字は白に、する方法を教えれ
871:デフォルトの名無しさん
19/05/16 17:24:09.37 EX4VaMcQ.net
>>852
ダークテーマと天に向かって3回唱える
872:デフォルトの名無しさん
19/05/16 17:37:55.97 wWtnEH3A.net
>>853
知っておる
スレリンク(tech板:261番)-
下がってよいぞ
873:デフォルトの名無しさん
19/05/23 22:41:23.89 ufKYoT27.net
Wordで文字置換をしたいのですが、特定のフォントの文字列を検索して、文字列は変えずにフォントだけ変えたいです。半角を全角にしたいのですが可能でしょうか。ヒントだけでも教えていただけると有り難いです。
874:デフォルトの名無しさん
19/05/23 23:01:54.16 ubNtK04k.net
>>855
できる
任意のRangeのCharactersのフォントを一字ずつ調べて、探しているフォントが適用されている文字が見つかったらその文字のフォントを修正すればいい
半角から全角に変換するにはStrConv関数を使用し、第2引数conversionには列挙定数のvbWideを指定する
875:デフォルトの名無しさん
19/05/23 23:16:33.41 fmz+6NIG.net
wordの標準機能で半角全角変換あったような
876:デフォルトの名無しさん
19/05/23 23:29:43.67 ufKYoT27.net
>>856
ありがとうございます!
やってみます。
>>857
上手くいかなかったと思います。。
877:859
19/05/28 16:00:47.95 JWvhlEsx.net
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 くみこ
878:859
19/05/28 16:01:28.69 JWvhlEsx.net
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
879:デフォルトの名無しさん
19/05/28 16:38:34.40 Z4r31Ymp.net
>>860
i=i+1 が抜けてるだけじゃね?
880:デフォルトの名無しさん
19/05/28 16:40:41.12 Z4r31Ymp.net
>>861
それと、行や列用の変数として r c 使ってもええんやで
881:859
19/05/28 17:30:10.75 xKlK3b52.net
>>861
ファッ!それかも!
マジでありがとうです!
何かあったらまた聞きます
ホントありがとう、頭いい人!
882:デフォルトの名無しさん
19/05/28 18:33:24.92 1J9FOJWe.net
初心者です。
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を中心にお勧めの書籍などありましたら教えていただきたいです。
今の書籍は痒いところに手が届かず…
883:859
19/05/28 19:44:38.82 xKlK3b52.net
>>861
set temp = .findnext(temp)の下に
i=i+1を入れた所、できました。
本当にありがとう!助かりました(T^T)
884:デフォルトの名無しさん
19/05/29 00:12:19.46 S0wmSPvZ.net
>>864
定番は「最速攻略 Word マクロ / VBA徹底入門」
Word VBAの書籍やWEBサイトは選択肢が圧倒的に少ないから、基本がわかったらVBEのオブジェクトブラウザやネットでMSDNを見た方が確実
885:デフォルトの名無しさん
19/05/29 09:29:45.93 YAhbpcsl.net
学校でVBAを勉強した方はどんな
886:Q考で勉強したんでしょうか?
887:デフォルトの名無しさん
19/05/29 09:30:35.46 YAhbpcsl.net
×参考
◯参考書
888:デフォルトの名無しさん
19/05/29 09:32:43.10 YAhbpcsl.net
書籍の名前聞いてみたい
889:デフォルトの名無しさん
19/05/30 15:12:11.08 V/L1IaNJ.net
>>Wordのユーザーフォーム
必要性が今一分からん
890:デフォルトの名無しさん
19/05/30 18:04:51.34 2aR1E9YD.net
Wordは機能拡張に凝り出すと面白いよ
891:デフォルトの名無しさん
19/05/30 18:38:59.73 3bWSKYGB.net
>>870
いろんなソースで、色つけたり太字にしたり、用紙指定や段組みして印刷させる
。
炎上プロジェクトに突撃するのに必須
892:デフォルトの名無しさん
19/05/30 18:47:13.10 2aR1E9YD.net
>>864
'選択範囲内にあるテーブルの一行目以外をクリアします。
Sub clearSelectedTableData()
If Word.Application.Selection.Tables.Count = 0 Then
'MsgBox "Select Any Table!"
Exit Sub
End If
Dim t As Word.Table
For Each t In Word.Application.Selection.Tables
Dim r As Long, c As Long
For r = 2 To t.Rows.Count
For c = 1 To t.Columns.Count
t.Cell(r, c).Range.Text = ""
Next c
Next r
Next t
End Sub
893:デフォルトの名無しさん
19/05/30 19:32:14.84 2aR1E9YD.net
こっちのがスマートだった
'選択範囲内にあるテーブルの一行目以外をクリアします。
Sub clearSelectedTableData()
If Word.Application.Selection.Tables.Count = 0 Then
'MsgBox "Select Any Table!"
Exit Sub
End If
Dim t As Word.Table
For Each t In Word.Application.Selection.Tables
If t.Rows.Count > 2 Then
Dim r As Long
For r = 2 To t.Rows.Count
t.Rows(r).Range.Delete
Next r
End If
Next t
End Sub
894:デフォルトの名無しさん
19/05/30 19:50:35.91 2aR1E9YD.net
もし文字編集でcell()下位の.Rangeが省略されてるのを知らないと
cell.Range.Deleteの文字削除とcell.Deleteのセル削除が
使い分けができないので注意
895:デフォルトの名無しさん
19/05/30 22:47:58.04 JR52NV0g.net
>>871
そうだろうけど、
他のOfficeでも出来るんじゃないの?
拡張って参照設定の事でしょ?
>>874
マジかよWord Tableって・・。
ExcelでSQLが使えたり、Officeは割と何でもありだとは思っていたが・・。
896:デフォルトの名無しさん
19/05/30 23:32:10.68 2aR1E9YD.net
>>876
リボンやクイックアクセスツールバーとかで増やすほうね>機能拡張
897:デフォルトの名無しさん
19/05/31 00:15:43.14 P50R/Vqw.net
NothingとNullとEmptyの違いがわからない
MSはナンセンス、はっきりわかんだね
898:デフォルトの名無しさん
19/05/31 00:35:41.84 /aDGaFpI.net
EmptyはVariant型の初期状態(何も入ってない)
セルの初期状態でもある
確認方法
新規ワークシートに対して、イミディエイトウィンドウで
Print TypeName(Cells(1,1).Value)
とすると
Empty
と表示される
Nothingはオブジェクト型変数にオブジェクトが代入されていない(結びつけられていない)状態
NullはExcelだと出番がないと思っていい
主にAccessでデータを扱う時にNullが必要な場面が出てくる
899:デフォルトの名無しさん
19/05/31 01:16:13.09 gZfVve3x.net
複数セルのRangeからプロパティとってくるとき不一致だとNullになるくらいやな
900:デフォルトの名無しさん
19/06/02 23:52:18.62 I/vPFDmN.net
ユーザーフォームの、複数のテキストボックス、
例えばオブジェクト名をtb1、tb2とかにしてループ文に組み込むということはできますか?
オブジェクト変数というのが関係しそうな気がするんですが、
テキストを読んでも理解できない…
901:デフォルトの名無しさん
19/06/02 23:56:26.76 56udfPFB.net
>>881
すべてのテキストボックスでループ。
目的のテキストボックス群で名前を元に絞り込みすりゃ良いんじゃね。
902:デフォルトの名無しさん
19/06/03 02:05:13.53 OjX7Po3D.net
普通はテキストボックスのTagプロバティに区別できるキーワード入れといて
For eachでUserform.controlsやると思う
903:デフォルトの名無しさん
19/06/03 08:31:11.52 mpVNxBbp.net
>>881
controls(”tb” & i)
904:デフォルトの名無しさん
19/06/03 13:44:44.83 DCISZKmM.net
>>881
オブジェクトの配列作って、という事だと思うけど
使うとしたらオブジェクト参照を保持したまま色々したい時ぐらいかも
値の参照とセットだけなら皆さん挙げられているcontrolsでやりますね
905:デフォルトの名無しさん
19/06/08 00:31:30.90 ycKO1KOa.net
vba スタンダード 、accessのおすすめの問題集ってやっぱり公式テキストでしょうか。
906:デフォルトの名無しさん
19/06/08 11:47:13.10 pWKWNjKi.net
エクセル Cells(1,1)
ワード Cell(1,1)
↑
は? 何でワードにはsが無い?
907:デフォルトの名無しさん
19/06/08 16:19:13.22 pA8BerVC.net
>>886
先月に出題範囲かわったし公式でしょ
908:デフォルトの名無しさん
19/06/08 16:27:53.67 pA8BerVC.net
>>887
Word.Selection.CellsとかRow.Cellsとかあるで
Tableには.Cell(1,1)しかないがな
ちなCellsはxy指定できんがCellはxy指定必須や
エクセルのプロパティのほうが異常なんやで
909:デフォルトの名無しさん
19/06/12 20:44:31.77 WUwNpP1f.net
新垣結衣 AVデビュー
URLリンク(www.xvideos.com)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
285日前に更新/325 KB
担当:undef