X



Excel VBA 質問スレ Part63

レス数が900を超えています。1000を超えると表示できなくなるよ。
0830デフォルトの名無しさん (アウアウカー Sa55-DMja)
垢版 |
2019/11/25(月) 15:30:30.80ID:Q3qCCewla
>>827
VBAスレなんで余談だけど
VBAでやるんなら>>829
手動なら検索窓に「ctrl+J」を入れて全て置換って方法もある
0833デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/25(月) 17:03:29.94ID:Wzgj59oVx
>>824
クラスモジュールというのはユーザーが独自にメソッドやプロパティ、イベントを定義して使えるオブジェクトのことで、本質的にはユーザーフォームと変わらない設計とコーディングに結構手間がかかる
オブジェクト化によるカプセル化がどうしても必要なら試してもいいが、肥大化したモジュールのコードの可読性改善くらいの目的であればやらない方がいいかもしれない
クラス内に定義された関数を呼び出すにも、そのクラスの型をもつ変数を宣言してインスタンスを生成してメソッドを呼び出なければならなくなるのでね

モジュールがごちゃごちゃして嫌なら、モジュールに記載している関数を機能カテゴリに分類して、各機能カテゴリごとモジュールを分ければいいんじゃないのかな
文字列操作系、メール送信機能系、メッセージダイアログ系、みたいな感じの切り分けで
0834デフォルトの名無しさん (ワッチョイ 7145-MY8M)
垢版 |
2019/11/25(月) 18:09:55.21ID:H9kNla+G0
>>833
ありがとうございます
おっしゃる通りで今問題なく動くプログラムをわざわざ変える必要は無いですね
まずはモジュールを分けるところから始めてみます
今後プログラムを作る際の参考にさせていただきます
0842デフォルトの名無しさん (アークセー Sxc5-dWLu)
垢版 |
2019/11/26(火) 20:19:14.53ID:sWZAZ3HSx
>>837
参照追跡方式の本当のガベコレは利用できないけどCOM標準の参照カウンタ方式のリソース管理システムはバックグラウンドで使ってるだろ
循環参照が発生してるとリソース解放できないやつね
0843デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 20:33:43.32ID:+5U3MHb30
A列の値が「ア行」、B列の値が「あいうえお」のうちどれかであればC列を赤く塗り、
同じく「カ行」で「かきくけこ」のうちどれかであれば青く塗る、というような処理をしたくて
以下のようにしたところ一応うまくいったのですが、
「ア行 and あ」or「ア行 and い」or ……
というような複数条件の書き方はこれであっているのでしょうか?

If InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0
Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 Then
Range("C2").Interior.Color = RGB(255, 0, 0)

ElseIf InStr(Range("A2").Value, "カ行") > 0 And InStr(Range("B2").Value, "か") > 0
Or InStr(Range("B2").Value, "き") > 0 Or InStr(Range("B2").Value, "く") > 0
Or InStr(Range("B2").Value, "け") > 0 Or InStr(Range("B2").Value, "こ") > 0 Then
Range("C2").Interior.Color = RGB(0, 0, 255)
0846デフォルトの名無しさん (ドコグロ MM63-hZ32)
垢版 |
2019/11/26(火) 21:29:30.19ID:6EvauiRdM
>>843
> 「ア行 and あ」or「ア行 and い」or ……
> というような複数条件の書き方はこれであっているのでしょうか?
ダメ
AndよりOrの方が優先順位が低いので
InStr(Range("A2").Value, "ア行") > 0
And InStr(Range("B2").Value, "あ") > 0
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0

(InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0)
Or InStr(Range("B2").Value, "い") > 0
Or InStr(Range("B2").Value, "う") > 0
Or InStr(Range("B2").Value, "え") > 0
Or InStr(Range("B2").Value, "お") > 0
のように解釈される
なのでA2が "ア行" でなくてもB2が "い" だと成立しちゃう
詳しくは
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence
を見て
0847デフォルトの名無しさん (ドコグロ MM63-hZ32)
垢版 |
2019/11/26(火) 21:38:29.33ID:6EvauiRdM
>>843
そもそも
> A列の値が「ア行」
と言うなら
Range("A2").Value = "ア行"
と書けばいい
InStr(Range("A2").Value, "ア行") > 0
だとA2が "マレーシア行きのバスはここから出ます" でも成立しちゃうけどそれはいいのか?
0848デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:41:08.57ID:+5U3MHb30
あらそうだったんですね。ということは

