Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 22:08:43.71ID:jtngtgXU0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

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

※前スレ
Excel VBA 質問スレ Part69
https://mevius.5ch.net/test/read.cgi/tech/1607786543/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/03/28(日) 12:41:13.75ID:SibCEmYdH
>>76
コードの中の全部のRangeやCellsにもブック名とシート名を書いてある?
2021/03/28(日) 12:53:44.04ID:vqLmoR8/M
面倒なのは分かるが意図しない動作をする時はF8で1ステップずつ挙動を確認したりデスクに適当な人形をおいてコードを1行1行何をしている行なのかを人形に対して声に出しながら説明すると原因を突き止めやすいぞ
2021/03/28(日) 13:27:37.72ID:slfnYujm0
当該ブックのアクティブ化とCallだけでやろうとしている?

これかしら?
Application.Run ‘パス+ブック名’!マクロ名

https://excelwork.info/excel/runmethod/
2021/03/28(日) 14:55:28.65ID:0AXzz3HSa
thisworkbookでいいんじゃね
2021/03/28(日) 15:28:42.70ID:58jRB2Jo0
>>76
これだとアクティブなシートの[A1]に入力されます
Range("A1")=1

これだと指定したファイルの指定したシートの[A1]に入力されます
Workbooks("Book1").Worksheets("Sheet1").Range("A1") = 1
2021/03/28(日) 17:37:33.16ID:NPcBjbDnp
まーおそらく値の設定時に
ちゃんとどのブック、どのシートって
設定されていないんだろうけど
もっと気になるのは6秒というスパンの中で
処理が6秒を間に合わなかったらどうするのか
ちゃんと考えて作っていのかってことかな
大きなお世話かも知れんけど
83デフォルトの名無しさん (ワッチョイ d2e6-WhAp)
垢版 |
2021/03/28(日) 18:29:23.67ID:vpNC6cf/0
セルの編集は6秒あれば楽勝です
2021/03/28(日) 20:03:24.72ID:5/aHi+ebd
>>40
自分が書き込んだかと思ったわw
2021/03/28(日) 20:31:26.17ID:y1jMexrp0
UIAutomationでInvokeをするVBAマクロをタスクスケジューラで
日次・定時に起動しているのですがロック画面ではInvokeが実行されません

解決策をご存知でしたらご教示お願いします
2021/03/28(日) 21:54:46.91ID:FtDhz91V0
ロック画面にしない
2021/03/29(月) 18:09:13.47ID:RBGHkQmra
もはやexcelの問題じゃねーし
2021/03/29(月) 19:13:47.90ID:QhuH86uEa
なんでFINDで探せないんだろ
とおもったら
改行コードがはいっていたでござる

やれやれ
2021/03/30(火) 17:58:10.32ID:0EHjDb6N0
質問です

前はExcel2010の時はレジストリを維持って、VBAファイルだけはインスタンス起動が出来るようにするとか可能でしたが
2019にするとインスタンス起動ができなくなってました。
.xlsmファイルだけインスタンス起動するとか方法はないでしょうか
2021/03/31(水) 04:17:21.25ID:1Kn3VVGI0
右クリックして[新規] じゃだめなのか?
9176です。 (ワッチョイ b163-VcSF)
垢版 |
2021/03/31(水) 18:32:23.42ID:Evr26ox50
回答くださった皆さん本当に有難うございます。
これから回答いただいた対処法を全て1個1個試していこうと思います。
なお6秒に一回とは、エクセルのセルに株価をリアルタイムで
反映するソフトがあるのですが、それで株のアラート機能を
VBAで自作で作っているので必要なのです。
ではでは。
2021/03/31(水) 20:42:46.87
sheet1のA1には
https://www.jma.go.jp/英数字

A3からA10000には、それぞれ異なるURLが記載されています

B1には
https://maps.gsi.go.jp/index_m.htmlhttps://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.htmlhttps://www.jice.or.jp/knowledge/japan/commentary03
みたいなURLが繋がっている文字列があります

B2からB10000には、上の様なURLが繋がっている文字列があります

A1からA3は
https://www.jma.go.jp/英数字

B1
https://maps.gsi.go.jp/index_m.html

B2
https://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.html

B3
https://www.jice.or.jp/knowledge/japan/commentary03


