Excel VBA 質問スレ Part63

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ d3d0-EPXH)2019/09/16(月) 19:34:59.04ID:emfTAhXr0
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part62
https://mevius.5ch.net/test/read.cgi/tech/1561303297/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

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の代入は不要
ただし

0954デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/01(日) 15:36:05.55ID:qadFHjVDx
>>953
知らなかった、ありがとう
代入値の評価をして変数スコープ内で参照カウンタを管理するためのステートメントなのか
確かにそれだとLetと違って省略不可だな

0955デフォルトの名無しさん (ワッチョイ 122f-Ql8R)2019/12/01(日) 15:43:44.55ID:BdsW8ng60
>>951
Setが省略できないのはデフォルトプロパティとの絡み
SetもLetもないと、デフォルトプロパティへの代入なのかインスタンスそのものの代入なのか区別がつかないから
文法解釈の問題で、GCや参照カウンタの問題ではないよ

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

ちなみに=が等価演算子か比較演算子かの解釈に、値型か参照型の区別は関係ない
VB.Netがそうだろ

0956デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/01(日) 15:47:47.95ID:qadFHjVDx
>>955
なるほどそういうことか
ありがとう納得した
ここは勉強になるな

0957デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/01(日) 15:49:14.68ID:lg6qJlYj0
>>955
あーそれだ、ありがとう
setが無いと、
foo = cells(1,1)


set foo = cells(1,1)
なのか
foo = cells(1,1).value
なのか、
見分けが付かないって事だね

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
> 混乱する一番の原因は、
> オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
> っていう指針があるから
違うよ
オブジェクトなんて曖昧な用語を使うから混乱するの
型(クラス)と実体(インスタンス)をきちんと区別すればいいだけ

0960デフォルトの名無しさん (ワッチョイ 3275-R3ru)2019/12/01(日) 19:22:42.00ID:y7nKgQdu0
Select CaseステートメントでLong型変数の判定がおかしいのですがなぜですか?
@では5000未満と判定されているのに、Aではきちんと12500と判定されます

https://i.imgur.com/TmJ2jHa.png
https://pastebin.com/LvSb9cmT

0961デフォルトの名無しさん (ワッチョイ 3275-R3ru)2019/12/01(日) 19:27:45.01ID:y7nKgQdu0
自決しました
String型で値渡ししてました…

0962デフォルトの名無しさん (ワッチョイ 69f0-a1aH)2019/12/01(日) 19:43:10.04ID:oxdJbHeB0
値型はNewしないで参照型はNewするというルールに従うと
別言語でStringは参照型なのに何でNewしなくていいのかと悩んだな
結局参照型でもNewしなくていい場合があるってスルーするのが一番だけど

0963デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/01(日) 19:55:09.73ID:lg6qJlYj0
stringは今となっては値として何も考えずに使えるよね
昔は配列だの何だの意外とめんどくさかった。更に文字コードやなんやでそれはもう
https://docs.microsoft.com/ja-jp/dotnet/api/system.string?redirectedfrom=MSDN&;view=netframework-4.8#constructors

0964デフォルトの名無しさん (ワッチョイ a9b3-nvwQ)2019/12/01(日) 20:17:07.69ID:Ta8YhOMq0
え、プロパティの引数って絶対に()つけないといけないの?
そこら辺の文法が謎だわ
本でも説明されてないし
ネットで検索しまくってもプロパティの引数には()をつけろなんて書いてないし
どこでそんな知識仕入れてきたの?

0965デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/01(日) 20:27:51.07ID:lg6qJlYj0
そもそもプロパティに引数ってのがよーわからん
getterなんだろうけど

0966デフォルトの名無しさん (ワッチョイ a901-SL5O)2019/12/01(日) 20:35:21.31ID:Mv7XM2680
>>965
endとかだよ

0967デフォルトの名無しさん (ワッチョイ b1d0-o7DB)2019/12/01(日) 20:44:53.15ID:wgaB7PE60
ActiveSheet.Range("A1") = "TEST"
とか
str = ActiveSheet.Range("A1")
とかの()内のことを言っているんだろうか?

0968デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/01(日) 21:06:45.20ID:qadFHjVDx
>>964
RangeクラスのValueプロパティのアクセサは引数いらないよね
アクセス時に引数を要求されるプロパティとそうじゃないプロパティがあるだけ

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

はい、なんもヒットしません
初心者に解説する場合、専門用語を使うってどうなの?

0975デフォルトの名無しさん (ワッチョイ 9201-MhVQ)2019/12/01(日) 22:25:27.99ID:Enyr5Fgf0
プロパティに引数持てる言語はVB系の言語しかないのでそういうもんだと思うしかないような気がする

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を用意しようぜって流れが主流になった

0978デフォルトの名無しさん (ワッチョイ 9279-luhV)2019/12/01(日) 22:32:32.45ID:pJZuHPp00
Range COMオブジェクト デフォルトプロパティ
でぐぐると良いかも

0979デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/01(日) 22:52:46.61ID:qadFHjVDx
>>974
VBA アクセサで普通にヒットするぞ

0980デフォルトの名無しさん (ワッチョイ b1f1-uW/g)2019/12/01(日) 23:25:29.33ID:19U1wNi50
>>979
「汗臭」で検索してないか?

0981デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/01(日) 23:43:26.99ID:lg6qJlYj0
>>980
君は生きている価値もないかな、と感じた
自分の存在価値を下げるような発言は謹んだ方が良いと思うよ