InStr(Range("A2").Value, "ア行") > 0
And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then

という感じにすればいいんでしょうか?
0850デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:46:05.70ID:+5U3MHb30
ああなるほど。文言は固定でかぶってる言葉がなかったので大丈夫だったんだと思います
すでにあった文言の組み合わせの違うVBAをいじったもんですからそれを大枠はそれをそのまま
使ったんですけどそう言われればそうですね
0851デフォルトの名無しさん (ワッチョイ 8139-QS5Z)
垢版 |
2019/11/26(火) 21:50:37.69ID:+5U3MHb30
If Range("A2").Value = "ア行"
And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then
Elseif Range("A2").Value = "カ行"
And (InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "こ") > 0) Then

こうでしょうか?
0870デフォルトの名無しさん (ワッチョイ 69f1-hgyP)
垢版 |
2019/11/27(水) 20:35:10.07ID:fWLksagp0
>>869
ボケがはじまっているのでわ?
アルツハイマーだとやっかいですよ
0872デフォルトの名無しさん (ワッチョイ 1301-7uad)
垢版 |
2019/11/27(水) 20:47:12.82ID:Bgz7f5eR0
>>867
集中してるとそこまで対処してるか!みたいなのが書ける時があって
後から見てなんでこんなのあるんだ?って思うことがある
同じことやろうと思っても出来なかったり
だから自分に対してのコメント必須だわ
0874デフォルトの名無しさん (ワッチョイ c1da-pyDD)
垢版 |
2019/11/27(水) 21:25:04.01ID:Htaq5k6U0
>>819
>>832
もうちょっと調べてみたが、
種類に関係なく、最初に配置したオブジェクトだけが透過することがわかった。
しかも、コマンドボタンは常時透過するが、
テキストボックスとラベルは、アクティブになっている時だけ透過するっていう。
だから、どでかいコマンドボタンに特大フォントで■(四角)を書くとか、
本当に無理矢理やろうと思えば出来るんだろうけど、それはちょっとねぇ・・・。
0875デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/11/28(木) 00:11:11.99ID:SmApZ4N10
VBAでChromeのタブブラウザを思い通りに操作することってできます?
IEのタブブラウザも思い通りに操作する方法も知りたいけど。
0877デフォルトの名無しさん (ワッチョイ 922c-Ql8R)
垢版 |
2019/11/28(木) 01:58:43.77ID:WsOSEkue0
Ruby で、Selenium Webdriver を使っているけど、タブ移動は出来る!

url_0 = "URL 0"
url_1 = "URL 1"

driver.navigate.to url_0 # url_0 を開く

driver.execute_script( "window.open()" ) # 新しいタブを開く
driver.switch_to.window( driver.window_handles.last ) # 新しいタブへ移動する
driver.navigate.to url_1 # url_1 を開く

all_handles = driver.window_handles # すべてのタブ
driver.switch_to.window( all_handles[ 0 ] ) # url_0 へ移動する
0878877 (ワッチョイ 922c-Ql8R)
垢版 |
2019/11/28(木) 02:00:57.37ID:WsOSEkue0
driver.execute_script( "window.open()" ) # 新しいタブを開く

driver.execute_script で、JavaScript のソースコードを書ける
0879デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 13:28:48.35ID:o1brOXQcd
>>874
以前の挙動ってセル罫線は見えるけどセル自体は透過して、下への入力が出来るというものだった記憶があるんだけど、そういう動作を望んでるってことだよね。
単純にセル範囲全体、もしくは部分を完全透過するって意味じゃ無いよね。
セル範囲、もしくは部分を完全透過して下へ入力出来るっていうのなら簡単に実現出来ると思う。
試して無いけど。
0881デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 21:00:27.22ID:o1brOXQcd
>>880
SetLayeredWindowAttributesは多分無理だと思う。
使ったことないけどUpdateLayeredWindowも同じかな?

この種のAPIは諦めて、リージョン使ってウィンドウの形状をくり抜いた形に変形する方法を使って出来たけど、色指定とかも出来ないし、くり抜いた部分は問答無用で透過する。
当然、罫線も透過する。
それからブックのウィンドウを移動すると元に戻る。
こっちはサブクラスでどうにか出来なかったかな。

