Excel VBA 質問スレ Part62

■ このスレッドは過去ログ倉庫に格納されています
1
垢版 |
2019/06/24(月) 00:21:37.48
!extend:checked:vvvvv:1000:512

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

※前スレ
Excel VBA 質問スレ Part61
http://mevius.5ch.net/test/read.cgi/tech/1556203263/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/07/13(土) 09:05:56.81ID:BcXUPH3s0
まだやってんのかよ
こんなとこ覗いてる暇があったらExcel勉強しろよバカなんだから
2019/07/13(土) 09:15:07.93ID:CdxTXa9P0
もう諦めてその単位落とした方が自分の為まである
333デフォルトの名無しさん (ワッチョイ db8e-RA7T)
垢版 |
2019/07/13(土) 10:27:47.26ID:BOO56W8H0
>>330
こんな馬鹿に回答を示すやつが馬鹿だろ
334デフォルトの名無しさん (スッップ Sdba-oxAJ)
垢版 |
2019/07/13(土) 10:33:21.62ID:/hcsiiwtd
>>333
反応するお前も馬
2019/07/13(土) 10:53:53.05ID:YgFAo0DCd
これだからスレの使い分けをしないやつらは迷惑なんだ…
2019/07/13(土) 11:14:10.76ID:Z2RRNc9B0
>>327
俺も複合参照って呼び名は知らんかったわ
2019/07/13(土) 11:30:50.83ID:4ZkgUc3hM
とりあえず問題画像を拡散して学校名とクラス辺りから特定してみようか
3連休のくだらない遊びとして
2019/07/13(土) 13:32:22.46ID:WjcplQ3r0
これまで発掘された投稿(日付順)
ttps://mevius.5ch.net/test/read.cgi/bsoft/1556754363/731-
>>263
ttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12210409122
ttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10210410850
ttp://www.excel.studio-kazu.jp/kw/20190711212238.html

ttps://mevius.5ch.net/test/read.cgi/bsoft/1556754363/806,809
>期日までに全て正解した状態で完了しないと出席足りてても単位にならない
>期日は7/24 1,2回しか提出チャンスはない
→通信制あるいは定時制?

