Excel VBA 質問スレ Part79(ワッチョイあり)

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ aaa4-I2zm)
垢版 |
2023/01/28(土) 12:12:12.41ID:UjlIZ1Ov0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

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

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
Excel VBA 質問スレ Part77
https://mevius.2ch.net/test/read.cgi/tech/1658009255/
Excel VBA 質問スレ Part78
https://mevius.2ch.net/test/read.cgi/tech/1667104996/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
86デフォルトの名無しさん (アウアウウー Sa4f-mhYO)
垢版 |
2023/02/14(火) 13:19:18.08ID:YTnfnco6a
現場で使えるテクニック満載のVBAの本を教えて下さい。
2023/02/14(火) 22:18:21.54ID:h0+uN4JM0
見てどうする?
現場に活かせるとは限らんぞ
88デフォルトの名無しさん (ワッチョイ aff9-UHi0)
垢版 |
2023/02/15(水) 09:38:23.37ID:dWAC20qI0
syamei1ってテーブルを指定してるようだけど
ちゃんとテーブルが存在してるの?
RowSourceでクエリやsql指定してみたら?
2023/02/15(水) 19:02:02.67ID:8XlBz3tg0
>>87
活かせる現場に転職するんじゃね
90デフォルトの名無しさん (ワッチョイ c619-xn9B)
垢版 |
2023/02/15(水) 19:27:38.40ID:HlAv3bv30
ネットが見れない環境なんかね?
銀行系ではよくある話だけど
2023/02/15(水) 19:39:09.60ID:UoMCmZrt0
絆創膏テクニック的な本はたくさん出ているでしょ
2023/02/15(水) 20:32:13.82ID:8XlBz3tg0
銀行でお金の計算を初心者が本見ながらEXCELのVBAで作ってるとか
そんな銀行やばくね
2023/02/16(木) 02:33:56.63ID:v5+0ZrcQ0
ヤバいよそれは。
思い出したけど、どこかの銀行がATMの不具合出した事故を思い出したわ。
それと同じようなトラブルになるのでは?
94デフォルトの名無しさん (ワッチョイ a705-0qku)
垢版 |
2023/02/16(木) 14:14:15.80ID:TeVuhO500
Excel 365なんだが
ActiveXのコンボボックスをシートに配置すると
ブックを閉じるときにコンボボックスのChangeイベントが発生して
Changeイベントのコードが実行されるんだが、なんで閉じるときに発生するん?
バグじゃねーの?
95デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/16(木) 17:40:38.79ID:ImcZX1+Nd
アクティブXコントロールでボタン作ると、ボタン押した時にボタン内の文字が左に寄るのですが、これは治せるのでしょうか?
2023/02/16(木) 17:44:23.49ID:IvN11mYG0
ActiveXオブジェクトは、自分(Application)のオブジェクトに見えても、実は外部のオブジェクトです
Application イベントの扱いで記述不足や漏れが無いか、プロパティの見直しなどしてみるかコードを貼ってみるなり
2023/02/16(木) 20:35:33.62ID:v5+0ZrcQ0
ActiveXってExcelで使わない方が良いみたいな記事(日経PC)で見た記憶ある
98デフォルトの名無しさん (ワッチョイ a705-0qku)
垢版 |
2023/02/17(金) 07:12:43.98ID:WORa0xXL0
ActiveXはExcelシートで使うもんじゃないってのは今でも定石!
99デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/17(金) 10:04:33.80ID:o2LVTB4Vd
https://answers.microsoft.com/ja-jp/msoffice/forum/all/office-2016-の-activex/81aa0b17-2f60-49c3-83f7-02c164969f7c

