Excel VBA 質問スレ Part73

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 4668-xJJl)
垢版 |
2021/09/13(月) 07:29:59.47ID:GNx0xRRz0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

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

※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/09/26(日) 00:17:38.53ID:BPwZjS350
とあるフォルダへのショートカットを作成する方法を調べたところ、
コーディング前に、
>参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
>これでWshShellクラスとWshShortcutクラスを利用できるようになります。
という記述がありました。

それで作れそうですが、
作った.xlsmファイルを他人に渡した場合、
その相手が上記の参照設定をしていない環境だったとしても、ショートカットの作成は行えますか?
2021/09/26(日) 00:44:49.64ID:vU9Y5LAHp
>>165
ご回答頂きありがとうございます。

こういう基本的な説明くらい最初から見とけって話でしたね。

しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。
2021/09/26(日) 01:37:23.16ID:O844yIU50
>>167
オートフィルターON/OFFと同時にシートの保護/解除も書いてしまえばいいんでないの?
2021/09/26(日) 01:39:32.52ID:BPwZjS350
>>166
自己解決しました。

参照設定を変更しなくてもショートカットの作成は可能でした。
そちらの方法にします。
https://excel-ubara.com/excelvba4/EXCEL293.html
2021/09/26(日) 01:46:25.94ID:BPwZjS350
ちなみに、
@参照設定で「Windows Script Host Object Model」をONにする。
AWshShellクラスとWshShortcutクラスを利用してコーディングする。
Bプログラムを実行する。
Cショートカットの作成に成功する。
D参照設定で「Windows Script Host Object Model」をOFFにする。
Eプログラムを実行する。
Fショートカットの作成に失敗する。(Aの中の定義について「ユーザ定義型は定義されていません」のエラー)
となったので、
>>166については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。
2021/09/26(日) 01:51:41.55ID:vU9Y5LAHp
>>168
確かに、仰る通りですね。
保護は事前に設定しておくものと勝手に思い込んでいました。

一番良い形で解決できそうです。ありがとうございます。
2021/09/26(日) 15:56:59.18ID:ynzNBMLj0
>>170
参照設定した内容はそのエクセルファイルに保存されてる
エクセルファイルを渡した先でその参照設定がちゃんと動くなら動く
2021/09/26(日) 18:28:19.91ID:6z2Q/VJPM
二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます?

連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも?
2021/09/26(日) 18:29:58.19ID:Fsa0c3oL0
第三限定なの?
2021/09/26(日) 19:28:17.19ID:HYuUGx6O0
できるかどうかではなく、そういう処理を作りたいんじゃないの?
2021/09/26(日) 21:42:42.58ID:hcQxkCQHM
配列とレコードとシートの区別ない人だね
2021/09/26(日) 23:35:14.87ID:ISHRJ32V0
そういう方法で重複チェックをしたことはあるけど
それがまともかと聞かれるとわからんなぁ
2021/09/27(月) 17:52:26.41ID:wG/2iXK70
配列は要素数が増減するものには向いてない
が、まあいろいろ頑張ればできる