ttps://gyazo.com/1c48e5087536c8b403b6f8ef9131b00c
>2019情報処理R4-5
2019/07/13(土) 13:34:16.06ID:WjcplQ3r0
抜けてた。エクセルの学校より
>たかが高校の宿題程度です
2019/07/13(土) 14:19:52.14ID:gczMvB9Ad
なんか手当たり次第だな
しかも行く先々で自己中で上からだし、根っからそういう性格なんだな…
こんな事で時間浪費するより先生に聞くなり泣きつくなりした方が早いのに
2019/07/13(土) 14:22:32.54ID:mP3nVFr50
twitterあたりなら誰かがすぐ答えてくれるんじゃないのかな
なんで5chにこだわるのか
2019/07/13(土) 14:26:22.66ID:uYMBN7vuM
そりゃ釣りがいがあるからさ
2019/07/13(土) 14:29:12.24ID:VRwhUdyYM
あの調子じゃどうせこの先の人生ハードモードだから放っておけばいい
親と教師はご苦労なことで
2019/07/13(土) 14:31:09.05ID:eZhaymGYx
特定を恐れただけじゃね
5chの専門板ならリスクが低いと思ったんだろ
2019/07/13(土) 15:02:49.54ID:xMkRt+rF0
もうやめたれ
vbaの質問スレにvbaなんか使わないこと質問してる程度のやつなんだぞ、、、
2019/07/13(土) 17:48:23.12ID:j8mJqYZga
ゴミのせいでdat落ちした
2019/07/13(土) 21:14:04.44ID:hOcuJYrL0
へー、日本の学校では複合参照って呼ぶのかw
2019/07/13(土) 21:22:53.61ID:MFeSB4Ik0
「列を絶対参照」とか言ってたな
厳密に言うと間違ってたんかね〜
349デフォルトの名無しさん (ワッチョイ 768c-MWwc)
垢版 |
2019/07/13(土) 21:27:18.14ID:TftDpSrJ0
Microsoftが言ってるんだから他の呼び方はできんだろ
https://support.office.com/ja-jp/article/-dfec08cd-ae65-4f56-839e-5f0d8d0baca9
2019/07/13(土) 21:39:49.47ID:MFeSB4Ik0
A$1 (相対参照列と絶対参照行)
あぁやっぱりこう呼ぶのか
じゃないと区別つかなくて不便だろう
2019/07/13(土) 21:39:56.15ID:9cyGSVwA0
列を絶対参照はまさにそういう意味で
複合参照と言っているものと意味の範囲が異なる
だから勝手に名前つけて呼んでもセーフ
2019/07/13(土) 22:13:07.08ID:K15oVfEY0
>>349
英語ではmixed referenceだから混合参照の方がまだマシな気がする
353デフォルトの名無しさん (ワッチョイ dbf1-Xwip)
垢版 |
2019/07/15(月) 12:11:27.76ID:nnQ6IJ0T0
VBAでクラスのメンバに配列がpublicで宣言できないのです。
これはなぜですか?
privateならできるようです
そういう仕様になった背景に異常に興味があるのですがなぜでしょうか?
2019/07/15(月) 12:19:29.86ID:MveVqmrw0
>>353
不思議だし理由はよくわからん
VariantをReDimして使うしかなさそうだ
355デフォルトの名無しさん (ワッチョイ dbf1-Xwip)
垢版 |
2019/07/15(月) 12:29:52.78ID:nnQ6IJ0T0
>>354
いやgetter, setterのPublic Functionを作って使った
2019/07/15(月) 14:13:53.52ID:Y2KwLYuBM
>>355
それだとコピーになっちゃわない?
357デフォルトの名無しさん (ワッチョイ dbf1-Xwip)
垢版 |
2019/07/15(月) 14:16:26.74ID:nnQ6IJ0T0
>>356

問題ないわよ
2019/07/15(月) 14:43:41.95ID:pIjNztNi0
>>353
しらなかった
https://i.imgur.com/Rzt8c7Q.png

VB.NETではできる様になっているので特にバッティングする要素などはないはず
多分何も考えずに作ったか、スペックの低いPC時代に何かバグがあったか
2019/07/15(月) 15:17:00.78ID:RV+E0P730
なにがなんでもユーザーにオブジェクトをカプセル化させたかったんだろう

MSはユーザーを誘導しようとして変な仕様を盛り込むのをよくやる
360デフォルトの名無しさん (ワッチョイ 768c-MWwc)
垢版 |
2019/07/15(月) 15:26:05.00ID:X93O9hPp0
https://pbs.twimg.com/media/D_edPTAU4AEYvVl.jpg:orig
2019/07/15(月) 15:58:16.17ID:pIjNztNi0
>>359
配列だけだからそれはない
別の事情があったか、単にミスだと思う
2019/07/15(月) 16:08:05.51ID:kvSb4Xi+x
>>358
この謎仕様と、引数付きコンストラクタを定義できない欠陥仕様がVBAのクラスモジュールの使い勝手を異常に悪くしてるよな
2019/07/15(月) 18:12:34.65ID:MveVqmrw0
>>357
小さければまあ
2019/07/15(月) 18:36:40.48ID:GvqRptrx0
VBAできたのOffice95だろ?
16bitに毛が生えたようなリソースで配列なんて便利なもん公開したら
アホが無駄遣いしてクレームが殺到するからだろうな
2019/07/15(月) 19:30:49.08ID:ex33LrHm0
>>364
> VBAできたのOffice95だろ?
Excel だけは先行しててExcel 5.0から
Office 95からWordとかAccessにも搭載された
> 16bitに毛が生えたようなリソースで
配列は32KB制限とかあるからリソース関係って言うのはあり得ると思う
2019/07/15(月) 20:03:59.10ID:+RJOjipn0
まぁVB含めてなんでこんな糞仕様やねん
てのは歴史的理由が大半なので深く考えてもしょうがないぞ
2019/07/15(月) 21:26:18.84ID:RV+E0P730
比較演算子の全項評価されるのまいった
一貫性があるといえばそうだがものすごく使いづらい