Excel2016のバグなんですね
100デフォルトの名無しさん (スププ Sdaa-GKAg)
垢版 |
2023/02/17(金) 10:05:10.85ID:o2LVTB4Vd
https://answers.microsoft.com/ja-jp/msoffice/forum/all/office-2016-の-activex/81aa0b17-2f60-49c3-83f7-02c164969f7c
2023/02/17(金) 10:15:37.69ID:znCeXLfL0
そんな古いVer使い続けるなよ スタンドアロンで一台こっきりならまだしも
2023/02/17(金) 15:42:35.67ID:WFsPqw+S0
検索で例えば「あ」という文字をすべて探し出して
その一文字前を選択したいんですがどうすればいいですか?
Selection.Find
 .Text = "あ"
 Selection.Words.First.Previous.Select
としてみましたがうまく行きませんでした
カーソルのある前の文字が選択されます
2023/02/17(金) 16:30:19.83ID:KwkbTkoud
>>102
複数の選択ができると思ってんのか?
2023/02/17(金) 17:31:12.72ID:WFsPqw+S0
>>103
できないんですね…VBA触ったの今日が初めてなもので
最終的には"あ"の一文字前だけをフォント変更したいんですがどういう実装ならできそうか分かりませんか?
2023/02/17(金) 20:35:48.06ID:clT0gqvf0
>>104

自分なら検索して見つかったセル毎に
「あ」が何文字目にあるかを取得し、
その1文字前のフォントを変更するというふうに組む。
2023/02/17(金) 20:59:53.94ID:WFsPqw+S0
>>105
ありがとうございます
けど"あ"が複数あるセルも多いので…複数回走査したらループ終わらなくなりますし
"あ"は目印として入れてあるだけで最後にまとめて消すつもりだったんですが
一回フォント変更の処理したらそこの"あ"を消してもう一度検索がいいんでしょうか…
107デフォルトの名無しさん (スプッッ Sd4a-GMxD)
垢版 |
2023/02/17(金) 22:23:30.64ID:v2XGnFXnd
>>106
Mid( Range.value, x)で
セル内のx文字目から後ろを切り出せる
Instr( Mid( Range.value, x), z)で
セル内のx文字目から切り出した中で文字列zが何文字目にくるのか知ることができる
Range.characters(x, y).Fontで
セル内のx文字目からy文字分みたいな一部指定でのフォント変更が出来る

これらのxやyをForで変更しながら処理すればいけると思う
2023/02/17(金) 22:57:47.99ID:WFsPqw+S0
>>107
あああなるほどなるほど
仰ってる意味はギリわかるんですけどコードいじるのほぼ10年ぶりとかなんでハードル高い~~~
どうにかがんばってみます……
ありがとうございました
2023/02/18(土) 11:21:39.71ID:wyxXLbRL0
>>108
コードを書いてみた。
所定のフォントを変えた後、最後にまとめて「あ」を空白に置換させている。

Sub findあ()
 Dim foundcell As Range, firstcell As Range, target As Range, Num As Long, flag As Boolean
 Set foundcell = Cells.find(What:="あ")
 If foundcell Is Nothing Then Exit Sub
  Set firstcell = foundcell:Set target = foundcell
  Do
   Num = InStr(foundcell, "あ")
   If Num > 1 Then
    flag = False
Do
If flag = False Then Num = 0
Num = InStr(Num + 1, foundcell, "あ")
If Num = 0 Then Exit Do
foundcell.Characters(Start:=Num - 1, Length:=1).Font.Name = "BIZ UDゴシック":flag = True
Loop
End If
Set target = Union(target, foundcell)
Set foundcell = Cells.FindNext(foundcell)
Loop Until foundcell.Address = firstcell.Address
target.Replace What:="あ", Replacement:=""
End Sub
2023/02/18(土) 11:39:38.68ID:wyxXLbRL0
途中で書き込んでしまったので
もし使うならインデント調整して下さい
2023/02/18(土) 18:22:51.48ID:oiEmQBhiM
>>109-110
ご親切にありがとうございます!!
有り難く使わせていただきます
112デフォルトの名無しさん (ワッチョイ 2302-3nnD)
垢版 |
2023/02/19(日) 13:44:33.87ID:E1njzG6f0
次のようにA列にid番号、B列に削除されるid番号あります。
A,B
1,3
2,5
3,7
4,
5,
6,
7,
8,
9,