連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ
179デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 21:07:52.71ID:9JOCRyj50
>配列は要素数が増減するものには向いてない
「vbaの」配列な
他の言語にはpushとか色々便利なものがあるんやで
2021/09/27(月) 21:09:45.06ID:1fIlBTl00
Excelにはセルっていう使いやすい2次元配列があるからな
速度はご愛嬌
181デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 23:17:35.36ID:9JOCRyj50
シート入れれば三次元やぞ
2021/09/28(火) 06:06:35.41ID:NhFpYAOsM
>>179
> 他の言語にはpushとか色々便利なものがあるんやで
スクリプト言語とかだろそれ
言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ
そもそもVBAはその多くない言語に含まれるし
2021/09/28(火) 11:35:58.86ID:mkxQja700
無いものねだりしてもしょうがない
そもそも他言語やっててVBAやった場合
ない機能をどうやって実装するか考えるのが
醍醐味なんだから
184デフォルトの名無しさん (ワッチョイ 92ad-mV7G)
垢版 |
2021/09/28(火) 12:14:47.38ID:fFhZgLlN0
>>182
実はVBAは「配列」のサイズを変えれる数少ない言語
まあ多分全コピー発生してるんだろうけど
コレクション系が弱いからそれぐらいできんとかなりツラい
今なら.NETの使うとか出来るけど
2021/09/28(火) 13:45:05.92ID:T/P4fEdFM
>>184
> コレクション系が弱いからそれぐらいできんとかなりツラい
どこが弱いの?
2021/09/28(火) 15:11:07.44ID:8+n9QyO8M
今の時代、メモリなんてたくさん確保しておけばよくね
187デフォルトの名無しさん (ワッチョイ 6f8e-emG0)
垢版 |
2021/09/28(火) 15:43:04.78ID:ZLV/p08A0
「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では?
2021/09/28(火) 15:46:57.39ID:9IVurO/LM
お、おう
189デフォルトの名無しさん (ワッチョイ 4be5-XWMK)
垢版 |
2021/09/28(火) 16:43:48.67ID:yyyanN8B0
64KBまでだよ
2021/09/28(火) 16:48:32.26ID:vws8rDV40
VBA(Excel)にそんなメモリ使わせたらヒヤヒヤしちゃう
2021/09/28(火) 17:35:37.46ID:Fgmzo9M90
long配列の下位16ビットにデータ格納されている
long[0],[1]の下位16ビットを結合するとsingleの値となる
(要はsingleが16ビット分割されてlong型に格納されている)
こんなデータが大量に格納されるんですが、上手く結合して型変換する方法がわかりません。。
val("&H" & hex(long(1)) & hex(long(0)))
で32ビット結合はできましたが、その後の暗黙的な変換なしでsingleに変更するにはどうするのが良いでしょうか?
2021/09/28(火) 18:37:14.39ID:nfdxFkKa0
リアルタイムにやる必要が無いならバイナリでファイルに書いて
Singleで読むとか出来そうな気がする。
同じ考え方でADODB.stremも使えそう。
2021/09/28(火) 20:20:03.83ID:chK2kmIxd
>>191
禁じ手だけどユーザー定義型とLSetで変数の中身を型変換せずに直接コピーできる
LongをSingleにコピーする例

Type TypeLong
  varLong As Long
End Type

Type TypeSingle
  varSingle As Single
End Type

Sub Long2Single()
  Dim myLong As TypeLong
  Dim mySingle As TypeSingle
  LSet mySingle = myLong
End Sub
194デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/28(火) 21:06:13.76ID:mkxQja700
>>191
ん?
今一つよく分からんけど、CSng使って明示的に変換すればいいんじゃないの?

Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single

originalValue(0) = 1
originalValue(1) = 3

convertSingle = CSng(CDbl(originalValue(0) And 65535)) * 65536 + (originalValue(1) And 65535)

Debug.Print convertSingle

End Sub

こんな感じに。
オーバーフローして表示しきれなくなった分は知らんけど。
195デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/28(火) 21:56:37.27ID:mkxQja700
おっと、すまんこ
括弧の位置間違えてた

Option Explicit

Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single

originalValue(0) = 7
originalValue(1) = 15

convertSingle = CSng(CDbl(originalValue(0) And 65535) * 65536 + (originalValue(1) And 65535))

Debug.Print convertSingle

End Sub

こうかな。
因みにビット扱っているなら説明すると失礼に当たるかもだけど、
65535は16進で&HFFFF、65536は16進で&H10000ね。
ANDは論理演算子ではなくてビット演算子。
2021/09/29(水) 02:45:23.84ID:DNRsGaHg0
>>191
SingleもLongも32ビット長なんだが、Singleの内部形式が分割されて二つのLongに16ビットずつ格納されているのか?
なんでそんなことになってるんだよ。Integer二つでいいじゃないか

