!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:LjjEWylk0115デフォルトの名無しさん (ワッチョイ 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:QbcXsmvT0211デフォルトの名無しさん (ワッチョイ 136c-XDX8)
2017/09/17(日) 18:33:42.58ID:QbcXsmvT0 そしてこれが>>208のマクロでpdfを変換してvbaから投稿した時のpostしているデータです
https://i.imgur.com/0LlxHf3.png
明らかに文字化けの雰囲気が違うこれだと投稿したpdfを開こうとしても「画像データに不足があります」と出てpdfが開けません
postデータは同じツールで表示していますのでvbaでの変換の方法に問題があるのかと思ってます
>>208の画像がこの画像と違ってどういう形式?なのか分かれば調べようもあると思うのですがいかがでしょうか
https://i.imgur.com/0LlxHf3.png
明らかに文字化けの雰囲気が違うこれだと投稿したpdfを開こうとしても「画像データに不足があります」と出てpdfが開けません
postデータは同じツールで表示していますのでvbaでの変換の方法に問題があるのかと思ってます
>>208の画像がこの画像と違ってどういう形式?なのか分かれば調べようもあると思うのですがいかがでしょうか
212デフォルトの名無しさん (ワッチョイ 5b6d-M8tZ)
2017/09/17(日) 19:10:29.54ID:qW/WD7mR0 バイナリ変換とか変なことをするからややこしくなっている
データの解析なんてせんでいい
ファイルは素直にファイルのまま扱えばok
http://www.excel.studio-kazu.jp/kw/20140404154224.html
で、ここ見ておもったんだけど、htmlファイル作ってform用意して、submitすればいいだけじゃない?
ファイルが何個もあるとめんどくさいけど
データの解析なんてせんでいい
ファイルは素直にファイルのまま扱えばok
http://www.excel.studio-kazu.jp/kw/20140404154224.html
で、ここ見ておもったんだけど、htmlファイル作ってform用意して、submitすればいいだけじゃない?
ファイルが何個もあるとめんどくさいけど
213デフォルトの名無しさん (ワッチョイ 136c-XDX8)
2017/09/17(日) 21:01:40.83ID:QbcXsmvT0 >>212
前にそちらのサイトも参考にさせて頂いて、投稿はできたのですがpdfが開けなくて、
送信データももっとひどい文字化けになってしまい諦めてました
https://imgur.com/p1huKGY.jpg
unicodeで送信しているのを調整する必要があると書かれていたのですがそれが原因でしょうか・・・
ちなみに自分の使い方としてはそのサイトのようにグループウェアのキャビネットに投稿する形では無く、
仕事で使っているサイトのフォームで投稿する際に添付ファイルとしてpdfを付けるのが目的なのですが
下の方に書いてあるのはSet objIE = CreateObject("Internetexplorer.Application") 的なIEに直接vbaでsubmitさせるメソッドの事でしょうか?
今のところ、投稿する際にプルダウンや入力フォームで様々な値を入力しなければならなくて、
添付ファイルが無い状態での投稿は問題無く行えるようになったのですが
添付ファイルだけはどうにも壊れてしまうというのが現状なので何とかpdfもこのままpostできないかなぁ・・・というのが現状です
説明が下手で申し訳ないのですがどなたかアドバイス頂けたらと思います
前にそちらのサイトも参考にさせて頂いて、投稿はできたのですがpdfが開けなくて、
送信データももっとひどい文字化けになってしまい諦めてました
https://imgur.com/p1huKGY.jpg
unicodeで送信しているのを調整する必要があると書かれていたのですがそれが原因でしょうか・・・
ちなみに自分の使い方としてはそのサイトのようにグループウェアのキャビネットに投稿する形では無く、
仕事で使っているサイトのフォームで投稿する際に添付ファイルとしてpdfを付けるのが目的なのですが
下の方に書いてあるのはSet objIE = CreateObject("Internetexplorer.Application") 的なIEに直接vbaでsubmitさせるメソッドの事でしょうか?
今のところ、投稿する際にプルダウンや入力フォームで様々な値を入力しなければならなくて、
添付ファイルが無い状態での投稿は問題無く行えるようになったのですが
添付ファイルだけはどうにも壊れてしまうというのが現状なので何とかpdfもこのままpostできないかなぁ・・・というのが現状です
説明が下手で申し訳ないのですがどなたかアドバイス頂けたらと思います
214デフォルトの名無しさん (ワッチョイ 11af-6PtN)
2017/09/18(月) 11:37:33.30ID:d9P11nJN0 セルB4から始めて、右に8列‘’○‘’を順番に書き込んでからB5に下がってまた8列書き込む。それを10行繰り返すにはどういうコードになります?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 20代の3割が「テレビ見ない」現実…そして静かに広がる「究極のテレビ離れ」とは [muffin★]
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
- んなっしょい🍬禁止🈲のお🏡
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 高市早苗「……なんて言ってみたw」中国「なんだ、言ってみただけかw」👈これで全部元通りになるという事実 [782460143]
- 【悲報】ガラパゴス島国ジャップ、自分達の容姿が優れてると錯覚してしまう [383063292]