Excel VBAこそ関数型言語使うべきだったとおもう
2019/07/15(月) 21:34:48.93ID:P4vPK//00
Sub Sample()
Dim rng As Range, i As Integer, RangeArea As String, RowCount As Integer
RangeArea = InputBox("選択したいセル範囲を入力してください", "セル範囲入力")
Range(RangeArea).Select
i = 1
For Each rng In Selection
rng.Value = i
i = i + 1
Next rng
RowCount = Selection.Rows.Count
Selection.Copy
Selection(Selection.Rows.Count, 1).Offset(2).Select
Selection.PasteSpecial xlPasteAll, Transpose:=True
Application.CutCopyMode = False
End Sub



このコードの最初の部分のセル範囲を選択するところをapplication.inputboxに変更したいのですが、やり方がわかりません。どうかご教示ください。
2019/07/15(月) 21:46:33.77ID:pIjNztNi0
>>368
これで普通に動いたんだが

Sub Sample()
Dim rng As Range, i As Integer, RangeArea As String, RowCount As Integer
RangeArea = Application.InputBox("選択したいセル範囲を入力してください", "セル範囲入力")
Range(RangeArea).Select
i = 1
For Each rng In Selection
rng.Value = i
i = i + 1
Next rng
RowCount = Selection.Rows.Count
Selection.Copy
Selection(Selection.Rows.Count, 1).Offset(2).Select
Selection.PasteSpecial xlPasteAll, Transpose:=True
Application.CutCopyMode = False
End Sub
2019/07/15(月) 21:46:46.43ID:pIjNztNi0
変更したのは産業目だけね
2019/07/15(月) 21:49:39.76ID:8d+rlpP70
今北産業
2019/07/16(火) 01:35:56.38ID:R1s3VXbP0
>>369
ありがとうございました
2019/07/16(火) 14:39:56.14ID:OkBSeMU90
VBAのクラスでPublicな変数とか少しびっくり。
正直意味不明だわ。
普通はプロパティー作るんじゃ無いの?
2019/07/16(火) 15:28:36.24ID:7VziDFZHM
面倒だから、自分用はほとんど変数だな
2019/07/16(火) 15:44:34.61ID:2g+hTYUtM
>>373
まんまGetとSetを用意しといて「Public変数じゃない、カプセル化してます」と言う愚かな奴はいるかも知れない。
いや、流石にいないか
2019/07/16(火) 17:18:56.27ID:OkBSeMU90
>>375
えっ?
カプセル化してますなんて言わんがGETとLET用意するよ。まんまでも。
感覚として自然に。
自分はプロパティーはプロパティーと呼ぶしPublic変数とは言わないね。
2019/07/16(火) 19:15:49.24ID:2g+hTYUtM
>>376
プロパティが変数に直接紐付いているとは限らないから一概には言えないけれど
Public 変数が適している場合はPublicとして晒すさ。
2019/07/16(火) 19:26:46.13ID:Qwm6v/XnM
>>376
クラスがある変数を持ってたとして、
直接GetとLet用意することは少ないしPublicにするのは更に稀だ

一応念のため断っておく
2019/07/16(火) 19:47:18.06ID:OkBSeMU90
>>378
だから変数じゃないし。
プロパティーだし。
クラスがpublicな変数持ってるという考えが既に変に感じる。
勿論、内部にprivateな変数を持ってるのは当然だけど。