考え方としては>>193さんの言う通りLSetでできる
二つのLongから有効な32ビット抜き出すのが手間だけど

Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど
2021/09/29(水) 02:50:45.14ID:DNRsGaHg0
とりあえず作ってみた
エンディアンの呪いがかかってても知らんw
Type TypeQByte
varByte1 As Byte
varByte2 As Byte
varByte3 As Byte
varByte4 As Byte
End Type
Type TypeLong
varLong As Long
End Type
Type TypeSingle
varSingle As Single
End Type
Function WLong2Single(ByVal long1 As Long, ByVal long2 As Long) As Single
Dim myLong1 As TypeLong
Dim myLong2 As TypeLong
Dim myQByte As TypeQByte
Dim tmpQByte As TypeQByte
Dim mySingle As TypeSingle
myLong1.varLong = long1
myLong2.varLong = long2
LSet tmpQByte = myLong1
myQByte.varByte1 = tmpQByte.varByte3
myQByte.varByte2 = tmpQByte.varByte4
LSet tmpQByte = myLong2
myQByte.varByte3 = tmpQByte.varByte3
myQByte.varByte4 = tmpQByte.varByte4
LSet mySingle = myQByte
WLong2Single = mySingle.varSingle
End Function
2021/09/29(水) 03:32:54.18ID:hT//j47fd
VBAには共用体もポインタもないから、
LSetでメモリの内容をコピー
バイナリファイル経由
IEEEの内部フォーマットに合わせてゴリゴリ計算
ぐらいしか思い付かん

この中ではLsetが一番シンプルだし高速
上位、下位の順番が分からんから適当に書くけど、基本的にはこんな感じ
MyLong = Long0 * &h10000 + Long1
Lset MySingle = MyLong

C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない
2021/09/29(水) 04:17:58.49ID:DNRsGaHg0
>>198
それ符号ビットの問題があるぞ
VBAには論理シフトとかないからな

バイナリファイルにするにしても、Longの不要な16ビット捨てる方法考えんといかん
2021/09/29(水) 05:23:25.92ID:HULqg2bxd
符号ビット対策
64bit限定ならLongLong型を経由すればもっと簡単になるのか?どう書けばいいのかわからんけど

Dim MSB As Long
MSB = (Long0 And &H8000) And &H80000000
MyLong = MSB Or ((Long0 And &H7FFF) * &H10000 + Long1)
2021/09/29(水) 05:43:02.15ID:ia9ebpqvd
訂正
MSB = ((Long0 And &H8000) <> 0) And &H80000000
2021/09/29(水) 08:25:13.60ID:slA14A+y0
>>201
いや、Longの中に入っている時点でマイナスなら* -1してやればいいだけだけど、だったらもっと範囲の広い型で後ろ2バイト以外クリアする方が分岐もなくスッキリするだろう
2021/09/29(水) 08:41:09.05ID:+gGxbszWd
>>202
元データの上位2バイトが00で埋まってた場合、論理シフトで符号が変わる場合があるでしょ
VBAには論理シフトがないから、何か別の方法で再現する必要があると思うんだけど
具体的に、動くコード書いてみて
2021/09/29(水) 09:29:57.66ID:ilMiUA0BM
Byte型からLSetが単純で一番速いと思う

定義(追加部分のみ)

Type tyByte
  Byte0 As Byte
  Byte1 As Byte
  Byte2 As Byte
  Byte3 As Byte
End Type

代入処理はこんな感じ
データの格納順序は知らんから適当

myByte.Byte0 = long0 And &HFF&
myByte.Byte1 = (long0 And &HFF00&) \ &H100&
myByte.Byte2 = long1 And &HFF&
myByte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = myByte
2021/09/29(水) 09:40:16.79ID:f5tfMzLod
>>204
それなら最初にLongをByteにLsetすれば、マスクやシフトしなくても途中のバイトがそのまま取り出せる
コードの行数は増えるけど演算量はもっと減らせる
2021/09/29(水) 12:56:20.18ID:slA14A+y0
>>203
ちょっと何を言ってるか分かりませんね。
まずシフトの話はどこから出てきたの?
Long型ならマイナスであれば常にトップビットは
立っているよね?
だからプラスに変換するってことだけど?
トップビットが立っていなければプラスなんで変換する必要はない。
もちろん、最初の設定値のLong型の下位2バイトでマイナスを表現するならそれぞれ*-1してやらなきゃいけないけど>>191を見た限りではそのような扱いでもないしね。

途中でマイナスをもつような型の変数に入れるなら
その後始末をしないといけないというだけ。
そもそもトップビットがなぜ符号なのかというところから理解しないとね。
トップビットを単純に0にすればプラスの値に置き換わるというものでもないし。

