Excel VBA 質問スレ Part50 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 7e6d-ffY6)
垢版 |
2017/08/27(日) 12:40:17.57ID:LjjEWylk0
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

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

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/

※前スレ
Excel VBA 質問スレ Part49©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1498410914/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/09/10(日) 09:17:02.60ID:WLChtAtMa
>>89
修正履歴書いて残せばいい
2017/09/10(日) 09:21:21.87ID:WLChtAtMa
チーム開発でも修正ルールがあるし
会社のシステムを書き換えるには上司の許可いるだろ
2017/09/10(日) 09:25:28.85ID:Gppr5zJi0
>>89
そいつ用にパスワード外して送ればいいんじゃね
もちろん改変後の質問は受けない
2017/09/10(日) 09:31:38.83ID:7PCuqjJO0
>>89
普通の会社では許可しない
規定のフォーマットで要望書をシステム課に出せ
2017/09/10(日) 09:51:20.19ID:emM90UQN0
>>91
vbaには無い。
こういうのは一般事務の女の子向けに男がヘラヘラ書いたもの、ってかvbaが安易に書き換えられる仕様は常識

会社の基幹システムはもちろん無理だけどね
変更許可は絶対に降りない。然るべき手続きが必要
2017/09/10(日) 10:26:56.59ID:7PCuqjJO0
>>94
基幹に近い所でVBAが動いてるうちの会社みたいなところもあるんやで
一部上場でテレビCMもガンガン流してて誰でも知ってる大企業

入力ミスをなくすためにワークシートにロックかけて入力から印刷までフォームなしのVBAで組んである
モッサリでめっちゃ使いにくいシステムで見積書とか作らされてる
下っ端の俺にはどうしようもない
2017/09/10(日) 10:31:20.17ID:emM90UQN0
>>95
世間知らずでスマンかった…
ご愁傷様なのだ
2017/09/10(日) 11:32:55.83ID:fMXB0jq4a
売り上げ金額が合わなかったので勝手に書き換えておきましたとかやってんのか?
2017/09/10(日) 11:38:17.51ID:fMXB0jq4a
知らない人がいつの間にか勝手に書き換えてましたじゃ駄目だろ
2017/09/10(日) 11:39:01.10ID:FH1GYxFV0
>>96
アライさんおつw
2017/09/10(日) 11:49:00.36ID:emM90UQN0
>>97
それ現場、現場の人間はマクロを触る能力なんかない
現場では調整用貯金箱とか作って、金が多かった日は貯金、少なかった日はそこから取り崩しとかやる
2017/09/10(日) 12:47:48.18ID:4u5v5mfoa
後は、客はパスワード解除しないだろう、出来ないだろうという前提でパスワード掛けてたことも有ったな。
客の別の部署の奴がプログラムの仕組みが見れては困るという要望に対して。

そういう案件の場合はExcelでやらずにちゃんとシステム組むべきという俺の指摘は営業的事情により却下されたな。
客がそんなに金使いたく無いんだとよ。
2017/09/10(日) 12:54:29.64ID:4u5v5mfoa
>>94
それやって収拾がつかなくなって、ちゃんと管理しましょうという話になってパスワード掛けることになる。
103デフォルトの名無しさん (ワッチョイ 0b11-p4X9)
垢版 |
2017/09/10(日) 13:27:08.19ID:y19mgzO60
Range("J5:J12").Value = "AVERAGE (RC[-7]:RC[-2])"

これどういう意味ですか?
104デフォルトの名無しさん (ワッチョイ 0b11-p4X9)
垢版 |
2017/09/10(日) 13:28:56.73ID:y19mgzO60
>>103
これの右辺が分からないです
105デフォルトの名無しさん (ワッチョイ dbe3-otRg)
垢版 |
2017/09/10(日) 14:00:23.18ID:co+DcanR0
エクセルVBAの課題ですが分かりません。
Dim Target As Range
Dim temp As String