C列にAからBの番号を除外したものが残ります。
C,
1
2
4
8
9

これを実現するのに、みなさんならセル関数を使いますか?VBAを使いますか?
113デフォルトの名無しさん (ワッチョイ 9b8c-DN/W)
垢版 |
2023/02/19(日) 14:09:46.37ID:fQjaN3Vg0
バージョンは
2023/02/19(日) 14:50:51.24ID:E1njzG6f0
ver2019です。
2023/02/19(日) 15:46:46.73ID:IrwBul5G0
手動も含めて一番都合がいいのを使う
2023/02/19(日) 16:33:34.29ID:E1njzG6f0
ありがとうございます。慣れないですがVBAで行うことにしました。
117デフォルトの名無しさん (ワッチョイ 2302-3nnD)
垢版 |
2023/02/19(日) 16:36:15.42ID:E1njzG6f0
以下の実行が通りません。
If init_id(i) = del_id(j) Then
の個所でインデックスの範囲外というエラーがでました。
配列に対して添字を()しているのが問題でしょうか?

Sub 次の問題()
Dim totalQuestions As Long, pastQuestions As Long, Nextnum As Long, n As Long
Dim init_id() As Variant, del_id() As Variant

totalQuestions = Worksheets("Play").Cells(Rows.Count, 1).End(xlUp).Row - 1
Randomize
Nextnum = Int(totalQuestions * Rnd + 1)
n = Worksheets("arrData").Cells(Rows.Count, "B").End(xlUp).Row + 1
Worksheets("arrData").Cells(n, "B") = Nextnum

init_id = Worksheets("Play").Range(Worksheets("Play").Cells(2, 1), Worksheets("Play").Cells(totalQuestions + 1, 1)).Value

pastQuestions = Worksheets("arrData").Cells(Rows.Count, 2).End(xlUp).Row - 1
del_id = Worksheets("arrData").Range(Worksheets("arrData").Cells(2, 2), Worksheets("arrData").Cells(pastQuestions + 1, 2)).Value

Dim i As Integer, j As Integer
For i = 1 To totalQuestions
For j = 1 To pastQuestions
If init_id(i) = del_id(j) Then
Debug.Print init_id(i).Value
End If
Next j
Next i

End Sub
2023/02/19(日) 16:40:27.54ID:E1njzG6f0
念のため、chatGTPはあてにならなかったです。
2023/02/19(日) 17:24:19.98ID:ZehIwlnC0
>>117
Integerだからだろ
2023/02/19(日) 17:30:57.52ID:E1njzG6f0
ありがとうございます。Longにしてもダメでした。
根本的に配列の扱いが間違っているような感じですが、
それがよくわかりません。
121デフォルトの名無しさん (ワッチョイ 1501-rVJW)
垢版 |
2023/02/19(日) 17:39:18.41ID:j3UrUaev0
>>120
init_id = Worksheets("Play").Range(Worksheets("Play").Cells(2, 1), Worksheets("Play").Cells(totalQuestions + 1, 1)).Value

del_id = Worksheets("arrData").Range(Worksheets("arrData").Cells(2, 2), Worksheets("arrData").Cells(pastQuestions + 1, 2)).Value
でinit_idとdel_idにセルの値を配列として代入しているけど、これは2次元配列として代入している
だからinit_id(i)という一次元配列は存在しない
init_id(1,1)とかinit_id(2,1)の二次元配列として存在している
よってinit_id(i)は存在しませんってエラーが出てる
ローカルウインドで確認するといい
2023/02/19(日) 17:44:28.85ID:E1njzG6f0
ありがとうございました。よくわかりました。
なんとか1次元の配列を作りたいと思います。
セルデータから簡単に配列つくれるということでこの作り方になったのですが。
列番号を1つにすれば1次になるかと浅はかでした。。
2023/02/19(日) 18:07:25.25ID:xzOvW7kvd
配列よりDictionaryの存在チェックで判定する方が簡単そうだけどなぁ
2023/02/19(日) 18:17:57.66ID:FtkTxk830
>>112
VBAならこんな感じか。
後、C列に6がないのは記入漏れ?