例えば、1バイトの変数で言えば、-1はFFhだよね。
これのトップビットを倒すと、7Fhになる。
つまり、1にはならずに127になるよね。
2021/09/29(水) 19:09:56.88ID:UXZ9zF/70
VBAのウインドウの固定で行を選択するとA列に移動してしまうのはどうにかならない?
手動だとそのまま列でウインドウの固定になるから違いがよくわからん
2021/09/29(水) 21:29:48.02ID:7Q67NENAd
>>206
元の質問と、そこに付いてるレスをよく読んで
2021/09/29(水) 22:06:13.36ID:bAaW5g7mM
>>206
ゴタクはいいから
> 具体的に、動くコード書いてみて
って言われてるぞ
2021/09/29(水) 22:10:21.46ID:slA14A+y0
>>209
具体的なコードは昨日既に>>195で書いているな。
2021/09/29(水) 22:32:44.25ID:helTTC1Td
図解するとこういうことじゃないの?俺の理解が間違ってる?
https://i.imgur.com/z48adB1.jpg
212デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/29(水) 22:47:00.69ID:slA14A+y0
>>211
うん。それであってるよ。
ただ、.Netみたいにアンサインな型の変数が無いから
それをどうしようか、という話。
Longで普通に計算すると上位2バイトに65535(&HFFFF)辺りが入れば
例えば&HFFFF00000が入ったとして、4294901760が欲しいのに
普通にLong型だと-65536が取れちゃったりするよね。
2021/09/29(水) 23:33:48.06ID:slA14A+y0
あ、でも*-1する方法じゃダメか。
これはあくまでマイナスをプラスにする方法であって、トップビットが立っていてもプラスとみなす方法じゃないからね。
そう考えるとやっぱりもう少し幅の広い変数持っといて計算する方法が楽かな。

だからみんなByte型とか使ってたのかー。
なんか勉強になったわ。
2021/09/29(水) 23:39:44.93ID:+/PybBD+d
一つの例として、
Long[0]=&h00000000
Long[1]=&h00003E20
の時、得られるSingle値は0.15625になる
正しく計算できてるかどうか試してみればいい

>>191
Hexの戻り値は4桁とは限らないから、それでは正しく結合できないよ
2021/09/29(水) 23:43:02.21ID:+/PybBD+d
あまんり綺麗なコードじゃないけど、一応動くと思う
Option Explicit
Type tySingle
  varSingle As Single
End Type
Type ty4Byte
  Byte0 As Byte
  Byte1 As Byte
  Byte2 As Byte
  Byte3 As Byte
End Type

Sub Long2Single()
  Dim mySingle As tySingle
  Dim my4byte As ty4Byte
  Dim long0 As Long, long1 As Long
  long0 = &H0&
  long1 = &H3E20&
  my4byte.Byte0 = long0 And &HFF&
  my4byte.Byte1 = (long0 And &HFF00&) \ &H100&
  my4byte.Byte2 = long1 And &HFF&
  my4byte.Byte3 = (long1 And &HFF00&) \ &H100&
  LSet mySingle = my4byte
  Debug.Print mySingle.varSingle
End Sub
2021/09/30(木) 00:24:00.39ID:PZiEyg+B0
Option Explicit

Private Type TPLong
long0 As Long: long1 As Long
End Type
Private Type TPByte
byte0 As Byte: byte1 As Byte: byte2 As Byte: byte3 As Byte
byte4 As Byte: byte5 As Byte: byte6 As Byte: byte7 As Byte
End Type
Private Type TPSingle
single0 As Single: single1 As Single
End Type
Private Sub test()
Dim L As TPLong
Dim B As TPByte
Dim S As TPSingle

L.long0 = &H0
L.long1 = &H3E20&

LSet B = L
B.byte2 = B.byte4
B.byte3 = B.byte5

LSet S = B

Debug.Print S.single0

End Sub

動いた。改行多すぎって言われたので詰めて書いてる。
2021/09/30(木) 00:49:27.70ID:pCEIeulu0
>>214
それ、Longの上位下位どっち側にデータ入れるかによって
00 00 3E 20 で、数値表現としては &h3E200000 かもしれん
>>197はその前提で作ってるし>>211の図もそうだな