カプセル化等という言葉では無く(実際はその通りだけど)、感覚としてオブジェクトというものを捉えていれば普通の感覚。
2019/07/16(火) 19:48:58.07ID:OkBSeMU90
>>377
プロパティーは変数という感覚と違う。
2019/07/16(火) 20:04:05.57ID:Qwm6v/XnM
>>379
同じだなんて言ってないでしょ?

> クラスがpublicな変数持ってるという考えが既に変に感じる。

なんで??
勝手に触っちゃダメとか変更に弱くなるいうのはわかるが、それ以外の理由を持ってるみたいだね?
2019/07/16(火) 20:20:17.00ID:OkBSeMU90
>>381
カプセル化と結局一緒だけど、オブジェクト志向的に自然な考えからするとpublicな変数というのが変。
オブジェクトに意味のない数値がくっ付いてるイメージだね。

Excelでいうとセルに何故か変数がくっ付いていて、それがセルに関わるValueとかLeftとかそういう"意味付け"も持っていない感じ。
2019/07/16(火) 20:23:52.51ID:OkBSeMU90
クラスというのはオブジェクトを設計するわけだから意味の無いものをくっ付けるのは設計として違和感がある。
そして、意味が有るものはプロパティーとして設計するから自然にGET、LETを使ってた。
2019/07/16(火) 20:24:21.96ID:lW4DFx/50
>>373
そもそもvbaでクラスを作る事は本当にない
ブックがpublicみたいに見えるから今更privateとかにしても仕方ない

実際はprivateブックの下位に書いてるからpublicに見えるだけなんだろうけど、まぁ同じ
2019/07/16(火) 20:55:06.36ID:aLWtzg+T0
>>383
それも意味分からんわ
意味ないものをくっつけるってなんのこっちゃ?
2019/07/16(火) 21:09:04.93ID:B8vpu2Gm0
>>385
うまい言葉が見つからんが、ようは「宗教観の違い」ってやつじゃないか?
たぶん>>383の言いたいこととしては、
「プロパティにアクセスしてGetなりLetなりSetなりできるのに、
 この上Publicにして外部モジュールからメンバ変数への直接参照を可能にする意味があるのか?(設計おかしくね?)」
みたいな感じじゃないかなと思う。
2019/07/16(火) 21:36:49.17ID:5NJAvtdh0
着エロでおまんこクパァしたら萎えるだろ

そういうこと
2019/07/16(火) 22:12:37.21ID:osN3S5RL0
>>386
むしろGetもLetもできるならPublic変数でよくね?
2019/07/16(火) 22:55:41.34ID:B8vpu2Gm0
>>388
>GetもLetもできるならPublic変数でよくね?
そういうところが「宗教観の違い」なんだろうと思ったわけで。
>>383がこう思ってるんじゃないかなと思って書いただけだから、実際言いたいことは違うかもしれんし。
2019/07/16(火) 23:12:50.48ID:aLWtzg+T0
その宗教も生まれてから長い年月が経ったものだなあ
2019/07/17(水) 10:35:34.00ID:Zgptnqk10
VBAが悪いとかVBが悪いとか宗教とか別スレ立ててやれよ
どうでもいいわ(笑)
2019/07/17(水) 20:13:41.88ID:1fZng5Go0
>>391
あんまりよくない
他言語・複数開発の常識を鵜呑みにしてvbaに持ち込むとめんどくさくなるだけだぞ
2019/07/17(水) 20:57:20.47ID:LEfiTxxf0
それはもうその人がアレなだけでしょ
2019/07/17(水) 21:54:24.06ID:1fZng5Go0
程々が一番なんだけど、vbaに至ってはその采配がマジで難しい
普通は使い勝手の悪い言語は全自動で廃れるけど、恐らく唯一無二で太古の使い勝手のまま広まってしまった言語
どうしても荒れると思うし、正解もない
2019/07/18(木) 11:35:34.82ID:SjGJ8Hso0
>>1
スレタイに戻れよ
>ExcelのVBAに関する質問スレです
>コード書き込みや作成依頼もOK
2019/07/18(木) 17:21:20.08ID:pDSkjMbHd
Worksheet_SelectionChangeイベントを使って選択されたセルがColumns(20)を超えて選択された場合に選択を19までに戻したいんですけどコードを教えて下さい。
2019/07/18(木) 17:29:18.97ID:iWlQ47rb0
application.enableEvents = false
if selection.column > 20 then
selection.resize(selection.row,19).select
end if
application.enableEvents = true
398デフォルトの名無しさん (ワッチョイ fff7-ShKg)
垢版 |
2019/07/18(木) 17:33:44.07ID:iWlQ47rb0
まちがえた
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