Sub C列に書く()

Dim i As Long, cnt As Long, dRange As Range
Set dRange = Range("B1:B3")
cnt = 1

For i = 1 To 9
If WorksheetFunction.CountIf(dRange, Cells(i, 1)) = 0 Then
Cells(cnt, 3) = Cells(i, 1)
cnt = cnt + 1
End If
Next i

End Sub
2023/02/19(日) 18:24:49.89ID:E1njzG6f0
>>124
ありがとうございます。やろうとしていたコードよりシンプルです。
2023/02/19(日) 18:28:42.83ID:E1njzG6f0
>>124でおしえていただいた方法で進めたいのですが。
これで、エラーがでたのはなぜでしょう?
Sub 次の問題()
Dim totalQuestions As Long, pastQuestions As Long, Nextnum As Long, n As Long
Dim init_id() As Variant, del_id() As Variant

totalQuestions = Worksheets("Play").Cells(Rows.Count, 1).End(xlUp).Row - 1
Randomize
Nextnum = Int(totalQuestions * Rnd + 1)
n = Worksheets("arrData").Cells(Rows.Count, "B").End(xlUp).Row + 1
Worksheets("arrData").Cells(n, "B") = Nextnum
pastQuestions = Worksheets("arrData").Cells(Rows.Count, 2).End(xlUp).Row - 1

Dim i As Integer
For i = 1 To totalQuestions
init_id(i) = Worksheets("Play").Cells(i+1, 1)
Next i
For i = 1 To pastQuestions
del_id(i) = Worksheets("Play").Cells(i+1, 1)
Next i

End Sub
2023/02/19(日) 20:06:54.10ID:owAZbnPUd
春休みか?
2023/02/19(日) 20:22:10.83ID:j3UrUaev0
これ流石に釣りだろ
いつものキチガイ臭がすごいわ
2023/02/20(月) 01:12:29.14ID:CLcJ/prP0
また荒らしか。
130デフォルトの名無しさん (ワッチョイ 615f-djih)
垢版 |
2023/02/25(土) 22:54:00.85ID:IaGdb0E30
VBA初心者です
退職済みの前任者が作ったマクロで多発してるエラー対応をしています

Dim 範囲 As Range
Set 範囲 = Worksheets(″Sheet1″).Range(″A1″).CurrentRegion

・変数に日本語を使うメリットとデメリット
・Range型の変数を使うメリットとデメリット
教えてもらえないでしょうか?
131デフォルトの名無しさん (スップ Sdda-iutv)
垢版 |
2023/02/25(土) 23:47:26.72ID:tG3tii0/d
>>130
お前のレベルで手を出すな
2023/02/25(土) 23:51:02.20ID:apv923pv0
聞いたこともない英単語だとかえってわからなくなるからいっそ日本語の方がいい時がある(語学力の問題)
2023/02/26(日) 00:31:12.73ID:/hhgnOlt0
>>130
前任者がつくったとかいうのは関係なく、エラーを直して正常に動くようにするのは今の担当者の仕事じゃね
日本語を問題にするなら好きな言葉に置き換えればいいだろう
2023/02/26(日) 05:08:45.75ID:eudL/KWJ0
昔は確かに日本語変数だと変な挙動起きたがな。
2023/02/26(日) 10:08:54.14ID:B6f81u3Mr
日本語のメリット
人によっては視覚的に分かりやすい
デメリット
その度に切り替えボタンを押すのが面倒

後任者が分かりやすいように日本語にしといてくれたんだろう
136デフォルトの名無しさん (ワッチョイ b6da-aucd)
垢版 |
2023/02/26(日) 10:54:07.84ID:/hhgnOlt0
値1 と 値1 が混ざって変数宣言を省略してるとか
漢字の間違いや全角の空白が紛れてたこともあったな昔のことだが
2023/02/26(日) 12:24:12.13ID:nvWXChWd0
ついこの間、ExcelのupdateでまたVBAが壊れたので
変数はもちろん、ワークシートから引っ張ってくるシート名や定義名も
日本語は止めた。
2023/02/26(日) 12:27:06.36ID:pTLOSYzf0
Excelって非アクティブからクリックでアクティブにするとき、クリックしたセルが一発でアクティブにならんのな
前回操作時のセルがアクティブなる
デュアルモニターでマウス行ったり来たりしてExcel入力してるから面倒くさいったりゃありゃしない
スプレッドシートは問題ないんだけどさ
スレチだったらすまん
139デフォルトの名無しさん (ワッチョイ ee8c-trCw)
垢版 |
2023/02/26(日) 13:44:06.75ID:2K5zmO2D0
非アクティブのウィンドウにマウスをもっていったら自動的にアクティブになる
無料のユーティリティソフトを入れたらいいんじゃね
2023/02/26(日) 14:26:11.23ID:pTLOSYzf0
>>139
Windowsにその機能あるんだが、普段の使用で使いにくいんだよな
意図しないウィンドウがアクティブになってりして
とりあえずスプレッドシートのほう使うよにしたわ
2023/02/26(日) 20:33:51.43ID:gahU4Yv80
効率を語るならまずマウス操作を止めるべきだな
2023/02/26(日) 21:30:42.93ID:IOZzQyLPr
流石にエクセルのセルをクリックで操作は意味不明だろ
そこに文句言うヤツとか誰も想定してないと思うわ
2023/02/26(日) 21:41:09.74ID:pTLOSYzf0
いや、デュアルモニターの隣りの画面でFXのチャートの値幅をマウス操作で計測し、その値を隣の画面のExcelに打ち込んでデータ分析してるんだが……
一回入力するたびに隣の画面にポインタ移動するから、そのたびExcelが非アクティブになるんだよ
なんか俺めんどくさいことしてるのかな……?
まあ、これ以上はスレチになるからここで終わりにしておく
すまんかった
144デフォルトの名無しさん (ワッチョイ 5a02-ZYAP)
垢版 |
2023/02/26(日) 22:07:07.64ID:6/0OFtJ50
これじゃダメかい?
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Sh.Selection.Active
End Sub
2023/02/26(日) 23:34:16.33ID:pTLOSYzf0
>>144
うまくできんかった。
chatGPTでもマクロを教えてもらったが、そっちも機能せず
もしかしたらオマカンかもしれん
だからスプレッドシート使うことにした
わざわざすまんかった
ありがとう
2023/02/27(月) 01:12:31.98ID:ykCEF1qar
ん?よくわからんけど、vba起動したら別のソフトがアクティブになるってこと?
別のソフトをアクティブにする前にに次に使いたいセルをSelectかActivateにしとけばいいんでない?
そもそもセルに手打ちってのもよくわからんけど
2023/02/27(月) 20:02:31.12ID:Akgqa2X30
>>138
エクセルのアクティブ化とアクティブセルの変更を1クリックでやりたいって話だろ
デュアルモニターとか関係ない

