X



Excel VBA 質問スレ Part63

レス数が950を超えています。1000を超えると書き込みができなくなります。
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
君はどうしてるの?
0930デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 09:20:24.90ID:BdsW8ng60
>>929
俺は
名前付き引数は使わない
括弧を省略できるときは省略する

基本はこんな感じ
でもそう書かないときもある
あと複数人でソース見るときは事前にルール決めることもある
0931デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:27:30.25ID:Mv7XM2680
>>930
なるほど!
名前付き引数を使わないときや戻り値を使うときには()がいる
名前付き引数を使うときは:=で()不要
この認識でいい?
0932デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 09:30:09.60ID:qadFHjVDx
>>926
全然違う
RangeクラスとRangeプロパティを混同してはいけない

Range("A1")の式はWorksheetクラスのメンバのRangeプロパティを引数つきで呼び出している
このプロパティ式で参照を取得しているのが、Excelのオブジェクトモデルで定義されたRangeクラスの実体(インスタンス)、つまりA1セルになる
要するに、Range("A1").Valueと書いた場合、.Value以下がRangeオブジェクトのメンバになる

Rangeクラスがセル範囲のコレクションとして自己再帰的に実装されているのは確かだけどね
0935デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 09:47:10.20ID:Mv7XM2680
>>932
中級者ならわかるけど
初心者にはまったくわからんな
そこらへんの文法を初心者向けに解説してるサイトある?
0939デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:05:48.08ID:qadFHjVDx
>>935
緑川吉行っていうOffice/VBA界の有名人が初心者向けに書いた記事
https://allabout.co.jp/gm/gc/297719/

これはコンパクトで分かりやすい。ただし初心者向けにわざとSheetsをオブジェクト名とかコレクション名とか言っているのは問題がある

正確な知識を得るならこっち

インストラクターのネタ帳 -
「オブジェクト名.プロパティ」という解説はウソですよ
https://www.relief.jp/docs/excel-vba-that-is-not-object-name.html
0940デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:12:50.14ID:qadFHjVDx
>>938
Callの引数として引数付き関数を呼び出す場合、呼び出される側の引数を特定して先に評価してCallに渡さなきゃいけないから括弧必須なんだよな
しかも戻り値が取れないという
0942デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 10:21:01.02ID:19U1wNi50
>>939
どう間違ってるのですか?
0944デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 10:25:54.76ID:qadFHjVDx
>>941
組み込みオブジェクトはそもそも仕様としてNewできなさそうだけどな
要は As ActiveCell とか As Cells とかいう型指定が出来ないってことだわ、そういうクラスが存在しないわけだから
0947デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 11:27:41.76ID:lg6qJlYj0
インスタンスという概念が無いとそれが新規のオブジェクトなのか既存のオブジェクトかの見分けが付かないよ
他の言語だとstaticとかインスタンス化せずに使えるクラスもあるけどね
0948デフォルトの名無しさん (スップ Sd12-a1aH)
垢版 |
2019/12/01(日) 11:52:45.15ID:tARyXBCrd
インスタンス化は実体化するため=メモリ領域確保するためって解釈だけど
integerだろうがstringだろうがメモリ確保してるわけだし

>>947
dim x as classtest
dim y as classtest
みたいなので見分けってつかないの?
0949デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 12:08:59.14ID:qadFHjVDx
正確に言うと値の代入もLetステートメントで行うのがBasic系言語の本来の姿
それを規約上で略記できるようにしているにすぎない
逆にSetステートメントは言語設計上、変数用に確保されたスタックメモリに格納される値がヒープへの参照ポインタであることを示す役割を持っているものと思われる
Variant型変数にオブジェクトを代入するときもこのSetがあるおかげで、スタックの値を参照アドレスとして解釈できるようになっているはず
0952デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 14:45:17.26ID:qadFHjVDx
>>951
Letとのバッティングだろう
推測だが、VB6/VBAのコンパイラは、代入演算子と等価演算子がともに'='であることを前提とした仕様になっているんだと思う
プリミティブ型の値の代入はスタックの値のコピーに他ならないので、代入演算子を等価演算子と混同しても論理矛盾が起きない

オブジェクトの場合はそうはいかないので、オブジェクト変数として型宣言した変数へのインスタンス代入の際にはSetの識別子付与を強制するようにしてるんじゃなかろうか

VB.NETではSetが要らなくなってるからコンパイラの仕様だよなこれは
0953デフォルトの名無しさん (ワッチョイ 9279-luhV)
垢版 |
2019/12/01(日) 15:01:32.65ID:pJZuHPp00
参照カウント型GCの都合だよ
Setで左辺のオブジェクトの参照カウントが+1されて変数に束縛される
左辺がNothingだったら束縛していたオブジェクト参照カウントを-1する
変数がemptyやNothingだったら何もしない
見た目以上に重い代入処理
関数や手続きの戻りまで行ったら全てのローカル変数に対してSet 変数 = Nothing相当の処理をする
だから関数の最後でNothingの代入は不要
ただし
0955デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 15:43:44.55ID:BdsW8ng60
>>951
Setが省略できないのはデフォルトプロパティとの絡み
SetもLetもないと、デフォルトプロパティへの代入なのかインスタンスそのものの代入なのか区別がつかないから
文法解釈の問題で、GCや参照カウンタの問題ではないよ

>>952
VB.Netではデフォルトプロパティという概念を変えて
一部条件以外でのデフォルトプロパティの省略を禁止した
コンパイラは文法を解釈してるわけで、言語仕様の問題