みたいにB列にあるセル内を分解して、分解した分だけA列にA1の文字列を補う処理
以降B10000までを処理して
sheet2に記載したいのですが、どのようにすればよいでしょうか?
2021/03/31(水) 22:33:41.42ID:GYCr8oLd0
何言ってるのか判らんが
好きなようにやればいいよ
94デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 00:43:47.27ID:Qm9pGYRd0
>>91
「エクセルのセルに株価をリアルタイムで
反映するソフトがある」

こんな珍味なソフトウェアがあるのかw
95デフォルトの名無しさん (ワッチョイ b163-VcSF)
垢版 |
2021/04/01(木) 02:05:44.32ID:GioFRFH30
>>94
楽天RSS 岡三RSS。
因みに株は難しく甘い世界ではないので安易にやらないようにしましょう。
ほとんどの人が負けます。
96デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 03:02:30.23ID:Qm9pGYRd0
変な外国人が作ったんだろうなあ
2021/04/01(木) 09:31:40.60ID:JyQIT704d
「珍味」ってそういう使い方する言葉だっけ
2021/04/01(木) 10:40:32.36ID:Jj+/G5yda
たぶん珍妙
2021/04/01(木) 10:48:06.97ID:jNbL4ETRd
ワークシートの一部を画像として保存する方法にChartObjectsのExportメソッドがあります
が、罫線が一部消えてしまったりフォントが潰れたりして、画質が悪いのが気に入りません
もっと高画質で範囲指定してスクショを保存する方法はないでしょうか?
100デフォルトの名無しさん (ワッチョイ 6963-VcSF)
垢版 |
2021/04/01(木) 11:51:22.66ID:tUMm1OA70
>>99
クリップボードを手作業で切り取る際、エクセルの倍率
(Ctrl+マウススクロールで変えれるあれ)を100%よりも大きい高倍率で
切り取った方が画質が良い。
従って、その画像を取得するマクロの直前に、
エクセルの画面の大きさを変えれるコードがあるので、
それを直前に入れ、それを切り取れば恐らく高画質のが出来るんじゃないかな。
最後は勿論ばい倍率をもとに戻すマクロを入れれば良いと思う。
101デフォルトの名無しさん (ワッチョイ 62ee-Bi/r)
垢版 |
2021/04/01(木) 12:01:45.09ID:fy6TS88x0
>>90
インスタンス起動ではないですよね
2021/04/01(木) 15:56:27.00ID:yB6nLlLi0
>>92
Ruby で作った。
正規表現の否定先読みなどを使えば、もっとスマートに書けるかも