With Selection
If .Columns.Count >= 20 Then
Excel.Application.EnableEvents = False
.Resize(.Rows.Count, 19).Select
Excel.Application.EnableEvents = True
End If
End With

End Sub
2019/07/18(木) 17:44:11.00ID:iWlQ47rb0
enableEvents操作いらんかったわ
2019/07/18(木) 17:48:00.14ID:pDSkjMbHd
>>398
早い返信ありがとうございます。
コードありがとうございます。

これって例えば選択したセルが30から60と選択された場合ってエラーですか?
2019/07/18(木) 18:52:19.99ID:iWlQ47rb0
いや、
30〜60列目までの範囲が選択されたら
30〜48列目が選択された状態に変える
要望内容を捕らえ違えたかな?
402デフォルトの名無しさん (ワッチョイ fff7-ShKg)
垢版 |
2019/07/18(木) 20:19:45.62ID:iWlQ47rb0
もし19列目(T列)移行を選択しないようにするって意味なら以下
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ActCel As Excel.Range
Set ActCel = ActiveCell
With ActCel
If .Column >= 20 Then
Set ActCel = Cells(.Row, 19)
End If
End With
Dim cngRng As Excel.Range
With Target
If .Column > 20 Then
Set cngRng = Range(Cells(.Row, 19), Cells(.Row + .Rows.Count - 1, 19))
ElseIf .Column + .Columns.Count > 20 Then
Set cngRng = Range(Cells(.Row, .Column), Cells(.Row + .Rows.Count - 1, 19))
End If
End With
Excel.Application.ScreenUpdating = False
Excel.Application.EnableEvents = False
If Not cngRng Is Nothing Then
cngRng.Select
ActCel.Activate
End If
Excel.Application.EnableEvents = True
Excel.Application.ScreenUpdating = True
End Sub
403デフォルトの名無しさん (ワッチョイ 4f91-9KOF)
垢版 |
2019/07/18(木) 21:09:01.60ID:Vm+OSKMy0
’こんな感じじゃなくて?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim rng As Range
  Set rng = Intersect(Columns("A:T"), Target) '20まで
  If Not rng Is Nothing Then
    rng.Select
  Else
    Cells(1, 1).Select 'エラー時A1を選択
  End If

End Sub
2019/07/19(金) 22:28:50.87ID:/2THaakJ0
行が削除された。行が挿入されたを認識したいんですがなんか方法ありませんか?
2019/07/19(金) 22:43:18.81ID:TvxEimVQ0
>>404
別シートから認識したいシートを参照しておき、参照先が変わったら認識とか
めんどくさすぎるか
2019/07/20(土) 02:29:28.36ID:mZk+4Ek40
>>404
WithEventsの変数2つ作って行削除行挿入のコントロールを入れておいてclickイベントで弄る
407デフォルトの名無しさん (ワッチョイ 3f8a-8mHW)
垢版 |
2019/07/20(土) 05:25:11.57ID:TdLuYGU30
どんな状況で使うんだそれwww
勝手に削除するやつがいるのか?
2019/07/20(土) 06:34:43.57ID:dpChKN8u0
おるぞ・・・
2019/07/20(土) 07:37:09.15ID:vf/4Yo8ld
Worksheet_Changeイベント内で

if Target.Columns.Count=Columns.Count Then