ちなみに=が等価演算子か比較演算子かの解釈に、値型か参照型の区別は関係ない
VB.Netがそうだろ
0958デフォルトの名無しさん (ワッチョイ 122f-Ql8R)
垢版 |
2019/12/01(日) 16:05:54.42ID:BdsW8ng60
>>942
ちょっとリンク先見てみたけど、微妙な説明してるなぁ
混乱する一番の原因は、
オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
っていう指針があるから

Dim r As Range
のRangeは型名(=オブジェクト名)

Set r = ActiveSheet.Range("A1")
のRangeは文法的にはWorksheetオブジェクトのRangeプロパティ
RangeプロパティはRange型のインスタンスを返す

ActiveSheetなんてオブジェクトはないが、これは
Set r = Application.ActiveSheet.Range("A1")
の省略形とみなされるので、ApplicationオブジェクトのActiveSheetプロパティだと解釈される
ActiveSheetプロパティが返しているものがWorksheetオブジェクト(のインスタンス)

Worksheet型じゃなくてSheet型だろとかいう突っ込みとか
Rangeのデフォルトプロパティだろとかいう突っ込みは勘弁な
0959デフォルトの名無しさん (ワッチョイ 9201-MhVQ)
垢版 |
2019/12/01(日) 18:07:13.10ID:Enyr5Fgf0
>>958
> 混乱する一番の原因は、
> オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
> っていう指針があるから
違うよ
オブジェクトなんて曖昧な用語を使うから混乱するの
型(クラス)と実体(インスタンス)をきちんと区別すればいいだけ
0962デフォルトの名無しさん (ワッチョイ 69f0-a1aH)
垢版 |
2019/12/01(日) 19:43:10.04ID:oxdJbHeB0
値型はNewしないで参照型はNewするというルールに従うと
別言語でStringは参照型なのに何でNewしなくていいのかと悩んだな
結局参照型でもNewしなくていい場合があるってスルーするのが一番だけど
0964デフォルトの名無しさん (ワッチョイ a9b3-nvwQ)
垢版 |
2019/12/01(日) 20:17:07.69ID:Ta8YhOMq0
え、プロパティの引数って絶対に()つけないといけないの?
そこら辺の文法が謎だわ
本でも説明されてないし
ネットで検索しまくってもプロパティの引数には()をつけろなんて書いてないし
どこでそんな知識仕入れてきたの?
0966デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 20:35:21.31ID:Mv7XM2680
>>965
endとかだよ
0969デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 21:14:55.98ID:Mv7XM2680
>>968
プロパティの引数に()いるの?に対してその答えはおかしい
0970デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 21:23:50.92ID:qadFHjVDx
>>969
ひょっとしてまだメソッド/プロパティの引数指定の丸括弧記法の話をしていたのか?メゾット君
プロパティのアクセサの引数指定は丸括弧必須
戻り値を取得するための命令だから当たり前
0971デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 21:51:43.86ID:lg6qJlYj0
>>966
いや、うん。そこじゃないんだ
普通に考えると「プロパティに引数がいるの?」なんだ
プロパティに引数は普通は不要。プロパティは「セルの内容」「列幅」など、取り出すだけのもの
プロパティてのは大体「設定]的な意味

vbaはかなり古く誕生した言語な割に大変長寿で、かなりおかしなことになっているってのはあるけども

>>958に集約されている
0972デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/01(日) 22:00:59.47ID:qadFHjVDx
>>971
クラス側で保持するプロパティという概念自体には引数という観念が成立しないのはその通り
でもこの人が言ってるのは多分プロパティの受け渡しに使うアクセサの引数のことだと思う
0973デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:13:02.79ID:Mv7XM2680
>>971
設定に引数がなんで必要ないの??
0974デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:16:58.66ID:Mv7XM2680
アクセサ VBA

はい、なんもヒットしません
初心者に解説する場合、専門用語を使うってどうなの?
0976デフォルトの名無しさん (ワッチョイ a901-SL5O)
垢版 |
2019/12/01(日) 22:28:21.62ID:Mv7XM2680
プロパティに引数もてるとか持てないとかはっきりしろよ…
0977デフォルトの名無しさん (ワッチョイ f668-3RYV)
垢版 |
2019/12/01(日) 22:29:04.82ID:lg6qJlYj0
>>972
おう、これは本気で行くしか無いぞ
>>973
そうじゃなくて、逆なんだ。vbaにはわざわざ引数が用意されている

プロパティの場合、引数じゃなく代入で済ませる方が自然なんだ

cells(1,1),value = "これを設定する"
A1に"これを設定する"という文字列が入る
この場合、プロパティに引数は使われていない。プロパティに直接代入している

本来ならこう書くべきだ
cells(1,1),value.setter("これを設定する")

この辺りはずっとsetter/getterを用意しようぜって流れが主流になった
0980デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 23:25:29.33ID:19U1wNi50
>>979
「汗臭」で検索してないか?
0982デフォルトの名無しさん (ワッチョイ b1f1-uW/g)
垢版 |
2019/12/01(日) 23:46:59.48ID:19U1wNi50
>>981
なんだとこのツルッパゲ!
0984デフォルトの名無しさん (アークセー Sx79-CWam)
垢版 |
2019/12/02(月) 06:20:27.87ID:jajTU6Llx
このあたりの話は自分でクラスを作ったことがなければ分からないと思う
ともあれ、質問者の意図は引数付きのプロパティ式で丸括弧を省略できるかどうかという話なんだろうから、出来ないという結論で締めて終わり
要するにRange("A1")をRange "A1" とは書けない
これだとRangeという名前のSubプロジージャに引数"A1"を与えるという全くデタラメな構文になる
レス数が950を超えています。1000を超えると書き込みができなくなります。