Activate系のイベントでマウスカーソルの位置拾ってセル位置判定してアクティブ化するマクロを書けばできる気はする
マウスカーソルの位置ひらうのがVBAだけで出来なかった気がするから面倒だな
148デフォルトの名無しさん (スプッッ Sdfa-XBvd)
垢版 |
2023/02/27(月) 23:06:45.60ID:oBF60fgLd
そもそもFX側のプログラムから
記録用CSVなりに追記する形で出力にすればいいのでは
目的と手段を混同しているように見える
2023/02/28(火) 10:02:05.35ID:7Eonwnxx0
FX側はきっと既成のソフトウェアで手を入れられられず出力機能もないのだろう。
でなければマウスで幅を計測なんて、Excel抜きでも面倒な事をしてないと思う。

FX側ソフトウェアに要望を出す、別のものに変更する、または特注するのは有りだと思う。
2023/02/28(火) 12:23:19.77ID:nICQ8lOdr
B行に日付 C行以降は各項目
2023/4/3 パン 150
2023/4/16 米 500
2023/5/20 サラダ 230

2023/8/13 牛乳 150
などと表があるとこから、VBAでinputboxで何月を取り出したいですか?など質問をして、その月だけを別シートに抽出したいのですが…findを使う?
どうすればいいのか教えて頂きたいです。
151デフォルトの名無しさん (スプッッ Sdda-XBvd)
垢版 |
2023/02/28(火) 12:42:03.99ID:O8AX5fZ9d
>>149
そいつがやるべきはVBAじゃなくFXソフトのお勉強からだな
少なくともメタトレーダー系ならExcelに対するVBAのようなプログラム制作用機能が充実してるから値幅計測ぐらいわけない
2023/02/28(火) 15:14:30.22ID:kIDllaukr
>>150
どうればいいのかって…
VBAでinputboxで何月を取り出したいですか?など質問をして、その月だけを別シートに抽出してくださいってしか言えんだろ
具体的にコード出さないと何も言えない
153デフォルトの名無しさん (ワッチョイ 41f9-44A5)
垢版 |
2023/02/28(火) 15:55:23.62ID:d2Gt5PsA0?PLT(15000)

VBAでやるよりピボットテーブルの方が・・・
2023/02/28(火) 15:57:37.64ID:nICQ8lOdr
AutoFilterやCurrentRegion.copyで何とかなりました。
すみませんでした。
155デフォルトの名無しさん (スプッッ Sdda-XBvd)
垢版 |
2023/02/28(火) 17:32:55.16ID:O8AX5fZ9d
もしかして:For

まあ他人と共用するマクロなんだろうし
その他人の中にマクロのことを聞けるやつもいないんだろうから
手作業をマクロで書いただけみたいなので正解かもしれんな
2023/03/02(木) 03:38:03.48ID:wSjrNglr0
他人と共用するマクロは、共用している他人がマクロを編集できるので
自分がどう作っても他人が勝手に修正するだろうし・・・
2023/03/02(木) 06:52:29.36ID:J6gUWTNI0
>>156
事前に許可なく編集禁止と伝えておくのはどうでしょうか??
自分の職場はトラブル防止のため注意喚起を徹底してます。
2023/03/02(木) 14:19:36.36ID:wSjrNglr0
マクロを作った人間の責任とサーバー上のファイルを管理している管理者
業務としてマクロを使う作業を指示している上司に変更内容を確認してもらう必要があるよね
2023/03/04(土) 13:39:41.40ID:hC7IXlBmd
>>132,134-137
遅くなったけど130です
ありがとう
自分には日本語の変数のほうがわかりづらいし、>>137の言うように万が一にも備えて英語に置き換えることにした
2023/03/05(日) 14:08:33.99ID:SCRVkcxh0
Public Sub aiueo()
Dim Ary(2) As Variant
Ary(0) = 10
Ary(1) = "文字列"
Ary(2) = CDate("2021/2/2")
Dim test As Variant
test = Ary
Call aiueo2(test)
Call aiueo3(Ary())
End Sub
Public Sub aiueo2(ByRef Ary As Variant)
MsgBox TypeName(Ary)
End Sub
Public Sub aiueo3(ByRef Ary() As Variant)
MsgBox TypeName(Ary())
End Sub