の中に、コピーされた時を想定してデータを貼り付けた時に特定のセルを消してます。

このイベントは行削除も行挿入もif中に入ってくるので、その2つの場合は除きたいんですけど、無理ですかね?
2019/07/20(土) 09:00:22.03ID:FGTvlN9C0
素直にシート保護するんじゃダメなの?
2019/07/20(土) 13:12:04.73ID:M28zss090
>>409
その条件を別の方法に変えたら?
貼り付けのイベントを拾うとか。
2019/07/20(土) 14:06:46.24ID:yIzn2tUG0
>>404
でけたっぽいが、あらゆる使用状況でテストしたわけではないよ

Dim Sel As Range

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 Set Sel = Target
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error GoTo GoErr
 If Target.Row = Sel.Row Then
  Debug.Print "変更"
 Else
  Debug.Print "挿入"
 End If
 Exit Sub
GoErr:
 Debug.Print "削除"
End Sub
2019/07/20(土) 14:13:01.97ID:yIzn2tUG0
別途配列にも代入しとけば、削除に反応してSQLのDELETE文の発行にも使えるね
そんなことやったような記憶
あんまりお洒落なことすると、ハマる恐れもあるが
2019/07/21(日) 01:34:22.11ID:jI92lOqS0
挿入ってなんかエロいな
2019/07/21(日) 08:59:00.32ID:8zHzQ0Ul0
じゃあ insertと言い直せ
2019/07/21(日) 09:15:07.24ID:tbU/thR+0
oh,yes
2019/07/21(日) 11:12:02.68ID:4aIgjVvla
「VBA StringBuilder」とかでググって出てくるコードの例(具体的にはhttps://qiita.com/e-katayama/items/8a114357b0df91cfbdbbなど)をベースに、特定の変換をかけた文字列を高速に連結する方法を考えてるんだが、
Midステートメントを使った置換そのものは早いんだが、クラス化すると処理全体としては&演算子を使った連結の方がなぜか早くなる。
可能な限り文字列型への代入は避けてるし、引数もByRefにしてるんだが、イマイチ原因がピンとこない。
StrPtrでm_bufferのポインタを確認すると、クラス内から見ればポインタはずっと同じだが、
呼び出してる外部モジュール側から確認すると、AppendやToStringとかのメソッドを呼び出す度に2つのアドレスを行き来してる。
これは自分のやり方が悪いんだろうか?
2019/07/21(日) 11:14:15.04ID:tbU/thR+0
コード晒してくれればボトルネックになってるとこを見つけれるかも
今日暇だからやってみるぞ
2019/07/21(日) 11:41:51.53ID:wqzeAX+60
>>413
配列に対してDelete出来るの?

>>417
どうやってるのか知らんけど、
ループ内でProperty Get使ったら、物凄く遅くなって、
やっぱ俺2次元配列でいいわwwwwってなったことはある。
2019/07/21(日) 12:13:56.99ID:yJjnZgJg0
>>419
まあ、自分の書いたコードなんて単なる設定
利用したルーチンがほぼほぼお仕事する
何を使うかで1万倍ぐらい違うこともあるだろ(笑)
2019/07/21(日) 12:18:26.68ID:yJjnZgJg0
あと、画面更新の負荷はものすごい大きいよな
2019/07/21(日) 12:44:29.43ID:/atv33Bt0
>>419
> 配列に対してDelete出来るの?
配列と比較してシート側の削除を検出するってことじゃないかな
2019/07/21(日) 13:53:33.71ID:jI92lOqS0
デリケートにやるんだ
2019/07/21(日) 14:18:30.41ID:4aIgjVvla
>>418
ありがたいが、今ぱっと出せるのがクラス部分ぐらいしかない・・・
(StringBuilder.cls)Option Explicit
Private sBuf As String
Private iBuf As Long
Public Sub Initialize(ByRef tSize As Long)
  sBuf = String$(tSize, vbNullChar)
  iBuf = 0
End Sub
Public Sub Append(ByRef sValue As String)
  If iBuf + Len(sValue) > Len(sBuf) Then sBuf = sBuf & String$(Len(sBuf) * 2 + Len(sValue), vbNullChar)
  Mid(sBuf, iBuf + 1) = sValue
  iBuf = iBuf + Len(sValue)
End Sub
Public Function ToString() As String
  ToString = Left$(sBuf, iBuf)
End Function
https://excel-ubara.com/excelvba4/EXCEL271.html
のに少し手を加えただけなんだが(class_initializeでなく、呼び出し側が必ずinitializeを呼び出してサイズを決めるようにした)。
呼び出し側のコードが今手元になくて夜中までちょっと無理なんだが、やってる中身は、
Set objStringBuilder=New StringBuilder
Call objStringBuilder.Initialize(CONST_SIZE)
For i=1 To Len(srcStr)
Call objStringBuilder.Append(convertFunction(Mid$(srcStr,i,1)))
Next i
Let MainFunction=objStringBuilder.ToString
みたいな感じ。実際はもうちょい複雑だが、&使う方はここが
For i=1 To Len(srcStr)
Let MainFunction=MainFunction&convertFunction(Mid$(srcStr,i,1))
Next i
になってる、ぐらいなもん。
やっぱ、文字列型変数の評価回数が多いせいなんだろうか?
2019/07/21(日) 14:22:28.88ID:4aIgjVvla
行数制限でギュウギュウになってしまった。ごめん。
あと呼び出し側もOption Explicitつけてるので。一応。
2019/07/21(日) 16:35:43.80ID:YTBWsrAX0
>>422
そゆこと
説明不足だった
SQLの発行というのは、SQL Server等の外部DBに対して
427デフォルトの名無しさん (ワッチョイ 8f8e-DngZ)
垢版 |
2019/07/21(日) 16:44:43.49ID:zVh3KjUp0
全角文字で書くような馬鹿の後出し言い訳か
2019/07/21(日) 17:18:46.36ID:YTBWsrAX0
なぜかちょうど今やってることと2連続で関係してる
DB編集画面は結局フラグ式にしたけど
自分用なので、ユーザーフレンドリーより処理の単純さと自分的な分かりやすさを取った

文字列連結も改めて整理しようとしてたところ
Midは固定なら速いが、可変だと遅い
■100文字を10万回連結
・固定: 1000万字確保: 0.08秒
・固定: 5億字確保: 2.5秒 (20億字はSpace関数が駄目だった)
・可変: 2万字ずつ拡張: 3.3秒
1000万字だって十分あり得ないし、なんなら2万字でも、実際に拡張する場面はないとは思う

でも心理的にわだかまりが残る
可変の配列は0.3秒だった (ReDim Preserveで後ろへ後ろへ追加、最後にJoin)
ほどほどの固定の超速を取るか、可変の高速を取るか
これも逆に、あり得ない規模でも0.3秒、困る場面はあり得ない
2019/07/21(日) 17:23:37.68ID:YTBWsrAX0
い、言い訳?逆に配列をSQLで操作する方法を知らん
2019/07/21(日) 17:51:10.98ID:tbU/thR+0
>>424
cで言うint left() と string left()を比較してみた
left$()の方が早い、これは予想外だったな

Sub foo()

Debug.Print "str: " & Time()
a = Time()
For i = 1 To 10000000
ToString = Left$("aaaaaaaaab", 1)
Next
Debug.Print "str: " & a - Time()

Debug.Print "int?: " & Time()
a = Time()
For i = 1 To 10000000
ToString = Left("aaaaaaaaab", 1)
Next
Debug.Print "int?: " & a - Time()

End Sub

後は文字列評価だけど、どこが必要でどこが不要かは分からないので何とも言えない
全体見ればどこで最適化したいか分かるかもしれない。後はどれぐらい減らしたいか
一日一回のマクロを10秒→1秒に減らしたいってなら寝る
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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