0982デフォルトの名無しさん (ワッチョイ b1f1-uW/g)2019/12/01(日) 23:46:59.48ID:19U1wNi50
>>981
なんだとこのツルッパゲ!

0983デフォルトの名無しさん (ワッチョイ 8101-MhVQ)2019/12/01(日) 23:49:23.02ID:J+qwPBxd0
グラサンのハゲはここにこないのー?

0984デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 06:20:27.87ID:jajTU6Llx
このあたりの話は自分でクラスを作ったことがなければ分からないと思う
ともあれ、質問者の意図は引数付きのプロパティ式で丸括弧を省略できるかどうかという話なんだろうから、出来ないという結論で締めて終わり
要するにRange("A1")をRange "A1" とは書けない
これだとRangeという名前のSubプロジージャに引数"A1"を与えるという全くデタラメな構文になる

0985デフォルトの名無しさん (アウアウウー Sacd-W09L)2019/12/02(月) 10:25:16.60ID:9b18ESq8a
hage("A1")

0986デフォルトの名無しさん (ワッチョイ b1f1-uW/g)2019/12/02(月) 12:07:45.41ID:b+6W/5Or0
Tsuruppage("A1")

0987デフォルトの名無しさん (スッップ Sdb2-iiDQ)2019/12/02(月) 12:58:25.24ID:bEJSdplkd
初心者にとって感覚的に分かりやすいのは戻りを使う場合はカッコを使う。
戻りを使わない場合はカッコを使わない。
Call文だけ例外でカッコを使う。

で良いんじゃね?

0988デフォルトの名無しさん (ワッチョイ a901-SL5O)2019/12/02(月) 20:27:37.88ID:HFZWrDUD0
>>987
end(xlup)
戻り値ってなんだ?

0989デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 20:40:04.97ID:4BXx3P/Mx
>>988
返り値は連続領域の下端のセルを表すRangeオブジェクトだよ
Microsoftの公式のリファレンスくらい読んだら?

0990デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 20:41:20.57ID:4BXx3P/Mx
>>988
間違えた、xlupなら上端のセルだな
とにかく仕様理解のためには公式リファレンスに勝るものはないから返り値くらいはちゃんと調べたらいい

0991デフォルトの名無しさん (ワッチョイ a901-SL5O)2019/12/02(月) 21:03:22.49ID:HFZWrDUD0
>>990
ENDの()のどこが戻り値なのかきいてんだよ…
ガイジかよ

0992デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 21:21:14.86ID:4BXx3P/Mx
>>991
戻り値の意味が分かってなくて草
Expression.End(Destination)っていう構文全体が戻り値を指し示してるんだが

0993デフォルトの名無しさん (ワッチョイ a901-SL5O)2019/12/02(月) 21:52:36.19ID:HFZWrDUD0
Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal

わかりやすくな
プログラム初心者でもわかるように解説しろ
ボーダーには()でラインスタイルには=
どちらもプロパティなはず
なんで?
どれがなにの戻り値なの?ってのを
主語がなかったりテキトーなカタカナでごまかしてるのおおすぎ

0994デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/02(月) 22:05:27.19ID:gEmwbuWH0
日本語崩壊してて草

0995デフォルトの名無しさん (ワッチョイ 8101-MhVQ)2019/12/02(月) 22:05:27.56ID:h5Kj2a0d0
北海道でスーパーハゲをしてるグラサンのおっさんこないのー?

0996デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 22:13:40.36ID:4BXx3P/Mx
LineStyleプロパティは引数の指定を要求されないプロパティだから()による引数指定は要らない

かつ、Linestyleプロパティは値の読み取りの他に値の設定も可能なプロパティなので、代入演算子の = でxlLineStyle列挙体の定数を設定することにより、罫線の書式を設定できる

プロパティだから()が必要なんだとか=が必要なんだとかっていう単純な捉え方は理解の妨げになるからやめた方がよい

引数による要素の指定を要求/許容しているのか、値の読み取りだけでなく値の設定も出来るのかといった個々のプロパティの仕様の違いにより、式の書き方が変わるだけ

0997デフォルトの名無しさん (ワッチョイ f668-3RYV)2019/12/02(月) 22:16:41.89ID:gEmwbuWH0
ってかこの一連の問題、すげー難しいよ
初心者を自覚してるならあまり深く考えないほうが良いと思う
得るものは少ない、ぱっと書き方だけ覚えてどんどん次へ進んだほうがいいような

0998デフォルトの名無しさん (アークセー Sx79-CWam)2019/12/02(月) 22:17:27.68ID:4BXx3P/Mx
WorksheetオブジェクトのCellsプロパティなどは引数なしでも引数ありでも使用できるし、=で値も設定できる
()の要不要とか=を用いた代入の可否なんてプロパティの仕様によるとしか

0999デフォルトの名無しさん (ワッチョイ f602-FWG3)2019/12/02(月) 22:20:20.67ID:ONNaKUnx0
>>993
こう説明したらわかる?

Cellsの戻り値に対して.Borders〜〜って事
Borders(xlDiagonalDown)の.LineStyleに対して = xlInsideHorizontalって事

1000デフォルトの名無しさん (ワッチョイ a901-SL5O)2019/12/02(月) 22:20:29.46ID:HFZWrDUD0
>>996
引数の要求をされないプロパティ??
linestyleだけではエラーになるのでは?
レンジのラインスタイルです!だけは意味不明でしょ

値の設定?読み取り?
設定 罫線を引く?
読み取り ???
つまりどういうこと?

定数を設定??
bordersの引数も定数では?

10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 77日 2時間 45分 30秒

10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

レス数が1000を超えています。これ以上書き込みはできません。