[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 03/22 05:48 / Filesize : 289 KB / Number-of Response : 1047
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part57



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]
適当ならいいじゃないか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<289KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef