!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
探検
Excel VBA 質問スレ Part62
■ このスレッドは過去ログ倉庫に格納されています
1
2019/06/24(月) 00:21:37.48356デフォルトの名無しさん (ブーイモ MMba-D7xh)
2019/07/15(月) 14:13:53.52ID:Y2KwLYuBM >>355
それだとコピーになっちゃわない?
それだとコピーになっちゃわない?
357デフォルトの名無しさん (ワッチョイ dbf1-Xwip)
2019/07/15(月) 14:16:26.74ID:nnQ6IJ0T0358デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/15(月) 14:43:41.95ID:pIjNztNi0 >>353
しらなかった
https://i.imgur.com/Rzt8c7Q.png
VB.NETではできる様になっているので特にバッティングする要素などはないはず
多分何も考えずに作ったか、スペックの低いPC時代に何かバグがあったか
しらなかった
https://i.imgur.com/Rzt8c7Q.png
VB.NETではできる様になっているので特にバッティングする要素などはないはず
多分何も考えずに作ったか、スペックの低いPC時代に何かバグがあったか
359デフォルトの名無しさん (ワッチョイ 1763-q5pO)
2019/07/15(月) 15:17:00.78ID:RV+E0P730 なにがなんでもユーザーにオブジェクトをカプセル化させたかったんだろう
MSはユーザーを誘導しようとして変な仕様を盛り込むのをよくやる
MSはユーザーを誘導しようとして変な仕様を盛り込むのをよくやる
360デフォルトの名無しさん (ワッチョイ 768c-MWwc)
2019/07/15(月) 15:26:05.00ID:X93O9hPp0361デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/15(月) 15:58:16.17ID:pIjNztNi0362デフォルトの名無しさん (アークセー Sx3b-zMMC)
2019/07/15(月) 16:08:05.51ID:kvSb4Xi+x >>358
この謎仕様と、引数付きコンストラクタを定義できない欠陥仕様がVBAのクラスモジュールの使い勝手を異常に悪くしてるよな
この謎仕様と、引数付きコンストラクタを定義できない欠陥仕様がVBAのクラスモジュールの使い勝手を異常に悪くしてるよな
363デフォルトの名無しさん (ワッチョイ 768c-D7xh)
2019/07/15(月) 18:12:34.65ID:MveVqmrw0 >>357
小さければまあ
小さければまあ
364デフォルトの名無しさん (ワッチョイ 57e6-P44A)
2019/07/15(月) 18:36:40.48ID:GvqRptrx0 VBAできたのOffice95だろ?
16bitに毛が生えたようなリソースで配列なんて便利なもん公開したら
アホが無駄遣いしてクレームが殺到するからだろうな
16bitに毛が生えたようなリソースで配列なんて便利なもん公開したら
アホが無駄遣いしてクレームが殺到するからだろうな
365デフォルトの名無しさん (ワッチョイ 9a01-DHp5)
2019/07/15(月) 19:30:49.08ID:ex33LrHm0 >>364
> VBAできたのOffice95だろ?
Excel だけは先行しててExcel 5.0から
Office 95からWordとかAccessにも搭載された
> 16bitに毛が生えたようなリソースで
配列は32KB制限とかあるからリソース関係って言うのはあり得ると思う
> VBAできたのOffice95だろ?
Excel だけは先行しててExcel 5.0から
Office 95からWordとかAccessにも搭載された
> 16bitに毛が生えたようなリソースで
配列は32KB制限とかあるからリソース関係って言うのはあり得ると思う
366デフォルトの名無しさん (ワッチョイ 3694-FGXC)
2019/07/15(月) 20:03:59.10ID:+RJOjipn0 まぁVB含めてなんでこんな糞仕様やねん
てのは歴史的理由が大半なので深く考えてもしょうがないぞ
てのは歴史的理由が大半なので深く考えてもしょうがないぞ
367デフォルトの名無しさん (ワッチョイ 1763-q5pO)
2019/07/15(月) 21:26:18.84ID:RV+E0P730 比較演算子の全項評価されるのまいった
一貫性があるといえばそうだがものすごく使いづらい
Excel VBAこそ関数型言語使うべきだったとおもう
一貫性があるといえばそうだがものすごく使いづらい
Excel VBAこそ関数型言語使うべきだったとおもう
368デフォルトの名無しさん (ワッチョイ 0b01-YggF)
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に変更したいのですが、やり方がわかりません。どうかご教示ください。
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に変更したいのですが、やり方がわかりません。どうかご教示ください。
369デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
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
これで普通に動いたんだが
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
370デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/15(月) 21:46:46.43ID:pIjNztNi0 変更したのは産業目だけね
371デフォルトの名無しさん (ワッチョイ ffce-AvHN)
2019/07/15(月) 21:49:39.76ID:8d+rlpP70 今北産業
372デフォルトの名無しさん (ワッチョイ 0b01-YggF)
2019/07/16(火) 01:35:56.38ID:R1s3VXbP0 >>369
ありがとうございました
ありがとうございました
373デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 14:39:56.14ID:OkBSeMU90 VBAのクラスでPublicな変数とか少しびっくり。
正直意味不明だわ。
普通はプロパティー作るんじゃ無いの?
正直意味不明だわ。
普通はプロパティー作るんじゃ無いの?
374デフォルトの名無しさん (オイコラミネオ MM63-LPET)
2019/07/16(火) 15:28:36.24ID:7VziDFZHM 面倒だから、自分用はほとんど変数だな
375デフォルトの名無しさん (ブーイモ MMba-D7xh)
2019/07/16(火) 15:44:34.61ID:2g+hTYUtM376デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 17:18:56.27ID:OkBSeMU90377デフォルトの名無しさん (ブーイモ MMba-D7xh)
2019/07/16(火) 19:15:49.24ID:2g+hTYUtM378デフォルトの名無しさん (ブーイモ MMff-D7xh)
2019/07/16(火) 19:26:46.13ID:Qwm6v/XnM379デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 19:47:18.06ID:OkBSeMU90 >>378
だから変数じゃないし。
プロパティーだし。
クラスがpublicな変数持ってるという考えが既に変に感じる。
勿論、内部にprivateな変数を持ってるのは当然だけど。
カプセル化等という言葉では無く(実際はその通りだけど)、感覚としてオブジェクトというものを捉えていれば普通の感覚。
だから変数じゃないし。
プロパティーだし。
クラスがpublicな変数持ってるという考えが既に変に感じる。
勿論、内部にprivateな変数を持ってるのは当然だけど。
カプセル化等という言葉では無く(実際はその通りだけど)、感覚としてオブジェクトというものを捉えていれば普通の感覚。
380デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 19:48:58.07ID:OkBSeMU90 >>377
プロパティーは変数という感覚と違う。
プロパティーは変数という感覚と違う。
381デフォルトの名無しさん (ブーイモ MMff-D7xh)
2019/07/16(火) 20:04:05.57ID:Qwm6v/XnM >>379
同じだなんて言ってないでしょ?
> クラスがpublicな変数持ってるという考えが既に変に感じる。
なんで??
勝手に触っちゃダメとか変更に弱くなるいうのはわかるが、それ以外の理由を持ってるみたいだね?
同じだなんて言ってないでしょ?
> クラスがpublicな変数持ってるという考えが既に変に感じる。
なんで??
勝手に触っちゃダメとか変更に弱くなるいうのはわかるが、それ以外の理由を持ってるみたいだね?
382デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 20:20:17.00ID:OkBSeMU90 >>381
カプセル化と結局一緒だけど、オブジェクト志向的に自然な考えからするとpublicな変数というのが変。
オブジェクトに意味のない数値がくっ付いてるイメージだね。
Excelでいうとセルに何故か変数がくっ付いていて、それがセルに関わるValueとかLeftとかそういう"意味付け"も持っていない感じ。
カプセル化と結局一緒だけど、オブジェクト志向的に自然な考えからするとpublicな変数というのが変。
オブジェクトに意味のない数値がくっ付いてるイメージだね。
Excelでいうとセルに何故か変数がくっ付いていて、それがセルに関わるValueとかLeftとかそういう"意味付け"も持っていない感じ。
383デフォルトの名無しさん (ワッチョイ 1791-ipzv)
2019/07/16(火) 20:23:52.51ID:OkBSeMU90 クラスというのはオブジェクトを設計するわけだから意味の無いものをくっ付けるのは設計として違和感がある。
そして、意味が有るものはプロパティーとして設計するから自然にGET、LETを使ってた。
そして、意味が有るものはプロパティーとして設計するから自然にGET、LETを使ってた。
384デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/16(火) 20:24:21.96ID:lW4DFx/50 >>373
そもそもvbaでクラスを作る事は本当にない
ブックがpublicみたいに見えるから今更privateとかにしても仕方ない
実際はprivateブックの下位に書いてるからpublicに見えるだけなんだろうけど、まぁ同じ
そもそもvbaでクラスを作る事は本当にない
ブックがpublicみたいに見えるから今更privateとかにしても仕方ない
実際はprivateブックの下位に書いてるからpublicに見えるだけなんだろうけど、まぁ同じ
385デフォルトの名無しさん (ワッチョイ 768c-D7xh)
2019/07/16(火) 20:55:06.36ID:aLWtzg+T0386デフォルトの名無しさん (ワッチョイ dbd0-qIdb)
2019/07/16(火) 21:09:04.93ID:B8vpu2Gm0387デフォルトの名無しさん (ワッチョイ 57e6-P44A)
2019/07/16(火) 21:36:49.17ID:5NJAvtdh0 着エロでおまんこクパァしたら萎えるだろ
そういうこと
そういうこと
388デフォルトの名無しさん (ワッチョイ 9a01-DHp5)
2019/07/16(火) 22:12:37.21ID:osN3S5RL0 >>386
むしろGetもLetもできるならPublic変数でよくね?
むしろGetもLetもできるならPublic変数でよくね?
389デフォルトの名無しさん (ワッチョイ dbd0-qIdb)
2019/07/16(火) 22:55:41.34ID:B8vpu2Gm0390デフォルトの名無しさん (ワッチョイ 768c-D7xh)
2019/07/16(火) 23:12:50.48ID:aLWtzg+T0 その宗教も生まれてから長い年月が経ったものだなあ
391デフォルトの名無しさん (ワッチョイ 47f9-i8Xk)
2019/07/17(水) 10:35:34.00ID:Zgptnqk10 VBAが悪いとかVBが悪いとか宗教とか別スレ立ててやれよ
どうでもいいわ(笑)
どうでもいいわ(笑)
392デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/17(水) 20:13:41.88ID:1fZng5Go0393デフォルトの名無しさん (ワッチョイ b633-MLMy)
2019/07/17(水) 20:57:20.47ID:LEfiTxxf0 それはもうその人がアレなだけでしょ
394デフォルトの名無しさん (ワッチョイ 0e68-AvHN)
2019/07/17(水) 21:54:24.06ID:1fZng5Go0 程々が一番なんだけど、vbaに至ってはその采配がマジで難しい
普通は使い勝手の悪い言語は全自動で廃れるけど、恐らく唯一無二で太古の使い勝手のまま広まってしまった言語
どうしても荒れると思うし、正解もない
普通は使い勝手の悪い言語は全自動で廃れるけど、恐らく唯一無二で太古の使い勝手のまま広まってしまった言語
どうしても荒れると思うし、正解もない
395デフォルトの名無しさん (ワッチョイ 4ff9-QKg6)
2019/07/18(木) 11:35:34.82ID:SjGJ8Hso0396デフォルトの名無しさん (スップ Sddf-9W53)
2019/07/18(木) 17:21:20.08ID:pDSkjMbHd Worksheet_SelectionChangeイベントを使って選択されたセルがColumns(20)を超えて選択された場合に選択を19までに戻したいんですけどコードを教えて下さい。
397デフォルトの名無しさん (ワッチョイ fff7-fu+2)
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
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
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
399デフォルトの名無しさん (ワッチョイ fff7-fu+2)
2019/07/18(木) 17:44:11.00ID:iWlQ47rb0 enableEvents操作いらんかったわ
400デフォルトの名無しさん (スップ Sddf-9W53)
2019/07/18(木) 17:48:00.14ID:pDSkjMbHd401デフォルトの名無しさん (ワッチョイ fff7-fu+2)
2019/07/18(木) 18:52:19.99ID:iWlQ47rb0 いや、
30〜60列目までの範囲が選択されたら
30〜48列目が選択された状態に変える
要望内容を捕らえ違えたかな?
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
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
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
404デフォルトの名無しさん (ワッチョイ 0f1f-9W53)
2019/07/19(金) 22:28:50.87ID:/2THaakJ0 行が削除された。行が挿入されたを認識したいんですがなんか方法ありませんか?
405デフォルトの名無しさん (ワッチョイ 7f68-0ngu)
2019/07/19(金) 22:43:18.81ID:TvxEimVQ0406デフォルトの名無しさん (ワッチョイ 4f7c-xwIM)
2019/07/20(土) 02:29:28.36ID:mZk+4Ek40 >>404
WithEventsの変数2つ作って行削除行挿入のコントロールを入れておいてclickイベントで弄る
WithEventsの変数2つ作って行削除行挿入のコントロールを入れておいてclickイベントで弄る
407デフォルトの名無しさん (ワッチョイ 3f8a-8mHW)
2019/07/20(土) 05:25:11.57ID:TdLuYGU30 どんな状況で使うんだそれwww
勝手に削除するやつがいるのか?
勝手に削除するやつがいるのか?
408デフォルトの名無しさん (ワッチョイ 7f68-0ngu)
2019/07/20(土) 06:34:43.57ID:dpChKN8u0 おるぞ・・・
409デフォルトの名無しさん (スップ Sddf-9W53)
2019/07/20(土) 07:37:09.15ID:vf/4Yo8ld Worksheet_Changeイベント内で
if Target.Columns.Count=Columns.Count Then
の中に、コピーされた時を想定してデータを貼り付けた時に特定のセルを消してます。
このイベントは行削除も行挿入もif中に入ってくるので、その2つの場合は除きたいんですけど、無理ですかね?
if Target.Columns.Count=Columns.Count Then
の中に、コピーされた時を想定してデータを貼り付けた時に特定のセルを消してます。
このイベントは行削除も行挿入もif中に入ってくるので、その2つの場合は除きたいんですけど、無理ですかね?
410デフォルトの名無しさん (ワッチョイ ff94-I8ja)
2019/07/20(土) 09:00:22.03ID:FGTvlN9C0 素直にシート保護するんじゃダメなの?
411デフォルトの名無しさん (ワッチョイ 3fea-m4W5)
2019/07/20(土) 13:12:04.73ID:M28zss090412デフォルトの名無しさん (ワッチョイ 8fad-9k8E)
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
でけたっぽいが、あらゆる使用状況でテストしたわけではないよ
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
413デフォルトの名無しさん (ワッチョイ 8fad-9k8E)
2019/07/20(土) 14:13:01.97ID:yIzn2tUG0 別途配列にも代入しとけば、削除に反応してSQLのDELETE文の発行にも使えるね
そんなことやったような記憶
あんまりお洒落なことすると、ハマる恐れもあるが
そんなことやったような記憶
あんまりお洒落なことすると、ハマる恐れもあるが
414デフォルトの名無しさん (ワッチョイ cfda-0ngu)
2019/07/21(日) 01:34:22.11ID:jI92lOqS0 挿入ってなんかエロいな
415デフォルトの名無しさん (ワッチョイ ff8c-M+2i)
2019/07/21(日) 08:59:00.32ID:8zHzQ0Ul0 じゃあ insertと言い直せ
416デフォルトの名無しさん (ワッチョイ 7f68-0ngu)
2019/07/21(日) 09:15:07.24ID:tbU/thR+0 oh,yes
417デフォルトの名無しさん (アウアウカー Sac3-msqt)
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つのアドレスを行き来してる。
これは自分のやり方が悪いんだろうか?
Midステートメントを使った置換そのものは早いんだが、クラス化すると処理全体としては&演算子を使った連結の方がなぜか早くなる。
可能な限り文字列型への代入は避けてるし、引数もByRefにしてるんだが、イマイチ原因がピンとこない。
StrPtrでm_bufferのポインタを確認すると、クラス内から見ればポインタはずっと同じだが、
呼び出してる外部モジュール側から確認すると、AppendやToStringとかのメソッドを呼び出す度に2つのアドレスを行き来してる。
これは自分のやり方が悪いんだろうか?
418デフォルトの名無しさん (ワッチョイ 7f68-0ngu)
2019/07/21(日) 11:14:15.04ID:tbU/thR+0 コード晒してくれればボトルネックになってるとこを見つけれるかも
今日暇だからやってみるぞ
今日暇だからやってみるぞ
419デフォルトの名無しさん (ワッチョイ 3fda-0ngu)
2019/07/21(日) 11:41:51.53ID:wqzeAX+60420デフォルトの名無しさん (ワッチョイ 4ff9-QKg6)
2019/07/21(日) 12:13:56.99ID:yJjnZgJg0421デフォルトの名無しさん (ワッチョイ 4ff9-QKg6)
2019/07/21(日) 12:18:26.68ID:yJjnZgJg0 あと、画面更新の負荷はものすごい大きいよな
422デフォルトの名無しさん (ワッチョイ 3f01-TsWF)
2019/07/21(日) 12:44:29.43ID:/atv33Bt0423デフォルトの名無しさん (ワッチョイ cfda-0ngu)
2019/07/21(日) 13:53:33.71ID:jI92lOqS0 デリケートにやるんだ
424デフォルトの名無しさん (アウアウカー Sac3-msqt)
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
になってる、ぐらいなもん。
やっぱ、文字列型変数の評価回数が多いせいなんだろうか?
ありがたいが、今ぱっと出せるのがクラス部分ぐらいしかない・・・
(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
になってる、ぐらいなもん。
やっぱ、文字列型変数の評価回数が多いせいなんだろうか?
425デフォルトの名無しさん (アウアウカー Sac3-msqt)
2019/07/21(日) 14:22:28.88ID:4aIgjVvla 行数制限でギュウギュウになってしまった。ごめん。
あと呼び出し側もOption Explicitつけてるので。一応。
あと呼び出し側もOption Explicitつけてるので。一応。
426デフォルトの名無しさん (ワッチョイ 4fad-9k8E)
2019/07/21(日) 16:35:43.80ID:YTBWsrAX0427デフォルトの名無しさん (ワッチョイ 8f8e-DngZ)
2019/07/21(日) 16:44:43.49ID:zVh3KjUp0 全角文字で書くような馬鹿の後出し言い訳か
428デフォルトの名無しさん (ワッチョイ 4fad-9k8E)
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秒、困る場面はあり得ない
DB編集画面は結局フラグ式にしたけど
自分用なので、ユーザーフレンドリーより処理の単純さと自分的な分かりやすさを取った
文字列連結も改めて整理しようとしてたところ
Midは固定なら速いが、可変だと遅い
■100文字を10万回連結
・固定: 1000万字確保: 0.08秒
・固定: 5億字確保: 2.5秒 (20億字はSpace関数が駄目だった)
・可変: 2万字ずつ拡張: 3.3秒
1000万字だって十分あり得ないし、なんなら2万字でも、実際に拡張する場面はないとは思う
でも心理的にわだかまりが残る
可変の配列は0.3秒だった (ReDim Preserveで後ろへ後ろへ追加、最後にJoin)
ほどほどの固定の超速を取るか、可変の高速を取るか
これも逆に、あり得ない規模でも0.3秒、困る場面はあり得ない
429デフォルトの名無しさん (ワッチョイ 4fad-9k8E)
2019/07/21(日) 17:23:37.68ID:YTBWsrAX0 い、言い訳?逆に配列をSQLで操作する方法を知らん
430デフォルトの名無しさん (ワッチョイ 7f68-0ngu)
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秒に減らしたいってなら寝る
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秒に減らしたいってなら寝る
431デフォルトの名無しさん (ワッチョイ 3fda-0ngu)
2019/07/21(日) 19:07:22.36ID:wqzeAX+60432デフォルトの名無しさん (ワッチョイ 3fda-0ngu)
2019/07/21(日) 21:44:27.38ID:wqzeAX+60 PDFに、AddNewAnnotでテキスト注釈を追加しようとしても、
ポップアップ注釈になっちゃう。
何でだろう?
第2引数には"Text"を指定していて、
Debug.PrintでGetSubtypeを確認しても、間違いなく"Text"と表示されてるのに。
ポップアップ注釈になっちゃう。
何でだろう?
第2引数には"Text"を指定していて、
Debug.PrintでGetSubtypeを確認しても、間違いなく"Text"と表示されてるのに。
433デフォルトの名無しさん (ワッチョイ 3fda-0ngu)
2019/07/21(日) 23:48:26.23ID:wqzeAX+60 ↑自己解決
× "Text"
○ "FreeText"
こうだった。
× "Text"
○ "FreeText"
こうだった。
434デフォルトの名無しさん (ワッチョイ 3f59-6LU0)
2019/07/22(月) 00:41:41.83ID:sdD1SeGB0 100個くらいのxlsxデータを1つ1つ開かずにセル値を配列に格納させたいんだけど
できるだけ速く処理させるにはどんな方法がありますか?
データベース形式のファイルでないのでADO接続は諦めました。
できるだけ速く処理させるにはどんな方法がありますか?
データベース形式のファイルでないのでADO接続は諦めました。
435デフォルトの名無しさん (アークセー Sxa3-9hAT)
2019/07/22(月) 00:56:28.70ID:zv/NMHHfx ExecuteExcel4Macro("'[任意のファイルのフルパス]'シート名!R1C1形式のセルアドレス")で、ファイルを開かなくても読める
436デフォルトの名無しさん (アークセー Sxa3-9hAT)
2019/07/22(月) 00:57:17.91ID:zv/NMHHfx 処理速度が速いかどうかは分からないけど
437デフォルトの名無しさん (ワッチョイ cfda-0ngu)
2019/07/22(月) 01:02:00.91ID:odzqFd9J0 >>434
優秀な後輩にやらせる
優秀な後輩にやらせる
438デフォルトの名無しさん (ワッチョイ 3f2c-QKg6)
2019/07/22(月) 06:18:13.29ID:GAEqWBnq0 >>428
言語による、処理系の速度の比較
C/C++ のnative・マシン語系 : 100
Java, C# などのコンパイル・中間言語系 : 10
JavaScript, Python, Ruby などの動的言語系: 1
なお、JIT は、フィボナッチ数列・素数などの計算では速いが、普通のプログラミングでは無意味
遅い理由は、I/O, 動的配列(動的コンテナ)などでメモリを動的に確保する、
動的にアドレス計算するなど
言語による、処理系の速度の比較
C/C++ のnative・マシン語系 : 100
Java, C# などのコンパイル・中間言語系 : 10
JavaScript, Python, Ruby などの動的言語系: 1
なお、JIT は、フィボナッチ数列・素数などの計算では速いが、普通のプログラミングでは無意味
遅い理由は、I/O, 動的配列(動的コンテナ)などでメモリを動的に確保する、
動的にアドレス計算するなど
439デフォルトの名無しさん (ワッチョイ 0f95-k+pP)
2019/07/22(月) 09:27:20.13ID:rxI3cfFL0 Excel VBA の速度は Cの100に対してどれぐらい?
440デフォルトの名無しさん (ワッチョイ cfce-0ngu)
2019/07/22(月) 10:08:13.43ID:DAYqWJvs0 VBAは中間言語方式だけど、内部構造の違いからC#より遅くてJavaよりは速い
441デフォルトの名無しさん (ワッチョイ ff68-ShKg)
2019/07/22(月) 19:19:01.79ID:MenVMjW60 Excel VBAはExcelの評価が入るとすげー遅くなるけど、
EXCELの評価ナシならそこまで遅くない
ただ、vbaで速さを求めるのはナンセンスだと思う
EXCELの評価ナシならそこまで遅くない
ただ、vbaで速さを求めるのはナンセンスだと思う
442デフォルトの名無しさん (ワッチョイ 4f7c-xwIM)
2019/07/22(月) 19:20:20.47ID:x75J2JMa0 >>434
ExecuteExcel4Macroで開かずに読めるが、いちいち開いて読むより速いだけで速いわけではない
ExecuteExcel4Macroで開かずに読めるが、いちいち開いて読むより速いだけで速いわけではない
443デフォルトの名無しさん (ワッチョイ 3fda-0ngu)
2019/07/22(月) 22:17:37.77ID:SAttBB2w0444デフォルトの名無しさん (スププ Sd5f-x7W1)
2019/07/22(月) 23:58:25.16ID:ZZbz3w4Ud >>434
定期的にインデックス化するのは他言語なら常識
定期的にインデックス化するのは他言語なら常識
445デフォルトの名無しさん (ワッチョイ 4fad-9k8E)
2019/07/23(火) 05:29:57.32ID:LmcM+lna0 意外と記憶にないコレクションからの連結
追加時にサイズを記録しといて、最後にぴったりサイズでメモリ確保してMid
(クラス想定)
Public Item As New Collection, Length As Long
Sub Add(Text As String)
Item.Add Text
Length = Length + Len(Text)
End Sub
Function Text() As String
Dim Pos As Long, Var As Variant
Text = Space(Length)
Pos = 1
For Each Var In Item
Mid(Text, Pos) = Var
Pos = Pos + Len(Var)
Next
End Function
配列のJoinは実装のシンプルさがいいんだけど、100字+10万回で0.3秒
こっちは0.15秒という倍の速さで、そこそこシンプル、可変
普通と言えば普通な発想だけど力業のイメージがあって、やってみようと思わなかったのかも
ちなみにFor Eachを番号方式にすると、80秒ぐらいかかってびっくりした
そんな違うんだね
追加時にサイズを記録しといて、最後にぴったりサイズでメモリ確保してMid
(クラス想定)
Public Item As New Collection, Length As Long
Sub Add(Text As String)
Item.Add Text
Length = Length + Len(Text)
End Sub
Function Text() As String
Dim Pos As Long, Var As Variant
Text = Space(Length)
Pos = 1
For Each Var In Item
Mid(Text, Pos) = Var
Pos = Pos + Len(Var)
Next
End Function
配列のJoinは実装のシンプルさがいいんだけど、100字+10万回で0.3秒
こっちは0.15秒という倍の速さで、そこそこシンプル、可変
普通と言えば普通な発想だけど力業のイメージがあって、やってみようと思わなかったのかも
ちなみにFor Eachを番号方式にすると、80秒ぐらいかかってびっくりした
そんな違うんだね
446デフォルトの名無しさん (ワッチョイ 4fad-9k8E)
2019/07/23(火) 06:30:29.98ID:LmcM+lna0 >>441
Excelの強みはむしろシートだと思う
ただしデータ処理用ではなく、表示・操作用のグリッドコントロールとして
VSにこんな高速高機能なグリッドコントロールはない、はず(知る限り)
特に CopyFromRecordset の異様な速さ
大量に表示した状態での動きも速い
DBの表示媒体として実は最強だと思う
(他の言語からExcelを呼び出してもいいので、VBA限定ではないけど)
Excelの強みはむしろシートだと思う
ただしデータ処理用ではなく、表示・操作用のグリッドコントロールとして
VSにこんな高速高機能なグリッドコントロールはない、はず(知る限り)
特に CopyFromRecordset の異様な速さ
大量に表示した状態での動きも速い
DBの表示媒体として実は最強だと思う
(他の言語からExcelを呼び出してもいいので、VBA限定ではないけど)
447デフォルトの名無しさん (ワントンキン MM9f-Ei4u)
2019/07/23(火) 12:43:05.74ID:Wmp6rbs0M セルA1からはじまる、5万行30列あるディレクトリツリーを、グループ化したいんですが、
最初のA列のみはエクセルのグループ化でうまくいくけど、B列以降がうまく行きません。
VBAでいっぱつで処理できる方法ってありますか。
最初のA列のみはエクセルのグループ化でうまくいくけど、B列以降がうまく行きません。
VBAでいっぱつで処理できる方法ってありますか。
448デフォルトの名無しさん (スッップ Sd5f-k2pK)
2019/07/23(火) 13:58:45.14ID:6EIv8bzUd449デフォルトの名無しさん (ワッチョイ 0f95-k+pP)
2019/07/23(火) 14:14:05.21ID:+7TCISw60 >>446
sed や tail などでいい
30GBのテキストも0.04秒で tail できたし
編集も sed は問題なかった
行数上限がない理想的なExcelが将来でても
そういう大きいDBはしんどいんじゃないかな?
sed や tail などでいい
30GBのテキストも0.04秒で tail できたし
編集も sed は問題なかった
行数上限がない理想的なExcelが将来でても
そういう大きいDBはしんどいんじゃないかな?
450デフォルトの名無しさん (ワントンキン MM9f-I8ja)
2019/07/23(火) 16:29:02.63ID:wjsoV9EZM つうか普通に10万レコード辺り越えたら遅いだろ
DBを舐めすぎ
DBを舐めすぎ
451デフォルトの名無しさん (スッップ Sd5f-k2pK)
2019/07/23(火) 16:49:12.46ID:6EIv8bzUd つうかDBは同時接続数が多くなるほど威力を発揮する
単一接続のエクセルと比較するのがどうかと思う
単一接続のエクセルと比較するのがどうかと思う
452デフォルトの名無しさん (スプッッ Sddf-9W53)
2019/07/23(火) 18:25:17.72ID:W2R1kWYLd 質問です。
長さAに対して等間隔の点のピッチを計算したい。欲しい答えはピッチ長さ、両端の数字。
条件
両端は同一数値で30以上50以下。ピッチは190以上220以下。
共に50と220の整数に近い数値。
結果
長さ 1200
ピッチ 220☓5
両端 50
こういった計算って結構面倒くさいですか?
関数電卓で計算する分には出来ますがVBAだと全く思いつきません。
宜しくお願いします。
長さAに対して等間隔の点のピッチを計算したい。欲しい答えはピッチ長さ、両端の数字。
条件
両端は同一数値で30以上50以下。ピッチは190以上220以下。
共に50と220の整数に近い数値。
結果
長さ 1200
ピッチ 220☓5
両端 50
こういった計算って結構面倒くさいですか?
関数電卓で計算する分には出来ますがVBAだと全く思いつきません。
宜しくお願いします。
453デフォルトの名無しさん (ワッチョイ cfce-0ngu)
2019/07/23(火) 19:05:35.16ID:de2cQTfB0 >>452
Aの長さによっては絶対に答えが出ない場合があるけど、その時はどうすんの?
Aの長さによっては絶対に答えが出ない場合があるけど、その時はどうすんの?
454デフォルトの名無しさん (ワッチョイ cfce-0ngu)
2019/07/23(火) 19:07:08.73ID:de2cQTfB0 >>452
Aの長さによっては、答えが2種類出る場合があるけど、その時はどうするの?
Aの長さによっては、答えが2種類出る場合があるけど、その時はどうするの?
455デフォルトの名無しさん (ワッチョイ 4f7c-xwIM)
2019/07/23(火) 19:23:21.87ID:ToxLFwwH0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【ローソン】ロゴの「L」で誤解生んだコーヒーカップ、デザイン変更へ 在庫使い切る3か月後にリニューアル [ぐれ★]
- 今日はチートデイなのでパスタサラダ食べました
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 5時だから窓から5回ちんこ出した
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
- リュウジ、ファミマコラボが不評だったから反論で緊急の動画回しててワロタァ