と思ったけど、HEX表現でそのまま連結してOKとか思ってるのか
3E 20 00 00 って格納してるのが正解なのか
エンディアンの呪いやっかいだなぁ
2021/09/30(木) 05:21:02.09ID:0qBy1lQqM
>>210
それツッコミないのはあまりにもレベル低いからだぞ…
2021/09/30(木) 06:14:58.44ID:gM2Bcn3cd
>>217
質問者が単純にHex関数の連結だけでOKだったと書いてるから、それぞれ下位16bitを使ってて、Long[0]が下位、Long[1]が上位側と読み取れる
まあ逆だったとしても簡単に修正できるし
220デフォルトの名無しさん (アウアウキー Saef-nXzz)
垢版 |
2021/09/30(木) 08:01:56.59ID:R3l1DBbza
質問する前に良く考えれば自力でできたんじゃね
2021/09/30(木) 09:52:07.40ID:Vb95uiyM0
VBAで標準モジュールを削除するコードを書いてるんだけど、消えない場合がなくね?
removeしてもそれがすぐに反映されない。
commitするようなコマンドてある?
222デフォルトの名無しさん (ラクッペペ MMde-XWMK)
垢版 |
2021/09/30(木) 10:02:50.98ID:R1d8oRoFM
ないならいいじゃん
2021/09/30(木) 10:06:49.68ID:XH3u7BFNM
「場合がなくね?」を「場合がない」と読むのは流石に揚げ足取りが過ぎる
2021/09/30(木) 10:16:54.23ID:eFhgF698M
なくね?
→なくない?
 ないよね?

言語仕様による違いかな
2021/09/30(木) 10:20:26.49ID:+bzcSAlDd
文脈から言い間違いだと気づけないのはアスペだそうですよ
2021/09/30(木) 10:58:49.96ID:SEX1vFKW0
> commitするようなコマンドてある?
 →commitが欲しい
  →なくね?は間違い

脳仕様による違いかな
2021/09/30(木) 12:35:11.89ID:Vb95uiyM0
調べるとこういうことが起こってるみたいだな。
https://try2explore.com/questions/jp/11366816

VBComponents.Remove呼び出しは、VBAの実行が停止した場合にのみ実際に有効になる場合があります。
つまり、すべてのステートメントが終了するまで、またはコードがブレークポイントに達してデバッグを停止するまで、
削除操作は有効になりません。
これは、新しいモジュールをインポートするか、既存のモジュールのコードを新しいモジュールに置き換えるための次のコードが原因で問題になります。
2021/09/30(木) 13:00:34.16ID:aMauK9B30
もう起こったぞ
2021/09/30(木) 19:03:25.50ID:gc4CAj+A0
クリリンのことかー
230デフォルトの名無しさん (ワッチョイ 2701-CiRx)
垢版 |
2021/09/30(木) 19:31:20.50ID:4/dpkDC70
>>220
多分ビット演算を知らないんだと思う
いずれにしてもバイナリごにょごにょはVBAには適さないとレス見てて改めて思った
2021/09/30(木) 20:06:00.47ID:aMauK9B30
バイナリならByte型でやればいいのにね
2021/09/30(木) 22:38:31.79ID:tyeheD170
for i=0 to 10
 if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑こんな感じのfor文を書いたら普通に動いていたんだけど、

for i=0 to 10
 debug.print i, AAA(i)
 if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑for文の中にdebug.printを入れたら、iが10になっても止まらず、
イミディエイトウィンドウ上に、「i, AAA(i)」の部分がずっとループして止まらなくなった。

こんなことってありえますか?
233デフォルトの名無しさん (ワッチョイ de8c-ysz4)
垢版 |
2021/09/30(木) 23:00:52.63ID:sFWbYEj80
AAA(i) って中身はなんだ
234デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/30(木) 23:03:17.67ID:50MfSZL40
>232
i=i-1

i=3
みたいにiが永久に10を超えない動作が入るとそうなる
2021/09/30(木) 23:04:37.72ID:Vp0fi7DV0
普通に動いていると思っていただけで元々普通に動いてなかったとかはある
こんな感じのって言ってるから、そのソースそのまま受け取るわけには
いかんのだろうなって思った
2021/09/30(木) 23:16:32.92ID:VHGvetdVa
初心者の頃は手動でセル入力してた方が早く終わってしまうのが、もどかしくもあるけど
それでもvbaは覚えるべきだと思っていろいろ頑張ってます
237デフォルトの名無しさん (ワッチョイ de8c-ysz4)
垢版 |
2021/09/30(木) 23:22:00.84ID:sFWbYEj80
>>232 >>234
Function AAA(ByRef i As Variant) As Boolean
i = 3
AAA=True
End Function