For Each Target In Range("C2:C6")
'セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプロパティを使って取得する
temp = StrConv(Target.Value, vbUpperCase) ←
'置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
Range("C2:C6") = temp  ←
Next
End Sub
元の値は半角カタカナで別の名前が各セルの記入されています。
矢印の個所が参考書を元に記述しました。
2017/09/10(日) 14:06:44.63ID:iMMEfei9x
>>105
の文章がワカランカ
2017/09/10(日) 14:26:35.95ID:BQ8Qv0VP0
>>83
ツールあったから結局買いました
情報ありがとう
http://conex-office-password.com/shopdetail/001000000001/
もし駄目でもどうせ1000円だからな
2017/09/10(日) 14:49:33.57ID:ECkhuLxaa
>>107
これな。
仕組みが想像できる。
2017/09/10(日) 15:03:50.97ID:emM90UQN0
>>103
こうじゃないの?
Range("J5:J12").FormulaR1C1 = "=AVERAGE(RC[-7]:RC[-2])"
範囲上のセルに数式を入力する
2017/09/10(日) 15:06:41.55ID:emM90UQN0
>>105
何が分からんのか具体的に

後多分コードが間違っている
Sub a()
For Each target In Range("C2:C6")
'セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプロパティを使って取得する
temp = StrConv(target.Value, vbUpperCase)
'置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
target.Value = temp
Next
End Sub
2017/09/10(日) 15:15:05.13ID:7PCuqjJO0
>>104
右辺は単なる文字列です
セルにそういう「数式みたいな」文字列が入るだけ
2017/09/10(日) 15:15:26.00ID:lVUuTaKfa
というか、どうしても解除されたくなかったらxllアドインとかにすべきでしょ。
2017/09/10(日) 16:45:46.81ID:ciO3Bw990
>>100
それ持ち逃げしてもばれないよね
114デフォルトの名無しさん (ワッチョイ 5ab3-R8ON)
垢版 |
2017/09/10(日) 17:52:32.57ID:MQQa++S20
>>107
ああ、それ俺も買ったけど良かったよ。VBEを開こうとすると途端にエラーが出るので
大抵は諦めるね。俺はそれに加えてvbeのフォントを白にして嫁ないようにした。
2017/09/10(日) 22:09:00.85ID:R8jGf7t60
>>105
何がわからないのか全然わからない
そのソースコードを実行するとどうなるのか、期待値は何なのか書かないと

まあ、ひとまず temp を配列にしないとダメじゃない?

Dim temp() As String
Dim i As Integer

Redim temp(Range("C2:C6").Rows.Count)

i=0
For Each Target In Range("C2:C6")

temp(i) = StrConv(Target.Value, vbUpperCase)
i = i + 1

Next

Range("C2:C6") = temp
2017/09/11(月) 01:14:13.54ID:cJ5w3XMz0
>>115
1セルずつループして処理すればtempを配列にする必要なんてない

どうでもいいけど、全角はvbWideじゃないのかね
全角スペースを半角にするのはReplaceあたり使えば良いんじゃね
課題ならその課題出した奴に聞けよと思うが
2017/09/11(月) 07:33:49.76ID:/uQ7pno7M
>>115
速度稼ぐために配列にしてるなら読み出し側もやるべき
2017/09/11(月) 07:48:20.80ID:y+HHQfcAp
>>116-117
うん
送信押して、あっと思った
しかも縦方向だと2次元配列じゃないとだめだったっけ?

>>105
ごめん
多分>>110が正解

課題と質問の意図がよくわからないけど
2017/09/11(月) 08:13:17.53ID:ngQru/Z5d
>>105
矢印の業務が空行の状態が問題文、矢印の行は君が書いた、と解釈した。

矢印1行目は、vbuppercaseじゃなくて、vbwide。uppercaseは大文字だ。
2行目は、target=temp

そういう問題じゃないようだが、高速化するなら、
Rangeを配列に代入
配列内で計算
配列をrangeに書き戻し
する。
2017/09/11(月) 08:14:49.10ID:ngQru/Z5d
>>119
(誤)矢印の業務
(正)矢印の行
スマン
2017/09/11(月) 15:42:49.07ID:cJ5w3XMz0
なんで君らは
>置換後の値の全角スペースを半角スペースに変換し
は放置なの?
2017/09/11(月) 20:27:23.15ID:X8qu52Lad
>>121
質問の仕方が悪いから、だな。