くり抜く部分は右端列、下端行の見切れる所を正確に取得するのが面倒くさい。
指定セル範囲なら簡単なんだけど。
0882デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 21:05:43.61ID:o1brOXQcd
元々、無理矢理やろうとしてたのは半透明にしてその描画をメモリに取得してから完全透明にして、デスクトップに取得した描画を書き込むことを考えたけど、再描画で無茶苦茶チラつきそうで断念した。
0884デフォルトの名無しさん (スッップ Sdb2-iiDQ)
垢版 |
2019/11/29(金) 23:10:37.96ID:o1brOXQcd
ググレばサンプルや答えが見つかるとか言ってた奴がいたけど、ググってどうにかなるようなレベルの低いものは、問題にすらならないわけでね。
わざわざ覚えるようなことをしてないだけでググレば答えが見つかるのが分かってるんだよ。

一方、問題になるようなレベルの高いものはググっても答えが見つかることは殆ど無いわけだ。
0885デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 16:10:24.85ID:gvdsBQuZ0
最近独学ではじめたんだがググっても出ないから質問させてくれ
if の条件式をセルから読み取ることできない?
例えば
セルA1に1+1=2って入力してあって
VBAで
if cells(1,1).value then
end if
的なことを実行したいんだが・・・
0887デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/11/30(土) 16:26:59.80ID:PE5ncLuo0
セルA2には1+1=3って入力してあるんです
0889デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 17:14:03.21ID:gvdsBQuZ0
>>886
すまん例がわるかった
セルになんでもいいから条件式が入力されてて
それをVBAのif文で読み取りたい

>>888
ありがとうございます。やってみます。
0893デフォルトの名無しさん (ワッチョイ 655f-abYQ)
垢版 |
2019/11/30(土) 18:58:56.97ID:gvdsBQuZ0
>>892
そういうこと
条件の例が悪すぎだった
0894デフォルトの名無しさん (スプッッ Sd12-abYQ)
垢版 |
2019/11/30(土) 19:00:48.42ID:vHVqnqrEd
文字列(1+2)*3を計算して数値にしてくれる方法ないかね
0901デフォルトの名無しさん (ワッチョイ 0920-tQqL)
垢版 |
2019/12/01(日) 01:14:32.95ID:hVa/XxLC0
転記マクロを作っていて、AのブックからBのブックに転記をしようと考えているのですが
Aの転記する部分を一旦構造体に全部取り込んでしまってからBブックを開いて転記する方法と
AとBのブックをその都度比較して転記するかで悩んでいます
どっちの方がいいんでしょうか?
0903デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 01:32:52.78ID:Mv7XM2680
オブジェ.pastespecial(xlpaste〇〇)
オブジェ.pastespecial paste := xlpaste〇〇

これ何が違うの?
前者は戻り値はカッコをつけるっていうルールに従ってなくね?
0904デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 06:15:52.01ID:qadFHjVDx
>>903
前者はメソッドが返す戻り値を取得するために関数としてメソッドを使用している
文法上、引数指定の箇所で括弧が必要

後者はメソッドをコールしてそのまま次の処理に制御を渡している
引数指定の箇所には文法上括弧が不要
0905デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 06:39:57.40ID:Mv7XM2680
>>904
関数とメゾットの違いって何?
pastespecialってメゾットじゃないの?
0906デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 06:49:15.69ID:Mv7XM2680
pastespecial xlpaste〇〇

これでも行けた…
pastespecialメゾットの戻り値ってなんだ?
x = オブジェ.pastespecial(xlpaste〇〇)

こんなの使うときあるの?
pastespecialの戻り値を使う意味が全くわからない


If MsgBox("実行しますか?", vbYesNo) = vbNo Then
これは戻り値がTRUEかfalseだから意味がわかるけど
0907デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 07:55:36.72ID:lg6qJlYj0
>>903
オブジェ→オブジェクト

Selection.PasteSpecial Paste:=xlPasteValues
Selection.PasteSpecial(xlPasteValues)
そういう文法。
前者のメリットは指定できる引数が大量にある時、一つだけ記述することができる上に見やすい
ただ、「:=」のコロンを見落としやすいのがネック
引数が一つだけの時は前者で書く理由はないと思う