関数への配列をどう渡すかで悩んでいます。
配列として渡すのか、Variant型のスカラー変数にして渡すのか。

VBAのVariant変数は配列さえも入るスカラー変数だと認識しています。
なので、配列そのものを入れてるだけで、Variant型の配列変数とは少し違うと思っていました。
しかし上記の結果は同じでした。そうなってくると
どっちでもいいということなのでしょうか?

もう一つ気付いたのはaiueo3はByVal渡しが出来ないけど、aiueo2ではByVal渡しが出来るので、
大元の配列の中身をいじらないで済むという違いがわかりました。

他に違いはありますか?
2023/03/05(日) 15:00:07.80ID:RB9OOifa0
>>160
Variantの配列は結局Variantだから下のように配列指定の括弧を取って関数宣言すれば値渡しもできるよ
Public Sub aiueo3(ByVal Ary As Variant)
関数引数の宣言で配列を受けるように書いてしまうと参照渡ししかできなくなるってだけ
2023/03/05(日) 19:01:06.89ID:ePQGVH9T0
>>160
そんなサンプルばっかり作ってないでちゃんと役に立つもの作ればいいのに
2023/03/05(日) 19:19:12.03ID:SCRVkcxh0
>>161
ありがとうごございました。
スカラーで受けるか配列で受けるかにこだわっていました。
あれからもう一つ気付けたのは
Public Sub Sample(Byref Ary() as Class1)
Public Sub Sample(Byref Ary as Class1)
この時に大きな違いが出ました。前者はAry(i).と書くだけでClass1のプロパティメソッド一覧がサジェストしてくれますが、
後者だとVBE的には配列と認識してないのでサジェストしてくれません。
これを決定打として前者の書き方に統一しようと思います。

>>162
8割出来てたソフトをクラスを導入して書き直したら拡張しやすいコードに生まれ変わると信じてトライ中です。
月に数日しか触る時間が取れなくてちっとも進んでないです。
久しぶりに触ると自分が書いたコードさえ複雑すぎて読めないです。
2023/03/05(日) 22:22:28.42ID:dhvwtz5Oa
長くなれば長くなるほど自分のコードってイミフに見えるよね。特に3ヶ月経てば。
2023/03/06(月) 00:54:11.13ID:ai8Q1Y+e0
なにをしてるかしらんけど、クラスを配列にして関数に渡してる段階で
ちょっと設計見直したほうが良いと思うぞ
2023/03/06(月) 00:59:15.55ID:1WgjQ7Bk0
なぜそういったコードが産まれるか?
前任者がそういったやり方をしていたから。
2023/03/06(月) 01:52:26.46ID:PqTDPu/H0
>>165
そうなのですか?
クラスを配列にしているというよりは、配列の中にクラスのインスタンスが入ってるという事なのですが。
例えばA組には生徒が100人います
生徒の遺伝子情報を持つ精子がそれぞれ1億匹います
しかもそれが毎日吐き出されます。
もちろん日別にそのインスタンスは微妙に違います。

まさにそれが配列の中にクラスのインスタンスがある状態かと思ってました。
とても理にかなった行為に思えます。
配列の中にクラスのインスタンスを入れる事は。