では>>119の2行目を
target=replace(temp, "◻︎", " ")
# ◻︎は全角スペースと読んでくれ
に変更。
2017/09/12(火) 02:00:32.49ID:qJTGUifI0
target=replace(temp, "全角スペースと読んでくれ", " ")
2017/09/12(火) 23:06:27.96ID:cxYAECV80
3万行前後ある列のデータの隣セルに、別シート5000行前後の列から、if条件に該当したものをループで貼り付ける処理をしているけど処理が遅い
3万行の列が外側ループi、5000行の列が内側ループjで回してる
処理時間短縮の為に、最初にiとjのデータを配列で取得して比較を行い
該当するものをセルに出力するように変更した結果、配列使用前より処理時間が短くなった
もっと処理時間を早くするにはどうすればいいかお知恵をください
2017/09/12(火) 23:14:30.57ID:e4D1CdNrx
>>124
5000がユニークデータなら
コレクション
2017/09/12(火) 23:23:18.75ID:hrwgqvSF0
>>124
別シート5000をディクショナリーに放り込んで、引いてくれば良いんでない?その手の話で高速化したいなら二重ループはナンセンス。
2017/09/12(火) 23:27:05.41ID:aYCmToqI0
>>124
条件と出力形式が分からないからハッキリとは言えないけど、
もし該当したものを都度吐き出しているなら、結果自体を配列にして最後に吐き出す様に直すと早くなるはず。
2017/09/13(水) 00:11:27.19ID:n1InxPaY0
>>124
ここに載ってるDOUBLE TRUE VLOOKUPを試してみてよ
lookupの時間だけ比較してもDictionaryより速いらしいんだが
http://analystcave.com/excel-vlookup-vs-index-match-vs-sql-performance/

アルゴリズムだけ考えたらバイナリサーチより
ハッシュテーブルのほうが速そうなもんだけどな
2017/09/13(水) 00:31:34.36ID:TkE7wJHp0
>>125-126
ありがとうございます!
なるほど、コレクションかディクショナリーで連想配列を使用すれば早いってことか
イマイチ使い方が分からず使用していなかった
大量にデータを処理する場合は活用すれば、処理が早くなる可能性があるって事なんですね
今後は意識して使わせていただきます

>>127
ありがとうございます!
今のコードは ifがTrue時にその都度セルに出力するコードです。
if 配列A(i)=配列B(j) then
worksheets(出力先シート)cells(i,出力先列)=配列B(j)
end if

結果自体を配列にするというのこういう処理でいいでしょうか?
結果を取得する配列Cを宣言
if 配列A(i)=配列B(j) then
配列C(i)=配列B(j)
end if
この後の処理は、配列C(i)の値をループでシートに出力する以下の処理でしょうか?
worksheets(出力先シート)cells(i,出力先列)=配列C(i)

>>128
ありがとうございます!
これは普通のキーワードでネットで調べてもヒットした記憶がないワードです
今後に活用させていただきます
2017/09/13(水) 00:32:10.56ID:/gH6Ji+W0
ハッシュテーブルはハッシュの算出方法で変わるからな
対象データに対して衝突が少なくて計算の軽いハッシュ関数じゃないと
2017/09/13(水) 00:58:34.20ID:SpyxPvDF0
>>129
配列とセルは相互に直接的なやりとりが出来るんで調べてみて。
いちいちループ回さなくていいから。

簡単に言えば

Dim A As Variant
A = Range(範囲).Cells

とすれば配列Aに範囲の中身が入り、

Range(範囲) = A

とすれば配列Aの中身が範囲に入る。
2017/09/13(水) 07:30:42.98ID:F7IQARkod
ネットでエクセルVBAを勉強中なんですがオススメ参考本とかないでか?
特にユーザーフォームを使って作業が多いです。
2017/09/13(水) 07:35:00.26ID:W36Ef0cBp
>>124
条件の内容にもよるけど、ワークシート関数のvlookupは使えないの?
2017/09/13(水) 08:14:57.58ID:6syv7XXEd
>>133
横からすまん。試してみりゃいいんだろうけど...
vlookup(ワークシート関数)って、マクロから使うメリットがあるほど速いの?
2017/09/13(水) 08:26:49.86ID:B5ndS4Fj0
お前VBAスレの自称初心者だろW
2017/09/13(水) 08:46:51.19ID:ldXoybWh0
>>134
試せよw

