1 名前:デフォルトの名無しさん mailto:sage [2018/09/10(月) 21:42:39.57 ID:K1uuwFLt.net] ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part56 mevius.5ch.net/test/read.cgi/tech/1534976724/
567 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 09:11:12.18 ID:ZcbeCQ3S.net] UsedRangeはプロパティに変更が加えられたセルを全てカウントアップするから物凄く癖がある うっかり列範囲全体に書式設定なんかしてると最終行は1,048,576行目なんてことになるので注意
568 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 12:04:05.58 ID:x9VzQgv/.net] >>543 列に対しての書式設定ならそんな風にはならない。 貼り付けするとそうなる危険性はあるけど、今のエクセルは警告出るし、実行に時間かかるし、めちゃくちゃ重たくなるから、マクロ以前にブック修復すべき案件
569 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 13:15:55.34 ID:Vut2i4+m.net] Do loop関数でウェブ上の変数を取り込んでセルに表示したいんですが、セルA1に最新の変数を表示し、一つ過去のは真下セルに移動する これを繰り返して変数をA列に積み上げいくようにしたいんですが、どうすればよいでしょうか
570 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 13:37:33.14 ID:Vut2i4+m.net] 挿入でできました 失礼しました
571 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 14:40:06.72 ID:Vut2i4+m.net] Selenium Webdriverについて質問です。 @chromeを起動 Aあるwebサイトのユーザーページにログイン Bユーザーページ上で作業 という操作を自動化しようとしています。 @、Aは良いのですがBが複雑なため、その部分のコードで試行錯誤しております。 しかしコードを修正するたびに@から行っているため時間がかかっております。 @Aで起動したブラウザを利用して、Bから別のsubプロシージャにして、Bだけ実行して検証したいのですがどのようにすればよいのでしょうか。 下が@Aのコードです。 sub 1() Dim driver As New SeleniumWrapper.WebDriver driver.Start "chrome", "https://aaa.com/login?" driver.get ("/") driver.findElementByName("UserID").SendKeys ("yamada") driver.findElementByName("pass_word").SendKeys ("1234")
572 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 17:50:31.63 ID:ImPAYWBj.net] Private driver As SeleniumWrapper.WebDriver Sub Init() @ A End Sub Sub Work() driver.get(ユーザーページ) B End Sub 他のスクリプト言語に変えたほうが楽ですよ
573 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 18:15:13.64 ID:Vut2i4+m.net] >>548 ありがとうございます。 やってみたのですが、getメソッドでSystem.NullReferenceExceptionというエラーが出ます..... 他のスクリプト言語というとRubyということになるのでしょうか?
574 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 18:36:18.81 ID:/wVNZxwJ.net] >>549 driverを初期化してないからだと思うぞ。
575 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 18:46:00.60 ID:Vut2i4+m.net] >>550 大変申し訳ないのですが詳しく説明して頂けないでしょうか.... 勉強不足ですみません
576 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 19:13:03.15 ID:/wVNZxwJ.net] >>551 Private driver As SeleniumWrapper.WebDriver ←モジュール領域(各プロシージャの更に上位)でdriverを定義。ただし初期化していない。 Sub Init() ←Initプロシージャを実行する時にdriverを初期化し@・Aを実行する必要がある Set driver = New SeleniumWrapper.WebDriver ←ココ
577 名前: @ A End Sub Sub Work() ←Initプロシージャを実行してからWorkプロシージャを実行すると、色々(B)を実行してくれる driver.get(ユーザーページ) B End Sub 念のため言っとくと俺は>>548 じゃないがついでに解説しただけで、 >>547 が求めているものがこれで満たせるのかまでは関知しない。 [] [ここ壊れてます]
578 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 19:25:04.84 ID:USJCeaSx.net] 質問いいですか? VBAでコールバックを行うとき クラスが対象の場合はCallByNameで行う事が出来ますが 標準モジュールの場合、どうするんでしたっけ? 確かAPIを使った様な気がしたんですが どのAPIを使ってどうするのか 忘れてしまいました。
579 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 19:32:08.96 ID:apogHBJA.net] >>553 忘れたけど ariawase を見れば出てくるんじゃね
580 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:46:51.81 ID:Vut2i4+m.net] >>552 とても丁寧にありがとうございます。追加質問させてほしいです。 A: 今回「driver」はオブジェクト変数となるため、定義の際はnew演算子を使用する。またはsetで格納する必要がある。ということで良いのでしょうか? B: >>552 で「ただし初期化していない」とありますが、あるサイトで「vbaでは変数宣言したときに初期化が行われる」という記述を見ました。 これは、setで格納されてないから初期化すらされてない という意味でしょうか。 C: プロシージャが実行されるごとに初期化されればよいならば、private変数の定義をやめて、@〜A、BそれぞれでDim driver As New SeleniumWrapper.WebDriver と定義すればエラーは出ないと思ったのですが、 やはりBのgetメソッドのところで「System.NullReferenceException」エラーが出てしまいました。何故なのでしょうか・・・ 長文ですみません どうか宜しくお願いいたします。
581 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 22:18:56.04 ID:/wVNZxwJ.net] >>555 A: あってる B: だいたいあってる C: まずコードが動くことを確認してから弄れ。>>548 の意図が汲めないならすっぱり諦めて別の方法を考えろ。 流石にこれ以上は自分で調べろ。 追伸 B: とりあえず「値型は宣言と同時に初期化される、オブジェクト型はNewやSetをしてからでないと使えない」と思っとけ C: 要はWebDriverの「使い回し」がしたいという質問に答えたのが>>548 ・モジュールレベルで宣言すれば、各プロシージャ内から変数「driver」を通じて同じ実体(インスタンスという)にアクセスできる ・Initでモジュールレベル変数「driver」を初期化したりStartなどのメソッドを実行すれば、Workでdriverにアクセスした時にその続きのアレコレができる ・逆にInitで初期化やStartその他を実行したにもかかわらずWorkで新たな変数「driver」を宣言したらInitで行った処理が水泡に帰する ・またInit内で新たな変数「driver」を宣言し初期化等をした場合も、Init終了と同時に実体が消えて無くなる 仕事中なんであれこれ端折って書いたので間違ってる部分もあるかもしれんが、「インスタンス」とか「スコープ」とかでググって調べてみてくれ。
582 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 22:32:59.61 ID:Vut2i4+m.net] >>556 本当に丁寧にありがとうございます。 伝えるのを忘れていましたが、言われた通りにコードを記述しうまくいきました。それを踏まえてのCでした。 インスタンス、スコープで調べてみます。ありがとうございました。
583 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 12:52:55.81 ID:VkzGqctC.net] 「選択したセルの値を-1する」のに下記のようなプログラムを書いた。 Dim cell As Range For Each cell In Selection cell.Value = cell - 1 Next これはOK。 「セルの値がブランクまたは0のとき、ブランクにする」を追加して、 Dim cell As Range For Each cell In Selection If cell.Value <> 0 Then cell.Value = cell - 1 Else Next としたら「Nextに対応するForがありません」と怒られてしまいました。 どこがいけないのでしょうか?
584 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 12:58:15.96 ID:vSWfZutq.net] if文が閉じてないから
585 名前:デフォルトの名無しさん [2018/10/05(金) 16:28:56.84 ID:JjUc2WZB.net] >>558 お前の知能に障害がある
586 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 16:54:22.89 ID:9/5M8DWU.net] >>558 インデントが適当だからそういうミスに気がつかない
587 名前:デフォルトの名無しさん [2018/10/05(金) 17:24:22.25 ID:KMKJ670I.net] else nextとか書く馬鹿にインデントもなにもねーよ
588 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 17:30:08.09 ID:nkW6jPyv.net] 適当ならいいじゃないか