クラスはあくまでも階層図なのではないでしょうか。
配列を横の広がりとするなら、クラスは入れ子をする事で深さを表すと思い込んでいます。
5次元配列とかイメージも出来なくてわからないのですが、クラスの入れ子で5層を作るのは案外わかりやすいです。
2023/03/06(月) 03:53:47.03ID:GSPsPwm3M
クラスの配列なら横への広がりのイメージだな
クラスの深さなら継承の概念が必要
本格的なオブジェクト指向言語なら普通に使われるけどなんちゃってオブジェクト指向のVBAでは記述できない
169デフォルトの名無しさん (ワッチョイ 7b19-kCZp)
垢版 |
2023/03/06(月) 07:22:39.83ID:AsR8H3/e0
クラス使うと一挙に視野が広がるよ
ついでを言うと配列の代わりに
コレクションやディクショナリを
使うことも視野に入れるといいと思うよ
2023/03/06(月) 12:27:06.93ID:b2hOsO6/0
VBAもオブジェクト指向できるんか
2023/03/06(月) 12:41:06.98ID:xFg+nzlgM
プロパティ、メソッドなどの概念はオブジェクト指向からの由来
ただし本格的なクラスベースでもプロトタイプベースでもない独自体系の(中途半端な)オブジェクト指向
172デフォルトの名無しさん (アウアウエー Sae3-4fLd)
垢版 |
2023/03/06(月) 13:36:46.14ID:diWxUEyJa
あえて言えば
フォーム指向だな
2023/03/06(月) 14:45:16.86ID:9+J+ARGqM
敢えて言うならフォーム指向というよりコンポーネント指向
excel(Application)、book、worksheetなどすべてのオブジェクトはCOMコンポーネント
フォームもCOMコンポーネントの中のひとつ
2023/03/06(月) 14:57:08.93ID:qrIfb0I6M
>>170
C言語だってできるわ
データ(構造体)とそれを操作する関数を作っていくだけだ
2023/03/06(月) 15:12:57.72ID:ai8Q1Y+e0
>>167
たとえばエクセルブックは複数のワークシートをもってるが、それを配列で管理したりしてないだろ
まあ、VBAはコレクション系が弱いので配列で実装することもままあるがな

>>174
ここで言うオブジェクト指向できるかどうかってのは、
言語側にそのサポート機能がどのくらいあるかって話なんだと思わないかね?

太古のBASICはもとより、VisualBasicも出始めはオブジェクト指向を意識したものではなかったからな
互換性を残しつつオブジェクト指向を取り入れたのでかなり中途半端な出来なのはまあしょうがない
2023/03/06(月) 15:22:06.82ID:g0HnCWe20
リストやマップだって内部では配列使ってるでしょ
2023/03/06(月) 16:30:36.14ID:diWxUEyJa
VBAは糞だから廃止しても良いけど
代替がC#じゃなくてPythonになりかけたのは笑う
2023/03/06(月) 18:31:47.09ID:1WgjQ7Bk0
そういえば結局MSはVBAを完全に廃止はしないんだっけ??
2023/03/06(月) 18:36:58.90ID:dmixHrui0
廃止はされないだろうけど棲み分けされる方向性にある

Office スクリプトと VBA マクロの違い
https://learn.microsoft.com/ja-jp/office/dev/scripts/resources/vba-differences
180デフォルトの名無しさん (ワッチョイ 7b19-kCZp)
垢版 |
2023/03/06(月) 18:42:11.32ID:AsR8H3/e0
VBAのクラスは中途半端と言えばまぁそうだけど
VB.Net、おいてはC#とかをやる際の
練習には・・・いや、ちょっと厳しいか

でもObject指向言語いきなり入ると
継承ばっかに目が行って
移譲が疎かになったりするから
まぁいいんじゃないかな
2023/03/06(月) 21:16:37.56ID:1WgjQ7Bk0
やっぱ昔ながらのVBAがいちばんしっくりくるわ。
2023/03/07(火) 21:48:06.79ID:3iqfWDhi0
やっぱ昔ながらのBBAがいちばんしっくりくるよね
2023/03/07(火) 23:24:56.52ID:Rx98WF270
いや、BBAは55までが限界だわ。
2023/03/09(木) 18:56:56.85ID:P+HJFtzc0
ところでBBAの手前の年齢なら何て呼ぶ?
2023/03/10(金) 03:06:29.10ID:iWPdLzMM0
>>184
おばさま
2023/03/10(金) 12:22:39.19ID:bedhQt/D0
ちなみにお前らは おじさんやおっさん って呼ばれてもおかしくない年齢だよな?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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