こんな感じのじゃない?
2021/10/01(金) 00:46:48.32ID:85aYXoDy0
AAAはリストボックスです。
わかりにくかったので、listAとします。
中身はTRUEかFALSEです。

listA.list(0)がTRUEなら、A1セルにOKを入力
listA.list(1)がFALSEなら何もしない。
listA.list(2)がTRUEなら、A3セルにOKを入力

という処理でした。
debug.printを入れる前に動かした時は、画面が固まることもなく正常に終了しました。
debug.printを入れた後に動かしたらループが止まらなくなりました。

debug.printで出力されたiは、0→1→…→9→10→0→1→…というループではなくて、
0→1→…→9→10→6→7→8→9→10→6→…→10→6→…というループでした。

「debug.print i」がiの値に影響を与える、ということはないですもんね。
他の部分を明日あらためて確認してみます。
ありがとうございました。
2021/10/01(金) 17:55:16.70ID:fQjrPzOfa
クラスを使うメリットってなに?
2021/10/01(金) 19:26:10.62ID:aPfKzK/z0
見た目が美しい
2021/10/01(金) 19:29:13.73ID:AYkrwA2S0
自己満足
242デフォルトの名無しさん (ワッチョイ 6f68-UmxQ)
垢版 |
2021/10/01(金) 19:45:19.68ID:3/37uweO0
>>239
メソッドとプロパティが一箇所に集まって可視化しやすくなる
でもvbaのクラスは貧弱過ぎるので、モジュールで分けるのと大差ないという
2021/10/01(金) 19:47:27.08ID:4jCtmjal0
>>239
色々あるが、VBAのクラス機能はゴミなのでマジで自己満が多いと思う
解説サイトで玄人の技・隠し機能みたいなノリで紹介されてるので、使えるとプロっぽく見える。

@イベントやデフォルトメンバーみたいなオブジェクトモジュール専用の機能が使える
イベントをまとめたいとかで、仕方なしに、これ目的で使ってる人が多いと思う

A変数に値を入れて、その変数を色んな関数の引数にするっていう事が多々あるけど、
そういう「変数と関数」が常にペアになっているなら纏めた方が分かりやすい

B標準モジュールではモジュールレベルで宣言した変数は実行中保存される。
なので、ある関数でモジュールレベルの変数に値を保存して、別の関数で再利用みたいな使い方が出来る。
でも標準モジュールだと当然その変数に保存できる値は一つなので使い勝手が悪い。
クラスモジュールならインスタンスごとに別の値を保存できる
2021/10/01(金) 19:51:30.36ID:4jCtmjal0
この手の話題には「お前らは使いこなしてないからメリットを把握できてないが、俺は使いこなせてる」おじさんが来る
2021/10/01(金) 19:59:58.89ID:jrcl2rEY0
処理高速化するクラスくらいは単純だし使いまわせるし使ってもいいんじゃない
2021/10/01(金) 20:12:23.33ID:HK8CLsAI0
ただ単にすっきりして可読性がよい
クラスにしてると他人のコード化したときに何をしてるかもう一度把握するのが容易
自分でメソッドやプロパティを作るとファイルシステムオブジェクトやコレクションを扱い易くなる
2021/10/01(金) 20:33:12.85ID:4jCtmjal0
JSとかと違ってモジュール内に構文で記述できない(単体のモジュールファイルとしてしか書けない)から、
クラスモジュールを書くこと自体が億劫に感じて余り印象よくないわ
プロジェクト内だとどこからでも呼び出せるから、どこでどう使われてるのかサッパリだし

