Excel VBA 質問スレ Part63
レス数が1000を超えています。これ以上書き込みはできません。
!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 >>951
Letとのバッティングだろう
推測だが、VB6/VBAのコンパイラは、代入演算子と等価演算子がともに'='であることを前提とした仕様になっているんだと思う
プリミティブ型の値の代入はスタックの値のコピーに他ならないので、代入演算子を等価演算子と混同しても論理矛盾が起きない
オブジェクトの場合はそうはいかないので、オブジェクト変数として型宣言した変数へのインスタンス代入の際にはSetの識別子付与を強制するようにしてるんじゃなかろうか
VB.NETではSetが要らなくなってるからコンパイラの仕様だよなこれは 参照カウント型GCの都合だよ
Setで左辺のオブジェクトの参照カウントが+1されて変数に束縛される
左辺がNothingだったら束縛していたオブジェクト参照カウントを-1する
変数がemptyやNothingだったら何もしない
見た目以上に重い代入処理
関数や手続きの戻りまで行ったら全てのローカル変数に対してSet 変数 = Nothing相当の処理をする
だから関数の最後でNothingの代入は不要
ただし >>953
知らなかった、ありがとう
代入値の評価をして変数スコープ内で参照カウンタを管理するためのステートメントなのか
確かにそれだとLetと違って省略不可だな >>951
Setが省略できないのはデフォルトプロパティとの絡み
SetもLetもないと、デフォルトプロパティへの代入なのかインスタンスそのものの代入なのか区別がつかないから
文法解釈の問題で、GCや参照カウンタの問題ではないよ
>>952
VB.Netではデフォルトプロパティという概念を変えて
一部条件以外でのデフォルトプロパティの省略を禁止した
コンパイラは文法を解釈してるわけで、言語仕様の問題
ちなみに=が等価演算子か比較演算子かの解釈に、値型か参照型の区別は関係ない
VB.Netがそうだろ >>955
なるほどそういうことか
ありがとう納得した
ここは勉強になるな >>955
あーそれだ、ありがとう
setが無いと、
foo = cells(1,1)
が
set foo = cells(1,1)
なのか
foo = cells(1,1).value
なのか、
見分けが付かないって事だね >>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のデフォルトプロパティだろとかいう突っ込みは勘弁な >>958
> 混乱する一番の原因は、
> オブジェクトを返すプロパティには、そのオブジェクトの型と同じ名前を使う
> っていう指針があるから
違うよ
オブジェクトなんて曖昧な用語を使うから混乱するの
型(クラス)と実体(インスタンス)をきちんと区別すればいいだけ Select CaseステートメントでLong型変数の判定がおかしいのですがなぜですか?
@では5000未満と判定されているのに、Aではきちんと12500と判定されます
https://i.imgur.com/TmJ2jHa.png
https://pastebin.com/LvSb9cmT 値型はNewしないで参照型はNewするというルールに従うと
別言語でStringは参照型なのに何でNewしなくていいのかと悩んだな
結局参照型でもNewしなくていい場合があるってスルーするのが一番だけど stringは今となっては値として何も考えずに使えるよね
昔は配列だの何だの意外とめんどくさかった。更に文字コードやなんやでそれはもう
https://docs.microsoft.com/ja-jp/dotnet/api/system.string?redirectedfrom=MSDN&view=netframework-4.8#constructors え、プロパティの引数って絶対に()つけないといけないの?
そこら辺の文法が謎だわ
本でも説明されてないし
ネットで検索しまくってもプロパティの引数には()をつけろなんて書いてないし
どこでそんな知識仕入れてきたの? そもそもプロパティに引数ってのがよーわからん
getterなんだろうけど ActiveSheet.Range("A1") = "TEST"
とか
str = ActiveSheet.Range("A1")
とかの()内のことを言っているんだろうか? >>964
RangeクラスのValueプロパティのアクセサは引数いらないよね
アクセス時に引数を要求されるプロパティとそうじゃないプロパティがあるだけ >>968
プロパティの引数に()いるの?に対してその答えはおかしい >>969
ひょっとしてまだメソッド/プロパティの引数指定の丸括弧記法の話をしていたのか?メゾット君
プロパティのアクセサの引数指定は丸括弧必須
戻り値を取得するための命令だから当たり前 >>966
いや、うん。そこじゃないんだ
普通に考えると「プロパティに引数がいるの?」なんだ
プロパティに引数は普通は不要。プロパティは「セルの内容」「列幅」など、取り出すだけのもの
プロパティてのは大体「設定]的な意味
vbaはかなり古く誕生した言語な割に大変長寿で、かなりおかしなことになっているってのはあるけども
>>958に集約されている >>971
クラス側で保持するプロパティという概念自体には引数という観念が成立しないのはその通り
でもこの人が言ってるのは多分プロパティの受け渡しに使うアクセサの引数のことだと思う アクセサ VBA
はい、なんもヒットしません
初心者に解説する場合、専門用語を使うってどうなの? プロパティに引数持てる言語はVB系の言語しかないのでそういうもんだと思うしかないような気がする プロパティに引数もてるとか持てないとかはっきりしろよ… >>972
おう、これは本気で行くしか無いぞ
>>973
そうじゃなくて、逆なんだ。vbaにはわざわざ引数が用意されている
プロパティの場合、引数じゃなく代入で済ませる方が自然なんだ
cells(1,1),value = "これを設定する"
A1に"これを設定する"という文字列が入る
この場合、プロパティに引数は使われていない。プロパティに直接代入している
本来ならこう書くべきだ
cells(1,1),value.setter("これを設定する")
この辺りはずっとsetter/getterを用意しようぜって流れが主流になった Range COMオブジェクト デフォルトプロパティ
でぐぐると良いかも >>980
君は生きている価値もないかな、と感じた
自分の存在価値を下げるような発言は謹んだ方が良いと思うよ このあたりの話は自分でクラスを作ったことがなければ分からないと思う
ともあれ、質問者の意図は引数付きのプロパティ式で丸括弧を省略できるかどうかという話なんだろうから、出来ないという結論で締めて終わり
要するにRange("A1")をRange "A1" とは書けない
これだとRangeという名前のSubプロジージャに引数"A1"を与えるという全くデタラメな構文になる 初心者にとって感覚的に分かりやすいのは戻りを使う場合はカッコを使う。
戻りを使わない場合はカッコを使わない。
Call文だけ例外でカッコを使う。
で良いんじゃね? >>987
end(xlup)
戻り値ってなんだ? >>988
返り値は連続領域の下端のセルを表すRangeオブジェクトだよ
Microsoftの公式のリファレンスくらい読んだら? >>988
間違えた、xlupなら上端のセルだな
とにかく仕様理解のためには公式リファレンスに勝るものはないから返り値くらいはちゃんと調べたらいい >>990
ENDの()のどこが戻り値なのかきいてんだよ…
ガイジかよ >>991
戻り値の意味が分かってなくて草
Expression.End(Destination)っていう構文全体が戻り値を指し示してるんだが Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal
わかりやすくな
プログラム初心者でもわかるように解説しろ
ボーダーには()でラインスタイルには=
どちらもプロパティなはず
なんで?
どれがなにの戻り値なの?ってのを
主語がなかったりテキトーなカタカナでごまかしてるのおおすぎ 北海道でスーパーハゲをしてるグラサンのおっさんこないのー? LineStyleプロパティは引数の指定を要求されないプロパティだから()による引数指定は要らない
かつ、Linestyleプロパティは値の読み取りの他に値の設定も可能なプロパティなので、代入演算子の = でxlLineStyle列挙体の定数を設定することにより、罫線の書式を設定できる
プロパティだから()が必要なんだとか=が必要なんだとかっていう単純な捉え方は理解の妨げになるからやめた方がよい
引数による要素の指定を要求/許容しているのか、値の読み取りだけでなく値の設定も出来るのかといった個々のプロパティの仕様の違いにより、式の書き方が変わるだけ ってかこの一連の問題、すげー難しいよ
初心者を自覚してるならあまり深く考えないほうが良いと思う
得るものは少ない、ぱっと書き方だけ覚えてどんどん次へ進んだほうがいいような WorksheetオブジェクトのCellsプロパティなどは引数なしでも引数ありでも使用できるし、=で値も設定できる
()の要不要とか=を用いた代入の可否なんてプロパティの仕様によるとしか >>993
こう説明したらわかる?
Cellsの戻り値に対して.Borders〜〜って事
Borders(xlDiagonalDown)の.LineStyleに対して = xlInsideHorizontalって事 >>996
引数の要求をされないプロパティ??
linestyleだけではエラーになるのでは?
レンジのラインスタイルです!だけは意味不明でしょ
値の設定?読み取り?
設定 罫線を引く?
読み取り ???
つまりどういうこと?
定数を設定??
bordersの引数も定数では? このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 77日 2時間 45分 30秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。