>>905
メゾット→メソッド
メソッド=クラス内関数
ただ、vbaなんて全部applicationクラス(と思う)から、関数は全てメソッドに当たりそう
pastespecialはメソッドで間違いない

>>906
>こんなの使うときあるの?
>pastespecialの戻り値を使う意味が全くわからない
そもそも使わないから返り値なんてなんでも良い
俺も使った事無いけど、あえて返すとすればペーストの失敗か成功なのは間違いないだろう
0908デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 08:06:02.34ID:qadFHjVDx
>>905
メゾットではなくメソッド(Method)ね
PasteSpecialはメソッドだよ

関数の定義は曖昧だが、ここでは制御と戻り値を返す命令文の意味で使っている
一方メソッドはオブジェクト外からアクセス可能になるようメンバとして実装された機能プログラムのことを指す
戻り値を返すものと返さないものの両方がある
0909デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:12:27.61ID:Mv7XM2680
>>907
あんまわからないけど
endプロパティは
end(xlup)これ以外に書く方法ってある?
end shift :=xlupとかそんなのでもいけそうな感じするけど
0910デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 08:14:33.55ID:qadFHjVDx
>>907
細かい話だが、VB6共通の標準関数やステートメント類、列挙定数はApplicationクラス配下のメンバではないはず
あと調べていけばApplicationクラスから独立しているクラスもあるかもしれない
プログラム本体をコードする言語ではなくマクロ言語なのでApplicationというカレントなインスタンスに依存しないクラスがあってもおかしくない
0911デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:17:59.92ID:Mv7XM2680
初心者にメンバとかクラス外とか言われてもわからん
0912デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 08:25:10.96ID:BdsW8ng60
>>903,906
引数の指定方法が、位置指定か名前付き引数指定かの違い
戻り値使わないときでも引数の指定に括弧を付けても問題ない

>>905
関数とメソッドの違いはあいまい
ヘルプ類見る限り、VBA組み込みのメソッドを関数と呼んでるっぽい
一般的にはそれ以外のオブジェクトのメソッドも関数と呼ばれたりする


PasteSpecialの戻り値は俺も使ったことないからよくわからんな
まあ戻り値があるからといって、必ず使わなければいけないというもんでもない
0915デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:37:40.53ID:Mv7XM2680
>>913
メンバとオブジェクトの違いって何?
0917デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 08:39:31.79ID:Mv7XM2680
>>916
なんでカッコがいるんだ…
end direction :=xlupじゃダメなのか…
こういうのって気にする人いる?
エラー出たらかっこつけるとかメソット、プロパティの引数指定にはとりあえずかっこつけるとかしてる?
0918デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 08:48:55.22ID:lg6qJlYj0
>>909>>917
今回はプロパティ。さっきのはメソッド
vbaは見た目が一緒だから死ぬほどややこしいけど、まぁいつも通りに書いてればいいよ
俺もendはメソッドと思ってたけど問題なかったし

>>910
そうそう、その辺り考え出すとまぁ例外もあるよな〜って思ってたけどアホらしくなって考えるのを止めた

>>911
このレベルの事を聞きたいなら最低限クラスは覚えないとついていけないぞ
ただそれを理解すれば一気にレベルアップする
0924デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:04:29.40ID:Mv7XM2680
なんかイマイチな答えしかこないな

俺は、プロパティ、メソッドで()がつく場合とつかない場合の違いは何?
全部()つけるでいいの?どう意識してるの?ってきいてる

これに対してクラスガーとか言われてもわからん
0925デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 09:04:33.88ID:BdsW8ng60
>>917
プロパティの引数の括弧は省略できなかったと思う
メソッド(関数)呼び出しで、戻り値を使わない場合は括弧がなくてもいい

この辺は、大昔の文法との見た目を合わせるための仕様
慣れれば自然と使い分けれるようになるから頑張れ
0926デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:05:35.25ID:Mv7XM2680
>>923
RANGEもコレクションだろ
RANGE(a1)でメンバーだろ
0929デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:09:06.82ID:Mv7XM2680
>>928
君はどうしてるの?
レス数が900を超えています。1000を超えると表示できなくなるよ。

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