って言いたけど昔試験したから教えるわ
実はvlookupは参照範囲を広くしなければかなり早い
ただ2003の頃の話だから、今はどうかしらん
137107 (ワッチョイ 8a2e-NEns)
垢版 |
2017/09/13(水) 09:25:03.74ID:C9n8lcte0
たかがソフト買うのに個人情報を洗いざらい要求してくるセキュリティ企業って・・・
なんで俺の住所や電話番号がいるんだよ。なんに使う気だ

しかもダウンロードしようとしたら送ってきたパスワード
そっくりコピペなのにエラー出るじゃねえか
大丈夫かここ
2017/09/13(水) 10:51:59.22ID:mbz5MtUcM
会社紹介を見る限りまともじゃなさそう
ツールの中身も海外フォーラムに載ってるソースコピペしてたりしてな
2017/09/13(水) 12:27:02.45ID:SpyxPvDF0
標準のワークシート関数ってVBAで作ってある上に、色々な目的に使えるように冗長性があるから、
目的に対して最も効率的な処理方法であるという条件下だと処理時間は必ず

ワークシート関数 ≧ VBAマクロ

が成り立つ。
特にVLookupとかはセル毎に走査してるから共有可能な部分も個別に計算してるんで効率面はお察し。

ただしワークシート関数とほぼ同じ機能をVBAマクロで実装するのが時間の無駄って事もあるので、
マクロ内でワークシート関数を利用するという状況を考えるのは難しくない。
2017/09/13(水) 12:34:53.43ID:Uwuz4mw5d
>>136
ありがとう。

なんか>>139の言う(汎用|冗長)性による低速処理の懸念があって、あまりワークシート関数を使う事考えないんだよね。
141デフォルトの名無しさん (オッペケ Sr3b-Sbom)
垢版 |
2017/09/13(水) 12:45:19.24ID:W3E85BX/r
お前らが書いた腐ったvbaコードよりワークシート関数が遅いとかw
どんだけ頭がお花畑なんだよw
2017/09/13(水) 13:09:42.32ID:Prl309L10
ワークシート関数は条件さえ整えばマルチスレッドで動くぞ
確実にVBAより早いわ
2017/09/13(水) 13:55:24.11ID:SpyxPvDF0
https://msdn.microsoft.com/ja-jp/library/office/bb687899.aspx

公式ページ↑見ると2007からマルチスレッディングになってるらしいけど、
経験上、同じ様な目的の実装で処理時間が

VBAマクロ > ワークシート関数

になった事がないんだよな。

十分に最適化されたVBAマクロよりもワークシート関数の方が処理が早くなるって状況の具体例があれば参考になるんだけど、
そもそも目的が違うのもあってワークシート関数が重いからユーザー定義関数を作りましょうみたいなページしか見当たらない。
2017/09/13(水) 14:13:42.05ID:/h+OIrtOd
>>141,142
例えば、>>124の質問内容を試しに書いて動かしてみたら、90msecで終わった。これを「vlookup使えばもっと早くなる」と言われても、「別にこれ以上早くなくていいし」って感じ。
2017/09/13(水) 14:20:51.63ID:W36Ef0cBp
例えばこんな感じ?

Dim Temp (30000,1)

For i=0 To 30000

Temp(i,1)=Application.WorkSheetFunction.Vlookup(Sheet1.Cells(i,1),Sheet2.Range("A:A"),1,False)

Next