イベント機能とか状態保存を有効に使いたい、コレクションを自作したい、
みたいな特別な理由がない限り使わない方がいいんじゃないかなぁと思ってる
2021/10/01(金) 20:46:27.80ID:g1N/sLwpM
継承までは望まないとしてもせめてInitializeに引数を持てるようにして欲しかった
2021/10/01(金) 20:53:23.76ID:4jCtmjal0
>>248
Initializeはコンストラクタじゃなくてイベントだから、
仮に引数があってもオブジェクトモジュール内じゃないと使えない上に、
インスタンスごとにイベントハンドラ用のモジュールレベル変数が必要になって面倒だと思う
2021/10/01(金) 21:49:30.27ID:j+Pc2S4XM
イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w
2021/10/01(金) 22:01:08.86ID:4jCtmjal0
>>250
どう読んだらそういうレスになるの?
読解力のないバカはこれだから困る
2021/10/01(金) 22:07:37.29ID:CXdVtwXkM
>>251
はいはい、説明できないバカ乙
そもそもコンストラクタにすればいいだけの話だし
2021/10/01(金) 22:11:26.60ID:CmFZe7Ct0
質問者の環境や能力を無視すんなよ
2021/10/01(金) 22:24:35.99ID:4jCtmjal0
>>252
何をどう解釈したのか言ってくれれば対応できるけど、最早返答が意味不明過ぎるんだわ
何に対して「イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w」と疑問が沸いたのか説明して?
2021/10/01(金) 22:34:31.13ID:4jCtmjal0
>>252
あと、VBAのクラスに「引数が付いたコンストラクタが欲しいな」っていう希望から
「Initializeに引数を持てるようにして欲しかった」っていう要望が出たのは明白だろう

で、イベントに引数を渡すのは面倒だよねって話をしたら「コンストラクタにすればいい」ってのもよくわからん。
だったらイベント関係なしに、初めから使いやすいコンストラクタ相当の言語機能が定義されてた方がいいだろう
2021/10/01(金) 22:55:44.73ID:f1R1MoFX0
一般のObject指向言語で言うところの継承が使えないとか色々あるから普通にデザインパターンを考慮して作ろうとするとそこそこ制限受けるよね。

例えば継承が使えないからテンプレートメソッドパターンが使えないとか、

VB.Netで言うSharedが使えないからキチンとシングルトンパターン使おうとすると結構厄介だったりとか。

インターフェースが使えるから継承の代わりにストラテジーパターンでも使って組もうとか考えても限界あるし。

あ?コンストラクタに引数?
そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。

まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
他のObject指向言語やってる人って結構インターフェースの概念を疎かにしたりするしね。
2021/10/02(土) 02:59:35.03ID:xagjL2JO0
イベントに引数渡す(というか受け取る)のは別に面倒でもなんでないから
コンストラクタの引数をInitializeイベントに渡せたらまあそれもいいんだが
VBAだとInitializeイベントがオーバーロードできないからなぁ

まあもともとのVBがオブジェクト指向でもなんでもなかったとこからスタートしてるからな

俺はVBAのクラスは自作イベント使いたいときに使うものと思ってる
2021/10/02(土) 06:05:15.61ID:g1EUYVpxM
>>254-255
イベントだから何?って話
VBAでも引数を持つイベントはあるし、できない理由を必死に探してるだけにしか見えない
そもそもイベントとコンストラクタなんてある意味呼び方の問題だし
2021/10/02(土) 06:08:02.24ID:g1EUYVpxM
>>256
> あ?コンストラクタに引数?
> そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。
> まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
そういうのは頭使うとは言わない
単に面倒(かつバグの元)なだけ
無い物ねだりすんなと言うならわかるけど
260デフォルトの名無しさん (ワッチョイ b3e6-SE+q)
垢版 |
2021/10/02(土) 07:21:09.62ID:f83gGEH/0
VB7を待て!
2021/10/02(土) 07:44:35.99ID:PmOXqFk20
>>259
言ってる意味が分からない。
生成した後初期化用のメソッド呼ぶだけだろ?
なんでそんなのが面倒でバグの元になるんだ?
お前はそんな程度でバグを生むソースを書くのか?
262デフォルトの名無しさん (ワッチョイ 6f68-UmxQ)
垢版 |
2021/10/02(土) 07:49:32.43ID:i6pQYLUQ0
それ言い出すとどんな言語でも「だけ」になるぞ
2021/10/02(土) 07:52:52.17ID:PmOXqFk20
それにポリモーフィズムを理解している奴ならむしろバグやUTケースを減らせるコードが書ける。
でなければObject指向なんてここまで浸透しなかっただろうよ。
2021/10/02(土) 07:53:44.67ID:PmOXqFk20
>>262
例えば?
2021/10/02(土) 08:50:27.63ID:7sXji/t3M
むしろ>>263の方に例えば?って言いたいわw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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