# ? は、直前のパターンの0〜1回の繰り返し。「https?」は、「http|https」と同じ意味
re = %r!(https?://)! #=> https?:\/\/

input_str = %w(https://a/b.html http://c https://x/y).join
#=> "https://a/b.htmlhttp://chttps://x/y";

pos = input_str.size # 文字列の末尾の位置

results = [ ]

# 文字列の末尾から、一致させていく
while pos = input_str.rindex( re, pos )

# 一致した位置から末尾までを削除して、それを配列の先頭に追加していく
results.unshift input_str.slice!( pos..-1 )
end

p results #=> ["https://a/b.html";, "http://c";, "https://x/y";]
2021/04/01(木) 16:01:13.59ID:yB6nLlLi0
>>102
修正
>re = %r!(https?://)! #=> https?:\/\/
re = %r!https?://! #=> https?:\/\/

( ) は、いらない
2021/04/01(木) 16:53:17.71ID:7y1pTd6e0
>>94
オプションのスマイルカーブをリアルタイムに描画するエクセルソフトとかもあるよ。
105デフォルトの名無しさん (ワイーワ2 FF1a-j37g)
垢版 |
2021/04/01(木) 17:08:13.22ID:jznaQuthF
外部からローカルのファイルを更新するなんてマルウェアみたいだな。
2021/04/01(木) 21:32:16.81ID:5T6IIfi20
>>95
配当なんてせいぜい数%
そこから税金2割引かれる
値上がり益は株価が永遠に上がり続けない限り期待値はゼロで、儲かったら2割税金、損しても2割補填してもらえるなんてことはない
つまり税金を考慮した期待値はマイナス
2021/04/01(木) 23:13:35.12ID:yB6nLlLi0
>損しても2割補填してもらえるなんてことはない

補填してもらえる。
何年か損失を繰り越ししていれば、儲かった時に相殺される

長年、銀行が税金を払わないのは繰越損失があるので、
その後、利益が出ても相殺されるから
2021/04/02(金) 20:32:20.64ID:OjzTopDr0
>>107
永久保証ならな
3年でさようならなんだから期待値はマイナス
2021/04/03(土) 10:18:57.57ID:0vCxCYiYa
最近のはinternetexploreを許否するwebがあるからこまる
スマホならともかくビジネスではまだ主流なのに
2021/04/03(土) 10:25:49.87ID:RckTLwqyd
さすがワッチョイにIEを出す男は言うことが違う
2021/04/03(土) 10:59:03.48ID:D2e+M4g2M
Web開発でIE対応が要件にないときにはむしろ意図的にIEで動かないようにするわ
勝手にIEで使われて文句言われるの最高にウザい
2021/04/03(土) 13:29:03.89ID:XPTw6Pj4M
>>33
自己レスだがわかったわ
WEBクエリでWEB内容をシートに書き出す
その中から出来高とかのワードをfindで探して
そのワードのn行後を取ってくる
みたいな動作をしてるんだけど、
ヤフーファイナンスの仕様が変わって
n行後の場所が変更になってた

ETFだけは従来の場所だから
上記結果がゼロならば違う場所を
取ってくるようにした

コピペプログラマだから
今回findとかOffsetを強制的に
学ばされて勉強になった
2021/04/03(土) 13:43:31.82ID:LoNYZ+kpF
>>110
IEが拒否されるときは
こっそりExcelシートでhtml をつくるだよ
htmlならまず拒否されないから

そーして、いつの間にかフォルダーが開いてる
フォルダー御開帳よ
2021/04/04(日) 02:10:27.86ID:7SFCjwlv0
ListViewのすべての項目を一発で削除する方法はありませんか?
ListBoxならClearメソッドが使えるようなのですが
2021/04/04(日) 03:01:59.01ID:OlWsfN+XM
>>114
ListView.ListItems.Clear
2021/04/04(日) 04:07:16.17ID:hsI5tKvB0
別ブックから別ブックへ値を持ってきたいときって、コピーか配列使うしかないですか?
コピーペーストは処理重そうでスマートっぽくないし、配列は張り付ける範囲をちゃんと指定しなきゃダメなのがめんどくさそうなんですけど、いい方法ないですか?
2021/04/04(日) 06:20:04.03ID:5jDGrLPha
コピーでいいやん
2021/04/04(日) 13:08:15.45ID:X/c7fPAEM
>>116
コピー先ブック.コピー先シート.Range().Value = コピー元ブック.コピー元シート.Range().Value
カッコ内はテキトーに
2021/04/04(日) 13:44:02.06ID:7SFCjwlv0
>>115
ありがとうございます!うまくいきました
すみませんがListViewについてもう一つ教えていただけないでしょうか

MultiSelect=Trueのときの選択項目数をラベルに表示させたいと思っています
リストが選択されるたびに表示を更新したいのですが、なにかいい方法はないでしょうか

ItemClickイベントで項目数を数えようとしましたが、選択数分イベントが発生するため項目数が増えると重くなってしまいます
ListBoxのChangeイベントのように複数選択しても一度しか発生しないイベントがあるといいのですが、無さそうなので困っています
2021/04/04(日) 17:46:13.14ID:JgvM3WMx0
>>116
コピー元もコピー先もシートを変数に入れておけば変数シート.セルで指定は少しスマートにできる
2021/04/04(日) 18:49:59.93ID:hsI5tKvB0
>>116です
>>118さんのいった通りrangeにvalueをつけてあげればrange.value =range.valueでうまく値をいれることができました
まだオブジェクトがうまく理解できていなかったです
もっと勉強したいと思います
ありがとうございました!
2021/04/05(月) 04:34:52.29ID:3N8BM4zS0
セルには0.9って入力してあるのに
VBAのcellsでそれを取得すると1と認識されるんですが
勝手に小数点以下を切り捨てないようにするにはどうしたらいいですか?
2021/04/05(月) 07:04:34.80ID:FxhyQ6l10
Currency型の変数に代入する
2021/04/05(月) 07:43:12.07ID:CnxjloBy0
>>123
そだね
ただCurrency型は小数点4桁までしか扱えないから
上記みたいに小数点1桁だったらいいけど
5桁以上扱ったり掛けたり割ったりする場合はDoubleの方がいいかな

ただ、Double型の場合は
浮動小数点あつかいでIEEE754規格だから
変に丸められちゃうことがあるんでかけ算割り算行う時は
一度整数にして計算してやる必要があるけど

まぁ使い所でどの型使うのか分けて使うのがいいかもね
2021/04/05(月) 12:36:23.48ID:3N8BM4zS0
>>123
>>124
ありがとうございます。integer型にしてました
2021/04/05(月) 17:42:39.68ID:GNHugBRe0
>>122
0.9の小数点以下を切り捨てたら 0 じゃね 
2021/04/05(月) 18:04:06.91ID:34gLfvfqa
別にInteger使う理由もないしlongにしちゃえばとも思う
2021/04/05(月) 19:09:20.57ID:IFZcDQ1J0
>>126
たしかに
2021/04/06(火) 06:08:10.23ID:KMOOpCjWa
型を指定すると遅くなるから
できるだけ指定なしがよいよ
マクロらしさを生かそう
2021/04/06(火) 07:02:52.46ID:Au4GybQm0
>>129
メンテが遅くなるからだめ
2021/04/06(火) 10:21:14.29ID:e+L9SfjT0
>>129
おいおいw
いくら質問スレで初心者だらけだからって
適当なことを教えてはいけない

指定しなかった型には自動的にVariant型が割り当てられて
本来Integer型だったりLong型で済むものに莫大なメモリを割り当てるし当然処理速度も遅くなる

VBAは比較的型の扱いが雑でも何とかなる方ではあるが
頭にプログラムの頭にOption Explicit付けといて型は明示的に設定する癖をつけておいた方がいい
2021/04/06(火) 11:09:39.71ID:jDDsYkyr0
複数の多次元配列をプロシージャに参照渡しするときはどう書けばいいですか
こう書くとスルーされます。

Sub Smple()
Dim ara(2,4) As Variant, arb(85,3) As Variant, arc As Variant)
・・・略
Call SheetCreate(ara(),arb(),arc())
End Sub
Sub SheetCreate(ByRef ara As Variant, ByRef arb As Variant, ByRef As arc As Variant)
・・・略
End Sub
2021/04/06(火) 12:45:54.77ID:e+L9SfjT0
>>132
うん、まあ
引数の型をVariantにしているからでしょうなぁ
何故Variantにすると値渡しになるのかは分からんけど

ちゃんと変数宣言のところで
StringとかIntegerとかの配列型宣言をして
呼び出される関数の引数にも
それに見合った型にすれば参照渡しされるんじゃない?
試してみて
2021/04/06(火) 14:36:15.96ID:jDDsYkyr0
>133
知らなかったです。ありがとうございます
2021/04/06(火) 14:39:05.93ID:7PISA/BhM
>>132
普通に
Sub Smple()
Dim ara(2,4) As Variant, arb(85,3) As Variant, arc As Variant
・・・略
Call SheetCreate(ara, arb, arc)
End Sub
Sub SheetCreate(ara As Variant, arb As Variant, arc As Variant)
・・・略
End Sub
って書けばいいだけだと思う
2021/04/06(火) 19:30:17.02ID:jDDsYkyr0
>>135
最初はそれでやっていたのですが、同じくスルーされてました
このサブプロシージャ内でブレークポイントを設定しても止まらなかったので、サブプロシージャがスルーされていると思っていたのですが、
サブプロシージャを外しても止まらず、別のファイルに書き換えたら動くようになりました。
2021/04/06(火) 19:51:59.72ID:JmeclF78d
ブレークポイントで止まらないのはおかしい
根本的に別のとこで間違ってる
2021/04/06(火) 20:36:50.07ID:DMwNdxSba
うむ、おかしい
2021/04/06(火) 22:23:14.18ID:kxv5hjcy0
Sub Smple()
Dim ara(2, 4) As Variant, arb(85, 3) As Variant, arc As Variant
Call SheetCreate(ara, arb, arc)
End Sub
Sub SheetCreate(ByRef ara() As Variant, ByRef arb() As Variant, ByRef arc As Variant)
End Sub
140デフォルトの名無しさん (ワッチョイ e5da-jIYQ)
垢版 |
2021/04/07(水) 19:30:33.27ID:aMJgToSe0
全部省略すれば勝手にByRefだと思ってけど違うの?

SheetCreate ara, arb, arc

Sub SheetCreate(ara, arb, arc)

End Sub
2021/04/07(水) 20:03:43.34ID:rHsSD320H
>>140
その認識は半分正しいけど半分は場合によるので間違い
とくに配列を渡す場合はややこしい
2021/04/07(水) 20:42:25.04ID:Vn8Hoh2Q0
配列・オブ・カリビアン
2021/04/07(水) 20:47:54.61ID:nkaFkhSP0
>>141
不思議なんだよねー
配列変数だとByrefにしてもVariantで渡すと値渡しになることがある
よしんばVariantが値型だとしても値型の参照渡しで渡るのは参照渡しになるはずなのに何で?
2021/04/08(木) 15:04:36.48ID:6DaO6dJm0
色々しらべたよ
まず、VBAやってる人はByValとByRefくらいしか気にしない人多いけど、
そもそも変数には参照型と値型というのがあって値型は値そのものが変数に入っているけど
参照型というのは実体が入っているんじゃなくて実体の入っている場所の情報が入っているんだよ。
オブジェクトの類が参照型で、StringやIntegerなんかが値型。
参照渡し、値渡しとこの参照型、値型という組み合わせで何が渡るか決まるんだけど

参照型の参照渡し;
引数の入っているアドレス(場所)を見に行って、その引数の中に入っているアドレスに入っているものを見に行くから、
内容を変更すると関数で呼ぶ前のものも変更されるよ

値型の参照渡し;
引数の入っているアドレスをコピーしてそのアドレスが指してるところの値を見に行くから、
内容を変更すると関数で呼ぶ前のものも変更されるよ

参照型の値渡し:
引数の入ってる値をコピーするけど、その引数の中には実体の入ってるアドレスが入ってて、そっちを見に行くから
内容を変更すると関数で呼ぶ前のものも変更されるよ

値型の値渡し
引数の入ってる値をコピーして、そのコピーした値の内容も値そのものが入っているから
内容を変更しても関数を呼ぶ前のものは変更されないよ

まずこれが大前提ね
2021/04/08(木) 15:20:56.67ID:6DaO6dJm0
本題に入るね。
配列変数でもその辺は基本変わらないけど、
何故か値渡しにしようとすると構文エラーになるんだ
そんなときは呼び出し先の引数をVariant型に変えてあげればいいって話だけど、
Variant型にしても参照型のものは参照が見られるから内容を変えれば関数を呼び出す前の内容も変わるんだよね。

variant型の配列を作って値型のものと参照型のものを違う要素に入れてそれを引き数に値渡しで設定してあげると
参照型のものを入れた部分は変更すると関数呼び出す前のものにも反映され、値型の部分は変更が反映されない。
思ったよりお利口さんだったよ。

結論を言うと
何で配列でキチンと型設定して値渡ししようとすると構文エラーで落ちるんじゃマイクロソフトのボケが!!
と言うところに落ち着いたよ
2021/04/08(木) 17:10:39.89ID:OX80XKzVM
うろ覚えで申し訳ないんだけど、引数をByVal TestAry() As Longとかにすれば値渡し出来なかったっけ?
2021/04/08(木) 17:27:48.87ID:6DaO6dJm0
>>146
呼び出し元に設定した変数もしくはリテラル値が型的にあっている、
もしくは暗黙の変換が行われる型ならそもそも設定しているものが値型。
そうでなければエラーになると思う。
2021/04/08(木) 17:47:34.27ID:vZ3ddDF70
質問場所間違ってたら言ってください
iPhone用Excelで仕事の日報を書いてるのですが
時間を書き込んで→を押して数字を書き込むと
前のセルに書き込んだ数字
例えば8:00と書き込んで→を、次に16:00と記入しようと1を押すと8:00:001ってなってしまいます
これってならなくする方法ありますか?
149デフォルトの名無しさん (ワッチョイ 558e-tazQ)
垢版 |
2021/04/08(木) 18:07:25.00ID:BiHFumMw0
>>148
死ね
2021/04/08(木) 18:07:51.70ID:6DaO6dJm0
>>148
iPhoneは持ってるんだけどPC側しか365のアカウント持ってないんだ。ごめんね。
だけどググってみたら書式設定は出来るみたいだから数字にしたいセルの部分をそう書式設定すればいいんじゃないかな?

あと、一応EXCEL関連のスレはここに有ったけど
Excel友の会
https://egg.5ch.net/test/read.cgi/software/1223040168/

何か過疎ってるどころか最後の書き込みが去年の10月だから機能していないね。ここのスレでEXCELのこと聞くのは
ここのスレの住人がみんなOKすれば大丈夫だと思うけど
今まで随分色んなことあったから難しいかも知れないよ。
2021/04/08(木) 19:22:03.89ID:wZLPNhcm0
こんなマクロの使い方もあるようで。
https://anond.hatelabo.jp/20210408000218
2021/04/08(木) 20:16:35.28ID:JmFnD0edM
要素数の限界ってどれくらいなの?
多次元配列で一次元あたり数千とかにしたらメモリ不足のエラーになった
2021/04/08(木) 20:37:06.14ID:eomKGQCU0
多次元はめっちゃメモリ食うからなるべくやるなと言われている
154デフォルトの名無しさん (ワッチョイ 2368-8vo5)
垢版 |
2021/04/08(木) 22:20:43.27ID:xay8Megr0
タスクマネージャでも眺めながら色々試してみては
物理メモリだけじゃないだろうけど、なんぼか目安にはなるだろう
2021/04/08(木) 23:36:50.07ID:zGFXp+zdH
64bit版なら配列変数1個あたり4GBまで
32bit版は2GBまで
つまりデータの型によって要素数の上限は違う
2021/04/09(金) 00:36:31.60ID:J+L5UjPE0
>>153-155
ありがとう
タスクマネージャ見ても余裕だったんで理由を知りたかった
次元数2次元までにしといた方が無難だね
2021/04/09(金) 17:10:54.57ID:v0s3XxNT0
>>156
そうだね
あくまで俺の経験則だけど
2次元から3次元にしたとき何でも一挙に難しくなる気がする
元々簡単な作りのものしか扱わないならいいけど
VBAではないけど以前東大生が3次元で配列の制御を行うロジックを作って
自分でもよく分からなくなってしまったというのを見たことがあるし
ゲーム作るときも画面表示するだけで
三角関数はもとより行列やアフィン変換とか
理解してないとまともに出来ない
メモリ食うのも理由のひとつかも知れないけど
3次元には出来れば手を出さない方がいいと思う
2021/04/09(金) 19:26:47.90ID:o5ukQupNM
>>157
ちなみに今回使おうとしたのは3次元配列なんだけど、3次元配列にした理由は同じような2次元配列に順番にアクセスしたかったから
こういう場合は2次元配列を複数用意すればいいのかな?
3次元配列にした方がスマートに記述できると思ったんだけど
159デフォルトの名無しさん (ワッチョイ 6268-/CMm)
垢版 |
2021/04/09(金) 19:41:20.17ID:H0DC02Cp0
行、列、シートで、3次元
配列で重くなるならセルに入れてしまうという手も
2021/04/09(金) 21:04:50.47ID:v0s3XxNT0
>>159
シートを余計に食うけど場合によってはそれもひとつの有効手段だよね。
あまり見せたくなければVerryHiddenとかにしてしまえばいい訳だし。

>>158
使い処によると思うよ。使い方が単純でスピードが速い方がいいならそれでいいと思う。
ただ、これはあくまで「俺が」なんだけど実はあまり配列が好きじゃないんだ。
だからと言うわけでもないんだけどある程度大きなプログラムを組むときは
配列を使うこともあるにはあるけど、2次元配列の代わりにプロパティだけのエンティティクラス作って
それをコレクションやディクショナリに詰め込んで使ったり、
レコードセットを使ったりすることもあるし、
3次元では上記したような仕組みのものやそういった仕組みを持つクラスを作って、
それをまたコレクションやディクショナリにいれたりするように作ったりとか。
何でこんなまどろっこしいことするのかと言えば、要素と言うか項目やレコードの追加や
データ抽出が楽なんだよね。

シート足していいと言うなら先程の>>159の人の案も有りだと思う。
削除系は使えないけどシートにはその気になればSQLが投げられるから
抽出や計算、変換、加工とかする必要があるならかなり楽に作れることもあるからね。
161デフォルトの名無しさん (ワッチョイ 6268-/CMm)
垢版 |
2021/04/09(金) 21:29:44.17ID:H0DC02Cp0
三次元配列は単純に頭がしんどい
三次元空間の様にそれぞれの次元が同じ重みを持っているなら仕方ないけど、
それ意外なら行列の二次元+シート一次元、のように分けたほうがスッキリすると思う
2021/04/09(金) 21:34:45.69ID:VGCoQhdKa
省略したら値渡しでしよ
再帰かけるときには値渡しにしないと、いろいろ都合がある
2021/04/09(金) 21:37:45.95ID:VGCoQhdKa
>>161
賛成、エクセルのシート使うよね
2021/04/09(金) 21:50:51.12ID:v0s3XxNT0
>>162
これな
実はVB.Netの場合は省略するとByVal(値渡し)で
旧VB6やVBAの場合は省略するとByRef(参照渡し)で
両方やってる人はよく間違えるんだよね。

再起の場合は確かにどれを反映させてどれを反映させないか結構大事になるけど、
まぁ基本デフォルト使わないで明示的に書くだろうからあまり気にしなくてもいいかもね。
2021/04/10(土) 00:28:07.23ID:xAikY8XJ0
みんなありがとう
>>160
VBAは基本の参考書を読んで一通り分かったつもり
でもクラスは上級者すぎて分からないや
一応自作のオブジェクトという理解でいる
色々案を考えてくれてありがとう、もう少し勉強してからそのあたりも試してみる
2021/04/10(土) 06:57:57.98ID:+Fv9eRvVa
シートに書き出すととピポットにできるから
ピポットなら何重にも次元が増やせるし
処理もはやい
ピポットとvbaを組み合わせると、
けっこうはやい
2021/04/10(土) 08:02:59.36ID:GLiDRYw80
>>165
頑張って
クラスはObject指向言語だと必須だけどVBAでは無理して知ってる必要もないから気が向いたときに覚えればいいと思うよ

とは言ってもクラス自体はそんなに難しいものじゃないんだけどね。よく、ひとつの纏まった機能を他のモジュールに書くよね。
あれを標準モジュールの変わりにクラスモジュールに書けばクラスの出来上がり。
後は他のオブジェクト使うときと同じようにNewして変数に入れて、変数名.メソッド名、変数名.プロパティ名とか書けば使えるよ。

どっちかっていうと考え方と使いどころに慣れるまでがちょっと大変かもね。
それ以上の多態性とかデザインパターンとかの知識を身につけるころには他の言語やってるだろうから
今そんなに深く考えることもないと思うよ。
2021/04/10(土) 09:30:59.12ID:ASUPMck3M
>>165
VBAの範疇ならクラスは忘れてもいいと思う
コンストラクタに引数も持てないし継承もできないから普通にユーザー定義型と操作ルーチンをモジュールにまとめるのとたいして変わらんし
2021/04/10(土) 10:08:24.05ID:+Fv9eRvVa
エクセルというクラスを使いこなせば
ビジネスなら十分
エクセル以上のobject作るのは無理だから

なんつてセカンドオニオンでした
2021/04/10(土) 15:51:59.07ID:duTza7EGd
自分もクラスで挫折して今はユーザー定義型で幸せです
2021/04/10(土) 16:02:42.86ID:4ha6UGTxp
自分もユーザー定義にした途端お金が入って彼女が出来ました。今ではとっても幸せです。
2021/04/10(土) 17:05:30.13ID:eY7Q/L5k0
そうかい
2021/04/10(土) 20:22:47.19ID:mgDf3XRg0
>>170
プロパティとかコンストラクタとかあとは鯛焼きの型とかいきなり説明しだすから分かりにくいんだよな
2021/04/10(土) 20:23:09.87ID:mgDf3XRg0
最初はクラス内の変数と関数だけでプロシージャ内のコードがこれだけ簡潔書けるようになります程度でいいのに
175デフォルトの名無しさん (ワッチョイ 6268-/CMm)
垢版 |
2021/04/10(土) 20:31:08.56ID:u4vdYafN0
EXCELvbaで、クラスってどういう時に使うのでしょうか
ゲームのように細かいオブジェクトが多数ある状態なら分かりますが、
表の状態になったデータだと、今ひとつピント来ないです
社員classや顧客classを作るのでしょうか
2021/04/10(土) 20:42:21.31ID:r9QO1mE4M
無理に使う必要は無い。
「使わなくては!」と閃く状況が来るときまで。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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