Sheet1.Range("B1:B30000)=Temp


10000×1000で試してみたけど、>>131を二重ループで回した場合5秒かかってたところが、 このvlookupは1秒でできた。

ちなみにExcel2002(職場のクソマシン)だから、また今は違うのかもしれないけど。
2017/09/13(水) 14:23:19.54ID:W36Ef0cBp
FORのところ i=1 だね
手打ちなんで許して
2017/09/13(水) 14:53:37.84ID:SpyxPvDF0
>>145
うーん、

Sub test1()
Dim Temp(1 To 30000, 1 To 1)

For i = 1 To 30000
Temp(i, 1) = WorksheetFunction.VLookup(Worksheets(1).Cells(i, 1), Sheet2.Range("A:A"), 1, False)
Next

Worksheets(1).Range("B1:B30000") = Temp
End Sub

Sub test2()
Dim d As Dictionary: Set d = New Dictionary

b = Sheet2.Range("A1:A5000").Value
For Each c In b
If Not d.Exists(c) Then d.Add c, c
Next

a = Sheet1.Range("A1:B30000").Value
For i = 1 To 30000
If d.Exists(a(i, 1)) Then a(i, 2) = d(a(i, 1))
Next

Sheet1.Range("A1:B30000") = a
End Sub

この二つだとtest2の方が早い。といっても数字を周期的に並べただけだし、test1の方はヒットしない数字があるとエラー吐く。
もっとフェアなデータでやれば話は違ってくるかもしれないけど、この例だとワークシート関数の方が遅いね。
2017/09/13(水) 15:46:41.67ID:n1InxPaY0
おまえら>>128にパフォーマンステストの結果が載ってるのになぜ見ない

[lookupテーブル件数:200k, lookup回数:25kの結果]
- VLOOKUP: 11.97sec
- VBA Dictionary: 0.45sec (※Dictionaryの生成時間は含まない)
- DOUBLE TRUE VLOOKUP: 0.05sec

VLOOKUPで最後のオプションをFALSEにするとリニアサーチだから遅い
TRUEにするとバイナリサーチだから速い O(N)とO(log N)の違い
ただ見つからない場合に不都合が出るからそれを解決するためのDOUBLE TRUE VLOOKUP
同じリニアサーチでもVLOOKUPが単純な二重ループより数倍速いのはC/C++使って最適化してるから
2017/09/13(水) 15:47:56.64ID:W36Ef0cBp
>>147
なるほどー
これは速い
勉強になった

>>124
余談だけど、こんなやり方もどうぞ
コード量は少なさなら一番
速度は>>147の方が速かったけど

Range("A1:A30000")="vlookup(Sheet!A1,Sheet2!A:A,1,false"
Range("A1:A30000").value=Range("A1:A30000").value

2行目は式を消してる
2017/09/13(水) 15:50:55.04ID:W36Ef0cBp
>>149
ごめん、いろいろとおかしかった

Range("B1:B30000")="vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value
2017/09/13(水) 16:03:25.39ID:W36Ef0cBp
ほんとグダグダで申し訳ない
しばらくROMります…

Range("B1:B30000")="=vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value
2017/09/13(水) 23:54:00.93ID:qFUPeADD0
>>147
あー
> b = Sheet2.Range("A1:A5000").Value
でvalue(のみ)を配列につっこめるんか、あー

ありがとう(・ω・)ノ
2017/09/14(木) 00:05:19.65ID:QvPDzzeD0
>>124で処理時間高速化の質問させてもらった者です

>>131
ありがとうございます!
このスレの内容にあるようにセルを配列に入れてから、if文は配列同士で比較して、結果も配列で取得するように修正しました
配列の値を、一度にセル範囲に出力するコードに修正したら8分前後かかっていた処理が、1分〜2分前後になって、処理時間がめちゃめちゃ早くなって快適になりました

みなさんが言われてるように、VBAでワークシート関数を使用した場合の処理時間は、
おなじみオフィス田中さんのページに、配列をセル範囲に出力するのと同じぐらいの処理時間が高速だと書いてありますね
3万行と比較する列データが、複数シートで複数列だったので、次回同じような処理を作成する時は
VLOOKUP用の一時シートを追加して、3万行の列を一番左の列の検索キーにして、比較列はVLOOKUPで取得する実装をしてみます
2017/09/14(木) 08:15:22.18ID:l8z8iklHd
>>153
分単位はかかり過ぎだと思うなぁ。
データや環境の違いがあるから、純粋に比較はできんだろうが、124の内容を素直に読んでコード書いて動かして見たが、100msecかからんかったよ。
ちな、
3万行のデータを配列1に丸ごと代入
5千行のデータを配列2に丸ごと代入
配列2から辞書を作成
配列1を先頭から順に見て、辞書に存在しない値を消す
3万行データの隣に配列1を丸ごと貼る
2017/09/14(木) 08:29:32.22ID:+i9FPPOB0
配列にして一括で読み書きする
これが全てだよ
2017/09/14(木) 10:18:54.39ID:dILqaQ/Ld
VBAにも新規参入者がいて20年くらい前の話題が新たになされるのにちょっと感動した
2017/09/14(木) 11:15:17.22ID:XfGri2Pk0
Windows10のアップデートでIEオブジェクトの挙動がまた変わったらしい?
データ収集とかしてる人はアップデートしない方がいいかも
2017/09/14(木) 12:34:44.93ID:MnqZaJ520
配列 オブ カリビアン
2017/09/14(木) 12:36:58.88ID:dILqaQ/Ld
この期にIEオブジェクトをわざわさ生成するやり方はやめたらいいと思う
2017/09/14(木) 12:39:57.29ID:IwoZ7QGd0
vbaでスクレイピングはねぇ
2017/09/14(木) 12:42:41.16ID:YtbuHggLa
>>157
EdgeではなくIEの挙動が変わったのか?
にわかには信じかたいが。
2017/09/14(木) 14:27:44.29ID:gZf88W9A0
あるシートに所属するプロシージャから
自分の所属するシートを参照するにはどうしたらいいのでしょうか?
プロシージャを他のシートにコピペしたら
コードを書き換えなくてもコピペ先のシートを参照するようなコードを
書きたいのですが
2017/09/14(木) 14:33:45.54ID:EP6SpHBt0
>>162
シートモジュールは、その中で完結する処理を書く場所なので、
シートを飛び越えた処理を行いたいなら標準モジュールに書くべき。
2017/09/14(木) 14:54:53.92ID:gZf88W9A0
>>163
いや、むしろシートを飛び越えないでほしいんですが
シートで完結した処理にしたいのでシート名や番号による
シートの指定を排除して、所属するシートのセルを参照したいのですが
検索して調べるとセルを参照する方法としては
シート名を決め打ちする方法ばかりが出てくるので困っているのです
2017/09/14(木) 15:38:59.34ID:lm5VBVU0M
Active Sheet とSheet名以外でSheet 特定できるんだっけ?
2017/09/14(木) 15:49:13.64ID:+i9FPPOB0
application.callerでチェックボックスの動きの判定をするようにしたらメチャ重いんだが、これなんとかならない?
2017/09/14(木) 15:52:46.83ID:IwoZ7QGd0
>>162
Sub foo()
Debug.Print Me.Name
End Sub

何故かthisworksheetは存在しない
Meを使う
2017/09/14(木) 15:53:31.32ID:IwoZ7QGd0
セルはもちろんこんな感じね
Sub foo()
Debug.Print Me.Cells(1, 1)
End Sub
2017/09/14(木) 15:54:13.48ID:IwoZ7QGd0
>>166
http://15g.jp/post-314/
これ使っても駄目_
2017/09/14(木) 15:57:20.47ID:+i9FPPOB0
>>169
なるほどイベント抑止か。
ありがとう、やってみる
2017/09/14(木) 15:58:45.31ID:EP6SpHBt0
>>164
シートモジュールに直書きする場合はSheetsの部分を省略してCellsやRangeから書ける。

シートを指定しない場合の振る舞いが、
標準モジュールではActiveSheet(見えているシート)だったものが、
シートモジュールではそのシートに限定されるという変化をするので併用する場合は注意が必要。
2017/09/14(木) 16:00:47.13ID:IwoZ7QGd0
標準モジュールに書いて、対象シートはsetした方がいいと思うけどなぁ
2017/09/14(木) 16:02:42.23ID:gZf88W9A0
>>167
ありがとうございます。
まさに求めていた回答です。Meとは気づきませんでした。
2017/09/14(木) 18:24:24.22ID:EcWTQGUxa
>>169
うへえ。
確かにそれは効果が高いが、それだけでOKとか、どんだけレベル低いんだ?

むしろ速度を意識したプログラム書いてる奴にとってはそれやっても速度なんて変わらんのだが。
2017/09/14(木) 18:59:59.93ID:IwoZ7QGd0
>>174
ではレベルの高い方法をどうぞ
2017/09/14(木) 19:19:27.73ID:VHoNboqWa
>>175
速度はコードによるから〜でOKなどというものじゃない。
別に、意識してコード書かなくても下記の後半部分にあるようなコードになる。
その上で速度を上げようと意識すれば一番最後のようになる。

http://excel-ubara.com/excelvba4/EXCEL228.html
2017/09/14(木) 19:23:47.78ID:NoiILVtJa
それで駄目ならマルチプロセスにする。
適用出来ないことも多いけどな。
objEx1=CreateObject("Excel.Application")
を複数作ってそれぞれに独立した計算をさせる。
2017/09/14(木) 19:34:05.01ID:IwoZ7QGd0
>>176
ありがとう、ここまで出来るとは思わなかった
他にも関数で高速化極めてて驚いたわ
良いものを見れた
2017/09/14(木) 20:04:51.07ID:EP6SpHBt0
シート作ったりセルに書き込んだりというエクセル側の操作をすると、
その度にイベントが走ることになるから、これを如何に抑えるかってのが重要なんだけど、
最初から全部覚えようとするとパンクする。
2017/09/14(木) 20:30:17.25ID:8w8A3LKI0
どんだけ頑張ってコード書いても、大量の演算は結局ピボットの方が高速なんだよな
2017/09/14(木) 22:08:17.65ID:/NzRhjzgM
For i = Lbound(X) to Ubound(X)

a = MATCH関数でXを検証

if XとMATCH関数が一致 Then

For j = Lbound(Z,2) to Ubound(Z,2)

Z(k,j) = cells(a,j-1).value

k = k + 1

next j

end if

Debug.print i

Next i

Xは要素が3万ほど
シートの列数も3万ほどでXと同じ値を格納
シートの列数は50程度

これでDebug.printの表示感覚が1秒ごとくらいなんだけど遅いですか?
30000 * 50 = 150000ループ
実に8時間ほどで納得行かない遅さなんです
2017/09/14(木) 22:14:39.02ID:IwoZ7QGd0
>>181
ファイルを上げてくれないか
実際に試してみないと分からん
2017/09/14(木) 22:16:42.03ID:EP6SpHBt0
>>181
そのコードの処理を見る限り、早くする方法はいくらでもあるけど、
処理がくっそ遅いMatch関数使って何かやってるんだから処理速度的にはそんなもんじゃないの。
2017/09/14(木) 22:18:51.12ID:CAJlFz9z0
何をするプログラムなのか最初に書いてくれないと、どこを観点に見ればいいかわからない

まあ、とにかくRangeを二重ループで触っちゃイカンよ

つーか、>>124と同じ課題か?
2017/09/14(木) 22:22:13.96ID:/NzRhjzgM
>>182
仕事用なんですいません…

>>183
MATCH関数遅いんですか?
元は3万行のシート回してたけどそれも遅かったんでMATCH関数使ったんですが
2017/09/14(木) 22:33:58.37ID:EP6SpHBt0
もしかして学校課題か何かか。三万行って。
2017/09/14(木) 22:37:11.21ID:XVFgKdZv0
MATCHもmatch_typeに1か-1を指定した時はバイナリサーチだから遅くないよ
0を指定してるとリニアサーチだから件数に比例して遅くなる
2017/09/14(木) 23:03:43.05ID:XSiUnmrc0
学校の課題なら手伝わんぞ、それはカンニングだw
2017/09/14(木) 23:08:26.96ID:6XISNqi7M
>>186
駆け出しのマです

>>187
少ない件数なら激早なんですけど多いと影響あるんですね

仕事だから検証に時間さくわけにもいかないけど納得行かないんですよね
連休に試してみますね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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