!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
探検
Excel VBA 質問スレ Part50 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 7e6d-ffY6)
2017/08/27(日) 12:40:17.57ID:LjjEWylk0110デフォルトの名無しさん (ワッチョイ b66d-Jt/Q)
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
何が分からんのか具体的に
後多分コードが間違っている
Sub a()
For Each target In Range("C2:C6")
'セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプロパティを使って取得する
temp = StrConv(target.Value, vbUpperCase)
'置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
target.Value = temp
Next
End Sub
111デフォルトの名無しさん (ワッチョイ ff1e-uK4n)
2017/09/10(日) 15:15:05.13ID:7PCuqjJO0112デフォルトの名無しさん (アウアウカー Sa43-G+Vk)
2017/09/10(日) 15:15:26.00ID:lVUuTaKfa というか、どうしても解除されたくなかったらxllアドインとかにすべきでしょ。
113デフォルトの名無しさん (ワッチョイ ff86-8cOM)
2017/09/10(日) 16:45:46.81ID:ciO3Bw990 >>100
それ持ち逃げしてもばれないよね
それ持ち逃げしてもばれないよね
114デフォルトの名無しさん (ワッチョイ 5ab3-R8ON)
2017/09/10(日) 17:52:32.57ID:MQQa++S20115デフォルトの名無しさん (ワッチョイ 0b11-r1nS)
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
何がわからないのか全然わからない
そのソースコードを実行するとどうなるのか、期待値は何なのか書かないと
まあ、ひとまず 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
116デフォルトの名無しさん (ワッチョイ 17e4-60Gy)
2017/09/11(月) 01:14:13.54ID:cJ5w3XMz0 >>115
1セルずつループして処理すればtempを配列にする必要なんてない
どうでもいいけど、全角はvbWideじゃないのかね
全角スペースを半角にするのはReplaceあたり使えば良いんじゃね
課題ならその課題出した奴に聞けよと思うが
1セルずつループして処理すればtempを配列にする必要なんてない
どうでもいいけど、全角はvbWideじゃないのかね
全角スペースを半角にするのはReplaceあたり使えば良いんじゃね
課題ならその課題出した奴に聞けよと思うが
117デフォルトの名無しさん (ドコグロ MM92-Qch9)
2017/09/11(月) 07:33:49.76ID:/uQ7pno7M >>115
速度稼ぐために配列にしてるなら読み出し側もやるべき
速度稼ぐために配列にしてるなら読み出し側もやるべき
118デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
2017/09/11(月) 07:48:20.80ID:y+HHQfcAp119デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/11(月) 08:13:17.53ID:ngQru/Z5d >>105
矢印の業務が空行の状態が問題文、矢印の行は君が書いた、と解釈した。
矢印1行目は、vbuppercaseじゃなくて、vbwide。uppercaseは大文字だ。
2行目は、target=temp
そういう問題じゃないようだが、高速化するなら、
Rangeを配列に代入
配列内で計算
配列をrangeに書き戻し
する。
矢印の業務が空行の状態が問題文、矢印の行は君が書いた、と解釈した。
矢印1行目は、vbuppercaseじゃなくて、vbwide。uppercaseは大文字だ。
2行目は、target=temp
そういう問題じゃないようだが、高速化するなら、
Rangeを配列に代入
配列内で計算
配列をrangeに書き戻し
する。
120デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/11(月) 08:14:49.10ID:ngQru/Z5d121デフォルトの名無しさん (ワッチョイ 17e4-60Gy)
2017/09/11(月) 15:42:49.07ID:cJ5w3XMz0 なんで君らは
>置換後の値の全角スペースを半角スペースに変換し
は放置なの?
>置換後の値の全角スペースを半角スペースに変換し
は放置なの?
122デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/11(月) 20:27:23.15ID:X8qu52Lad123デフォルトの名無しさん (ワッチョイ e36f-xkdj)
2017/09/12(火) 02:00:32.49ID:qJTGUifI0 target=replace(temp, "全角スペースと読んでくれ", " ")
124デフォルトの名無しさん (ワッチョイ 23ea-hBAF)
2017/09/12(火) 23:06:27.96ID:cxYAECV80 3万行前後ある列のデータの隣セルに、別シート5000行前後の列から、if条件に該当したものをループで貼り付ける処理をしているけど処理が遅い
3万行の列が外側ループi、5000行の列が内側ループjで回してる
処理時間短縮の為に、最初にiとjのデータを配列で取得して比較を行い
該当するものをセルに出力するように変更した結果、配列使用前より処理時間が短くなった
もっと処理時間を早くするにはどうすればいいかお知恵をください
3万行の列が外側ループi、5000行の列が内側ループjで回してる
処理時間短縮の為に、最初にiとjのデータを配列で取得して比較を行い
該当するものをセルに出力するように変更した結果、配列使用前より処理時間が短くなった
もっと処理時間を早くするにはどうすればいいかお知恵をください
125デフォルトの名無しさん (アークセー Sx3b-zX58)
2017/09/12(火) 23:14:30.57ID:e4D1CdNrx126デフォルトの名無しさん (ワッチョイ db8f-m+++)
2017/09/12(火) 23:23:18.75ID:hrwgqvSF0 >>124
別シート5000をディクショナリーに放り込んで、引いてくれば良いんでない?その手の話で高速化したいなら二重ループはナンセンス。
別シート5000をディクショナリーに放り込んで、引いてくれば良いんでない?その手の話で高速化したいなら二重ループはナンセンス。
127デフォルトの名無しさん (ワッチョイ 173d-QyhX)
2017/09/12(火) 23:27:05.41ID:aYCmToqI0128デフォルトの名無しさん (ワッチョイ 5a11-oWo5)
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/
アルゴリズムだけ考えたらバイナリサーチより
ハッシュテーブルのほうが速そうなもんだけどな
ここに載ってるDOUBLE TRUE VLOOKUPを試してみてよ
lookupの時間だけ比較してもDictionaryより速いらしいんだが
http://analystcave.com/excel-vlookup-vs-index-match-vs-sql-performance/
アルゴリズムだけ考えたらバイナリサーチより
ハッシュテーブルのほうが速そうなもんだけどな
129デフォルトの名無しさん (ワッチョイ 23ea-xkdj)
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
ありがとうございます!
これは普通のキーワードでネットで調べてもヒットした記憶がないワードです
今後に活用させていただきます
ありがとうございます!
なるほど、コレクションかディクショナリーで連想配列を使用すれば早いってことか
イマイチ使い方が分からず使用していなかった
大量にデータを処理する場合は活用すれば、処理が早くなる可能性があるって事なんですね
今後は意識して使わせていただきます
>>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
ありがとうございます!
これは普通のキーワードでネットで調べてもヒットした記憶がないワードです
今後に活用させていただきます
130デフォルトの名無しさん (ワッチョイ 17e4-60Gy)
2017/09/13(水) 00:32:10.56ID:/gH6Ji+W0 ハッシュテーブルはハッシュの算出方法で変わるからな
対象データに対して衝突が少なくて計算の軽いハッシュ関数じゃないと
対象データに対して衝突が少なくて計算の軽いハッシュ関数じゃないと
131デフォルトの名無しさん (ワッチョイ 173d-QyhX)
2017/09/13(水) 00:58:34.20ID:SpyxPvDF0 >>129
配列とセルは相互に直接的なやりとりが出来るんで調べてみて。
いちいちループ回さなくていいから。
簡単に言えば
Dim A As Variant
A = Range(範囲).Cells
とすれば配列Aに範囲の中身が入り、
Range(範囲) = A
とすれば配列Aの中身が範囲に入る。
配列とセルは相互に直接的なやりとりが出来るんで調べてみて。
いちいちループ回さなくていいから。
簡単に言えば
Dim A As Variant
A = Range(範囲).Cells
とすれば配列Aに範囲の中身が入り、
Range(範囲) = A
とすれば配列Aの中身が範囲に入る。
132デフォルトの名無しさん (スプッッ Sd5a-cc0f)
2017/09/13(水) 07:30:42.98ID:F7IQARkod ネットでエクセルVBAを勉強中なんですがオススメ参考本とかないでか?
特にユーザーフォームを使って作業が多いです。
特にユーザーフォームを使って作業が多いです。
133デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
2017/09/13(水) 07:35:00.26ID:W36Ef0cBp >>124
条件の内容にもよるけど、ワークシート関数のvlookupは使えないの?
条件の内容にもよるけど、ワークシート関数のvlookupは使えないの?
134デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/13(水) 08:14:57.58ID:6syv7XXEd135デフォルトの名無しさん (ワッチョイ a773-a2m6)
2017/09/13(水) 08:26:49.86ID:B5ndS4Fj0 お前VBAスレの自称初心者だろW
136デフォルトの名無しさん (ワッチョイ b66d-x/0H)
2017/09/13(水) 08:46:51.19ID:ldXoybWh0137107 (ワッチョイ 8a2e-NEns)
2017/09/13(水) 09:25:03.74ID:C9n8lcte0 たかがソフト買うのに個人情報を洗いざらい要求してくるセキュリティ企業って・・・
なんで俺の住所や電話番号がいるんだよ。なんに使う気だ
しかもダウンロードしようとしたら送ってきたパスワード
そっくりコピペなのにエラー出るじゃねえか
大丈夫かここ
なんで俺の住所や電話番号がいるんだよ。なんに使う気だ
しかもダウンロードしようとしたら送ってきたパスワード
そっくりコピペなのにエラー出るじゃねえか
大丈夫かここ
138デフォルトの名無しさん (ブーイモ MM26-zp6i)
2017/09/13(水) 10:51:59.22ID:mbz5MtUcM 会社紹介を見る限りまともじゃなさそう
ツールの中身も海外フォーラムに載ってるソースコピペしてたりしてな
ツールの中身も海外フォーラムに載ってるソースコピペしてたりしてな
139デフォルトの名無しさん (ワッチョイ 173d-QyhX)
2017/09/13(水) 12:27:02.45ID:SpyxPvDF0 標準のワークシート関数ってVBAで作ってある上に、色々な目的に使えるように冗長性があるから、
目的に対して最も効率的な処理方法であるという条件下だと処理時間は必ず
ワークシート関数 ≧ VBAマクロ
が成り立つ。
特にVLookupとかはセル毎に走査してるから共有可能な部分も個別に計算してるんで効率面はお察し。
ただしワークシート関数とほぼ同じ機能をVBAマクロで実装するのが時間の無駄って事もあるので、
マクロ内でワークシート関数を利用するという状況を考えるのは難しくない。
目的に対して最も効率的な処理方法であるという条件下だと処理時間は必ず
ワークシート関数 ≧ VBAマクロ
が成り立つ。
特にVLookupとかはセル毎に走査してるから共有可能な部分も個別に計算してるんで効率面はお察し。
ただしワークシート関数とほぼ同じ機能をVBAマクロで実装するのが時間の無駄って事もあるので、
マクロ内でワークシート関数を利用するという状況を考えるのは難しくない。
140デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/13(水) 12:34:53.43ID:Uwuz4mw5d141デフォルトの名無しさん (オッペケ Sr3b-Sbom)
2017/09/13(水) 12:45:19.24ID:W3E85BX/r お前らが書いた腐ったvbaコードよりワークシート関数が遅いとかw
どんだけ頭がお花畑なんだよw
どんだけ頭がお花畑なんだよw
142デフォルトの名無しさん (ワッチョイ 5f67-liDa)
2017/09/13(水) 13:09:42.32ID:Prl309L10 ワークシート関数は条件さえ整えばマルチスレッドで動くぞ
確実にVBAより早いわ
確実にVBAより早いわ
143デフォルトの名無しさん (ワッチョイ 173d-QyhX)
2017/09/13(水) 13:55:24.11ID:SpyxPvDF0 https://msdn.microsoft.com/ja-jp/library/office/bb687899.aspx
公式ページ↑見ると2007からマルチスレッディングになってるらしいけど、
経験上、同じ様な目的の実装で処理時間が
VBAマクロ > ワークシート関数
になった事がないんだよな。
十分に最適化されたVBAマクロよりもワークシート関数の方が処理が早くなるって状況の具体例があれば参考になるんだけど、
そもそも目的が違うのもあってワークシート関数が重いからユーザー定義関数を作りましょうみたいなページしか見当たらない。
公式ページ↑見ると2007からマルチスレッディングになってるらしいけど、
経験上、同じ様な目的の実装で処理時間が
VBAマクロ > ワークシート関数
になった事がないんだよな。
十分に最適化されたVBAマクロよりもワークシート関数の方が処理が早くなるって状況の具体例があれば参考になるんだけど、
そもそも目的が違うのもあってワークシート関数が重いからユーザー定義関数を作りましょうみたいなページしか見当たらない。
144デフォルトの名無しさん (スププ Sdba-m+++)
2017/09/13(水) 14:13:42.05ID:/h+OIrtOd145デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
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(職場のクソマシン)だから、また今は違うのかもしれないけど。
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(職場のクソマシン)だから、また今は違うのかもしれないけど。
146デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
2017/09/13(水) 14:23:19.54ID:W36Ef0cBp FORのところ i=1 だね
手打ちなんで許して
手打ちなんで許して
147デフォルトの名無しさん (ワッチョイ 173d-QyhX)
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の方はヒットしない数字があるとエラー吐く。
もっとフェアなデータでやれば話は違ってくるかもしれないけど、この例だとワークシート関数の方が遅いね。
うーん、
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の方はヒットしない数字があるとエラー吐く。
もっとフェアなデータでやれば話は違ってくるかもしれないけど、この例だとワークシート関数の方が遅いね。
148デフォルトの名無しさん (ワッチョイ 5a11-oWo5)
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++使って最適化してるから
[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++使って最適化してるから
149デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
2017/09/13(水) 15:47:56.64ID:W36Ef0cBp150デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
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
ごめん、いろいろとおかしかった
Range("B1:B30000")="vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value
151デフォルトの名無しさん (ササクッテロレ Sp3b-kWVg)
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
しばらくROMります…
Range("B1:B30000")="=vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value
152デフォルトの名無しさん (ワッチョイ db8f-m+++)
2017/09/13(水) 23:54:00.93ID:qFUPeADD0153デフォルトの名無しさん (ワッチョイ 81ea-SGtB)
2017/09/14(木) 00:05:19.65ID:QvPDzzeD0 >>124で処理時間高速化の質問させてもらった者です
>>131
ありがとうございます!
このスレの内容にあるようにセルを配列に入れてから、if文は配列同士で比較して、結果も配列で取得するように修正しました
配列の値を、一度にセル範囲に出力するコードに修正したら8分前後かかっていた処理が、1分〜2分前後になって、処理時間がめちゃめちゃ早くなって快適になりました
みなさんが言われてるように、VBAでワークシート関数を使用した場合の処理時間は、
おなじみオフィス田中さんのページに、配列をセル範囲に出力するのと同じぐらいの処理時間が高速だと書いてありますね
3万行と比較する列データが、複数シートで複数列だったので、次回同じような処理を作成する時は
VLOOKUP用の一時シートを追加して、3万行の列を一番左の列の検索キーにして、比較列はVLOOKUPで取得する実装をしてみます
>>131
ありがとうございます!
このスレの内容にあるようにセルを配列に入れてから、if文は配列同士で比較して、結果も配列で取得するように修正しました
配列の値を、一度にセル範囲に出力するコードに修正したら8分前後かかっていた処理が、1分〜2分前後になって、処理時間がめちゃめちゃ早くなって快適になりました
みなさんが言われてるように、VBAでワークシート関数を使用した場合の処理時間は、
おなじみオフィス田中さんのページに、配列をセル範囲に出力するのと同じぐらいの処理時間が高速だと書いてありますね
3万行と比較する列データが、複数シートで複数列だったので、次回同じような処理を作成する時は
VLOOKUP用の一時シートを追加して、3万行の列を一番左の列の検索キーにして、比較列はVLOOKUPで取得する実装をしてみます
154デフォルトの名無しさん (スププ Sdb3-YAaM)
2017/09/14(木) 08:15:22.18ID:l8z8iklHd >>153
分単位はかかり過ぎだと思うなぁ。
データや環境の違いがあるから、純粋に比較はできんだろうが、124の内容を素直に読んでコード書いて動かして見たが、100msecかからんかったよ。
ちな、
3万行のデータを配列1に丸ごと代入
5千行のデータを配列2に丸ごと代入
配列2から辞書を作成
配列1を先頭から順に見て、辞書に存在しない値を消す
3万行データの隣に配列1を丸ごと貼る
分単位はかかり過ぎだと思うなぁ。
データや環境の違いがあるから、純粋に比較はできんだろうが、124の内容を素直に読んでコード書いて動かして見たが、100msecかからんかったよ。
ちな、
3万行のデータを配列1に丸ごと代入
5千行のデータを配列2に丸ごと代入
配列2から辞書を作成
配列1を先頭から順に見て、辞書に存在しない値を消す
3万行データの隣に配列1を丸ごと貼る
155デフォルトの名無しさん (ワッチョイ 7973-sgiV)
2017/09/14(木) 08:29:32.22ID:+i9FPPOB0 配列にして一括で読み書きする
これが全てだよ
これが全てだよ
156デフォルトの名無しさん (スップ Sdf3-GtKF)
2017/09/14(木) 10:18:54.39ID:dILqaQ/Ld VBAにも新規参入者がいて20年くらい前の話題が新たになされるのにちょっと感動した
157デフォルトの名無しさん (ワッチョイ c91e-Gbox)
2017/09/14(木) 11:15:17.22ID:XfGri2Pk0 Windows10のアップデートでIEオブジェクトの挙動がまた変わったらしい?
データ収集とかしてる人はアップデートしない方がいいかも
データ収集とかしてる人はアップデートしない方がいいかも
158デフォルトの名無しさん (ワッチョイ 016f-SGtB)
2017/09/14(木) 12:34:44.93ID:MnqZaJ520 配列 オブ カリビアン
159デフォルトの名無しさん (スップ Sdf3-GtKF)
2017/09/14(木) 12:36:58.88ID:dILqaQ/Ld この期にIEオブジェクトをわざわさ生成するやり方はやめたらいいと思う
160デフォルトの名無しさん (ワッチョイ 5b6d-M8tZ)
2017/09/14(木) 12:39:57.29ID:IwoZ7QGd0 vbaでスクレイピングはねぇ
161デフォルトの名無しさん (アウアウカー Sa1d-+tv6)
2017/09/14(木) 12:42:41.16ID:YtbuHggLa162デフォルトの名無しさん (ワッチョイ db23-p+ov)
2017/09/14(木) 14:27:44.29ID:gZf88W9A0 あるシートに所属するプロシージャから
自分の所属するシートを参照するにはどうしたらいいのでしょうか?
プロシージャを他のシートにコピペしたら
コードを書き換えなくてもコピペ先のシートを参照するようなコードを
書きたいのですが
自分の所属するシートを参照するにはどうしたらいいのでしょうか?
プロシージャを他のシートにコピペしたら
コードを書き換えなくてもコピペ先のシートを参照するようなコードを
書きたいのですが
163デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 14:33:45.54ID:EP6SpHBt0164デフォルトの名無しさん (ワッチョイ db23-p+ov)
2017/09/14(木) 14:54:53.92ID:gZf88W9A0 >>163
いや、むしろシートを飛び越えないでほしいんですが
シートで完結した処理にしたいのでシート名や番号による
シートの指定を排除して、所属するシートのセルを参照したいのですが
検索して調べるとセルを参照する方法としては
シート名を決め打ちする方法ばかりが出てくるので困っているのです
いや、むしろシートを飛び越えないでほしいんですが
シートで完結した処理にしたいのでシート名や番号による
シートの指定を排除して、所属するシートのセルを参照したいのですが
検索して調べるとセルを参照する方法としては
シート名を決め打ちする方法ばかりが出てくるので困っているのです
165デフォルトの名無しさん (バットンキン MMd3-u5aB)
2017/09/14(木) 15:38:59.34ID:lm5VBVU0M Active Sheet とSheet名以外でSheet 特定できるんだっけ?
166デフォルトの名無しさん (ワッチョイ 7973-sgiV)
2017/09/14(木) 15:49:13.64ID:+i9FPPOB0 application.callerでチェックボックスの動きの判定をするようにしたらメチャ重いんだが、これなんとかならない?
167デフォルトの名無しさん (ワッチョイ 5b6d-TkIQ)
2017/09/14(木) 15:52:46.83ID:IwoZ7QGd0168デフォルトの名無しさん (ワッチョイ 5b6d-TkIQ)
2017/09/14(木) 15:53:31.32ID:IwoZ7QGd0 セルはもちろんこんな感じね
Sub foo()
Debug.Print Me.Cells(1, 1)
End Sub
Sub foo()
Debug.Print Me.Cells(1, 1)
End Sub
169デフォルトの名無しさん (ワッチョイ 5b6d-TkIQ)
2017/09/14(木) 15:54:13.48ID:IwoZ7QGd0170デフォルトの名無しさん (ワッチョイ 7973-sgiV)
2017/09/14(木) 15:57:20.47ID:+i9FPPOB0171デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 15:58:45.31ID:EP6SpHBt0 >>164
シートモジュールに直書きする場合はSheetsの部分を省略してCellsやRangeから書ける。
シートを指定しない場合の振る舞いが、
標準モジュールではActiveSheet(見えているシート)だったものが、
シートモジュールではそのシートに限定されるという変化をするので併用する場合は注意が必要。
シートモジュールに直書きする場合はSheetsの部分を省略してCellsやRangeから書ける。
シートを指定しない場合の振る舞いが、
標準モジュールではActiveSheet(見えているシート)だったものが、
シートモジュールではそのシートに限定されるという変化をするので併用する場合は注意が必要。
172デフォルトの名無しさん (ワッチョイ 5b6d-TkIQ)
2017/09/14(木) 16:00:47.13ID:IwoZ7QGd0 標準モジュールに書いて、対象シートはsetした方がいいと思うけどなぁ
173デフォルトの名無しさん (ワッチョイ db23-p+ov)
2017/09/14(木) 16:02:42.23ID:gZf88W9A0174デフォルトの名無しさん (アウアウカー Sa1d-+tv6)
2017/09/14(木) 18:24:24.22ID:EcWTQGUxa175デフォルトの名無しさん (ワッチョイ 5b6d-UUct)
2017/09/14(木) 18:59:59.93ID:IwoZ7QGd0 >>174
ではレベルの高い方法をどうぞ
ではレベルの高い方法をどうぞ
176デフォルトの名無しさん (アウアウカー Sa1d-+tv6)
2017/09/14(木) 19:19:27.73ID:VHoNboqWa >>175
速度はコードによるから〜でOKなどというものじゃない。
別に、意識してコード書かなくても下記の後半部分にあるようなコードになる。
その上で速度を上げようと意識すれば一番最後のようになる。
http://excel-ubara.com/excelvba4/EXCEL228.html
速度はコードによるから〜でOKなどというものじゃない。
別に、意識してコード書かなくても下記の後半部分にあるようなコードになる。
その上で速度を上げようと意識すれば一番最後のようになる。
http://excel-ubara.com/excelvba4/EXCEL228.html
177デフォルトの名無しさん (アウアウカー Sa1d-+tv6)
2017/09/14(木) 19:23:47.78ID:NoiILVtJa それで駄目ならマルチプロセスにする。
適用出来ないことも多いけどな。
objEx1=CreateObject("Excel.Application")
を複数作ってそれぞれに独立した計算をさせる。
適用出来ないことも多いけどな。
objEx1=CreateObject("Excel.Application")
を複数作ってそれぞれに独立した計算をさせる。
178デフォルトの名無しさん (ワッチョイ 5b6d-UUct)
2017/09/14(木) 19:34:05.01ID:IwoZ7QGd0179デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 20:04:51.07ID:EP6SpHBt0 シート作ったりセルに書き込んだりというエクセル側の操作をすると、
その度にイベントが走ることになるから、これを如何に抑えるかってのが重要なんだけど、
最初から全部覚えようとするとパンクする。
その度にイベントが走ることになるから、これを如何に抑えるかってのが重要なんだけど、
最初から全部覚えようとするとパンクする。
180デフォルトの名無しさん (ワッチョイ 8123-sgiV)
2017/09/14(木) 20:30:17.25ID:8w8A3LKI0 どんだけ頑張ってコード書いても、大量の演算は結局ピボットの方が高速なんだよな
181デフォルトの名無しさん (オイコラミネオ MM6b-mPfK)
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時間ほどで納得行かない遅さなんです
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時間ほどで納得行かない遅さなんです
182デフォルトの名無しさん (ワッチョイ 5b6d-laG6)
2017/09/14(木) 22:14:39.02ID:IwoZ7QGd0183デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 22:16:42.03ID:EP6SpHBt0184デフォルトの名無しさん (ワッチョイ b111-7vJj)
2017/09/14(木) 22:18:51.12ID:CAJlFz9z0185デフォルトの名無しさん (オイコラミネオ MM6b-mPfK)
2017/09/14(木) 22:22:13.96ID:/NzRhjzgM186デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 22:33:58.37ID:EP6SpHBt0 もしかして学校課題か何かか。三万行って。
187デフォルトの名無しさん (ワッチョイ 1311-T94+)
2017/09/14(木) 22:37:11.21ID:XVFgKdZv0 MATCHもmatch_typeに1か-1を指定した時はバイナリサーチだから遅くないよ
0を指定してるとリニアサーチだから件数に比例して遅くなる
0を指定してるとリニアサーチだから件数に比例して遅くなる
188デフォルトの名無しさん (ワッチョイ 118f-YAaM)
2017/09/14(木) 23:03:43.05ID:XSiUnmrc0 学校の課題なら手伝わんぞ、それはカンニングだw
189デフォルトの名無しさん (オイコラミネオ MM6b-mPfK)
2017/09/14(木) 23:08:26.96ID:6XISNqi7M190デフォルトの名無しさん (ワッチョイ 5b6d-A1Wv)
2017/09/14(木) 23:20:59.58ID:IwoZ7QGd0191デフォルトの名無しさん (ワッチョイ 118f-YAaM)
2017/09/14(木) 23:22:39.03ID:XSiUnmrc0 マ?
クベ??
クベ??
192デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/14(木) 23:37:20.66ID:EP6SpHBt0193デフォルトの名無しさん (ワッチョイ 93aa-o7xi)
2017/09/15(金) 00:05:39.06ID:N1D7768S0 緑郎?
194デフォルトの名無しさん (ワッチョイ 13b3-e6pT)
2017/09/15(金) 05:58:01.90ID:mR9ZEtfo0 駆け出しママ?
195デフォルトの名無しさん (アークセー Sx4d-+IhZ)
2017/09/15(金) 12:58:58.26ID:DPkC9aElx >>172
オブジェクト変数多用は速度低下の一因になるぞ
オブジェクト変数多用は速度低下の一因になるぞ
196デフォルトの名無しさん (ワッチョイ 016f-SGtB)
2017/09/15(金) 13:29:55.54ID:+lt7NDiE0 駆け出しのマトリ?
197デフォルトの名無しさん (スプッッ Sdf3-6PtN)
2017/09/15(金) 17:41:48.27ID:YuOtTZO+d 表示シートのセルA1に『SD11』と入力してからコマンドボタン1を押したらマスターシートのA列をFINDで検索かけて下に一行ずつ表示シートの項目別にそれぞれ転記するにはどうすればいいですか?
検索まで出きるんですが、転記とループのやり方が分かりません。
https://i.imgur.com/Bd3WIPk.jpg
https://i.imgur.com/3IPhNPk.jpg
検索まで出きるんですが、転記とループのやり方が分かりません。
https://i.imgur.com/Bd3WIPk.jpg
https://i.imgur.com/3IPhNPk.jpg
198デフォルトの名無しさん (ワッチョイ 993d-XDX8)
2017/09/15(金) 19:01:40.44ID:HxJpFmSs0 >>197
たぶんこれ、マスターシート?の一行目が項目になっている事から、
編集→テーブルでテーブル化してフィルタで絞ってコピペした方が早いんじゃないの。
種類の所だけ
Sub foo()
For Each x In Range("A1:A12")
if Len(x.Value) Then y = x.Value Else x.Value = y
Next
End Sub
みたいな形で空白を埋めるようにして。
たぶんこれ、マスターシート?の一行目が項目になっている事から、
編集→テーブルでテーブル化してフィルタで絞ってコピペした方が早いんじゃないの。
種類の所だけ
Sub foo()
For Each x In Range("A1:A12")
if Len(x.Value) Then y = x.Value Else x.Value = y
Next
End Sub
みたいな形で空白を埋めるようにして。
199デフォルトの名無しさん (ワッチョイ c1f8-7vJj)
2017/09/16(土) 07:57:41.80ID:CZKDCudP0 どっちがマスターシートかすらわからないのは俺だけなのか?
200デフォルトの名無しさん (ワッチョイ 016f-SGtB)
2017/09/16(土) 08:55:03.94ID:8PfQF6Zm0 動物記を書いた方
201デフォルトの名無しさん (ワッチョイ 5b6d-laG6)
2017/09/16(土) 08:57:29.36ID:0Tj0yPF60 それはファーブル
202デフォルトの名無しさん (ワッチョイ 9306-XDX8)
2017/09/16(土) 09:10:57.56ID:ZdfhdKJM0 シートンさん、涙
203デフォルトの名無しさん (ワッチョイ 9311-BsvU)
2017/09/16(土) 11:39:45.69ID:NmFgsGO20204デフォルトの名無しさん (ササクッテロレ Sp4d-dVTt)
2017/09/16(土) 17:35:52.97ID:ZtR64OGap excel2010使ってます。
apiを使ってアプリケーション外の任意の座標のピクセル情報を監視していますが、視覚的に監視している場所がわからないので、当該場所にbitmapを最前面に描画したいのですが、良い方法はないでしょうか?
あるいは、マウスのカーソルをその位置に描画する。とかも考えています。
apiを使ってアプリケーション外の任意の座標のピクセル情報を監視していますが、視覚的に監視している場所がわからないので、当該場所にbitmapを最前面に描画したいのですが、良い方法はないでしょうか?
あるいは、マウスのカーソルをその位置に描画する。とかも考えています。
205デフォルトの名無しさん (オッペケ Sr4d-Ec1/)
2017/09/16(土) 18:35:05.61ID:uv+MHauzr206デフォルトの名無しさん (ワッチョイ 1311-T94+)
2017/09/16(土) 19:17:26.63ID:gf/ZkNkm0207デフォルトの名無しさん (アウアウカー Sa1d-+tv6)
2017/09/16(土) 21:10:59.05ID:XK5pYCg9a >>206
昔、そういうプログラム書いてたな。
CreateCompatibleDCとか。
GDI+はステータスバーの数字を取得する為に使ったことがある。
よくあるウインドウハンドルから取得する方法やUIAutomation使う方法で取得出来なかったんで直接Bitbltかなんかで描画してるとしか思えなかった時に。
昔、そういうプログラム書いてたな。
CreateCompatibleDCとか。
GDI+はステータスバーの数字を取得する為に使ったことがある。
よくあるウインドウハンドルから取得する方法やUIAutomation使う方法で取得出来なかったんで直接Bitbltかなんかで描画してるとしか思えなかった時に。
208デフォルトの名無しさん (ワッチョイ 136c-XDX8)
2017/09/17(日) 15:05:48.02ID:QbcXsmvT0 vbaでpdfをこのようにバイナリ変換?して仕事で使うサイトにpostしたいのですがどうすれば変換できますか?
https://imgur.com/iztKsA6.jpg (普通のブラウザで送信した際の通信データを出力したもの)
ググった結果出てきたバイナリ変換?は2種類試しましたが↓変換はされるのですが形式が違うのか上手くいきませんでした(文字化けの感じも違いました)
strfilenameにはpdfのフルパスが入ります
Function GetFile2(strFileName As String) As String
Dim strFile As String
Dim nFile
' Grap the file
nFile = FreeFile
' Open strFileName For Binary As #nFile
Open strFileName For Binary As #nFile
strFile = String(LOF(nFile), " ")
Get #nFile, , strFile
Close #nFile
GetFile = strFile
End Function
Function GetFile(strFileName As String) As String
Dim FileContents() As Byte, FileNumber As Integer
ReDim FileContents(FileLen(strFileName) - 1)
FileNumber = FreeFile
Open strFileName For Binary As FileNumber
Get FileNumber, , FileContents
Close FileNumber
GetFile = StrConv(FileContents, vbUnicode)
End Function
https://imgur.com/iztKsA6.jpg (普通のブラウザで送信した際の通信データを出力したもの)
ググった結果出てきたバイナリ変換?は2種類試しましたが↓変換はされるのですが形式が違うのか上手くいきませんでした(文字化けの感じも違いました)
strfilenameにはpdfのフルパスが入ります
Function GetFile2(strFileName As String) As String
Dim strFile As String
Dim nFile
' Grap the file
nFile = FreeFile
' Open strFileName For Binary As #nFile
Open strFileName For Binary As #nFile
strFile = String(LOF(nFile), " ")
Get #nFile, , strFile
Close #nFile
GetFile = strFile
End Function
Function GetFile(strFileName As String) As String
Dim FileContents() As Byte, FileNumber As Integer
ReDim FileContents(FileLen(strFileName) - 1)
FileNumber = FreeFile
Open strFileName For Binary As FileNumber
Get FileNumber, , FileContents
Close FileNumber
GetFile = StrConv(FileContents, vbUnicode)
End Function
209デフォルトの名無しさん (ワッチョイ 1311-T94+)
2017/09/17(日) 15:23:31.58ID:EJ9y/eYt0 >>208
pdfは元々バイナリファイル
それをテキストエディタで開けばその画像みたいになる
エディタで開く時のエンコーディングが違えば文字化けの見た目も変わる
postするときになんで変換しないといけないの?
pdfは元々バイナリファイル
それをテキストエディタで開けばその画像みたいになる
エディタで開く時のエンコーディングが違えば文字化けの見た目も変わる
postするときになんで変換しないといけないの?
210デフォルトの名無しさん (ワッチョイ 136c-XDX8)
2017/09/17(日) 15:37:36.74ID:QbcXsmvT0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【悲報】日本人「日本が中国と戦争になったら世界中の国が応援してくれるぞ!」 [616817505]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 【ほんこん悲報】吉本新喜劇の中国公演が中止に! [523957489]
