Excel VBA 質問スレ Part40 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/02/19(金) 02:49:44.77ID:BQQ9mWtn___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part39 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1448624205/
0083デフォルトの名無しさん
2016/02/23(火) 06:08:52.47ID:lspxNReJ自分でアルゴリズムが作れないならとにかくシートに貼り付けるところから考えればいい。
0084デフォルトの名無しさん
2016/02/23(火) 07:11:53.03ID:tgtxIEFp「逐次」
0085デフォルトの名無しさん
2016/02/23(火) 07:53:21.43ID:x6PbDvqzcsv取り込みがいささか面倒ですね
Excelでcsv開いても無理ですよね?
0086デフォルトの名無しさん
2016/02/23(火) 08:05:21.80ID:lTXJyxC1ExcelシートにCSVを展開してからだったら楽だよ。
0087デフォルトの名無しさん
2016/02/23(火) 08:33:55.17ID:dOD1hw4aいつも通りの取り込みでよいのですか?
0088デフォルトの名無しさん
2016/02/23(火) 09:43:37.39ID:lTXJyxC1ええ、いつも通りです。
0089デフォルトの名無しさん
2016/02/23(火) 20:15:06.28ID:BnRj76xX配列を全て検索してデータを探すのはどちらが早いですか?
又配列に重複がないか調べる方法ってありませんか?
0090デフォルトの名無しさん
2016/02/23(火) 20:30:17.62ID:lspxNReJ検索のみで言えば、全検索で一つの値を探すならFindの方が早い。
列や行が決まっているなら配列にした方がいい。FindもMatchも遅い。
重複は条件にもよるけど基本的には総当たりしかない。こちらは配列にした方がいい。
0091デフォルトの名無しさん
2016/02/23(火) 21:43:21.45ID:BnRj76xXループでかなり時間はかかりませんか?
0092デフォルトの名無しさん
2016/02/23(火) 21:57:12.88ID:tgtxIEFp0093デフォルトの名無しさん
2016/02/23(火) 22:01:35.23ID:tgtxIEFpまたは配列をソートしておくか。
どちらも条件によっては悪手になりうる。
0094デフォルトの名無しさん
2016/02/23(火) 22:04:04.73ID:BnRj76xX500件と固定してある場合なら楽ですか?
0095デフォルトの名無しさん
2016/02/23(火) 22:08:03.06ID:tgtxIEFpn × n とは比べものにならないでしょ。
0096デフォルトの名無しさん
2016/02/23(火) 22:10:32.56ID:Fn93HfAc0097デフォルトの名無しさん
2016/02/23(火) 22:14:54.95ID:tgtxIEFp言っとくけど、長さ1000の配列で重複の個数を数える(つまり途中でやめない)という条件で、
なおかつ余計なオーバーヘッドのあるプログラムを使って約600msだぞ。(Core i5)
考えすぎても無駄じゃね?
0098デフォルトの名無しさん
2016/02/23(火) 22:27:42.52ID:BnRj76xXありがとうございます
まあソート後に配列内の数値を計算する程度ですね
配列でApplication.WorksheetFunction.RoundDownは使用できましたよね?
0099デフォルトの名無しさん
2016/02/23(火) 22:35:08.14ID:tgtxIEFp0100デフォルトの名無しさん
2016/02/23(火) 23:19:55.40ID:KN7Xij53ディクショナリーを使うと良いよー
0101デフォルトの名無しさん
2016/02/24(水) 09:14:07.67ID:y1msax47イマイチよくわからない
どっちも似たような事出来るよね
0102デフォルトの名無しさん
2016/02/24(水) 09:38:25.57ID:tgj274Poでもワークシートから大量に取り込むのに向いてるかどうかは知らない。
また、重複のないデータのセットを構築するという目的を達成した後、何かしら処理をするんだろうが、
汎用性としてどうなのかも知らん。
まあ使ってみて判断しよ。
0103デフォルトの名無しさん
2016/02/24(水) 19:47:18.17ID:ZfArvAzSすいません、オートシェイプを操作するマクロを作りたいのですが
このようなパターンのとき、
画像のD,Eを逆の位置にマクロで動かすことは可能でしょうか?
コネクタは繋がっている前提です。
0104デフォルトの名無しさん
2016/02/24(水) 20:32:17.95ID:/kngbYQwコネクタが オートシェイプに接続されてる状態なら そのシェイプを移動するだけでいい
たとえばこんな感じ(D と E の位置が逆になる)
Set D = ActiveSheet.Shapes("Rectangle D")
Set E = ActiveSheet.Shapes("Rectangle E")
'Dの位置保存
Save_LEFT = D.Left
Save_TOP = D.Top
'Dの位置を変更
D.Left = E.Left
D.Top = E.Top
'Eの位置を変更
E.Left = Save_LEFT
E.Top = Save_TOP
0105デフォルトの名無しさん
2016/02/24(水) 23:53:18.08ID:qODGIMFEどっちの方が実装楽ですか?
0106デフォルトの名無しさん
2016/02/25(木) 00:55:43.58ID:hzvqnnNR確かDictionaryは参照設定しないと使えないけど値の書き換えが出来て、
Collectionはそのまま使えるけど値を変えるときは一度Removeしてからもう一度追加しなければいけないとか
そんなのがあったような
0107デフォルトの名無しさん
2016/02/25(木) 05:54:34.79ID:BSgblPDpへー、ちょっと違うところもあるんだね
勉強になった、ありがとう
でもディクショナリーはファイルシステムオブジェクトと同じで
Microsoft Scripting Runtime (scrrun.dll)を参照設定すると便利になるけど
参照設定しなくてもCreateObjectすれば使えるよ
0108デフォルトの名無しさん
2016/02/25(木) 06:29:43.10ID:s0Et/ttK順序が必要なものはCollection型で、重複しない事が重要なものはDictionary型にするといいのかも。
ところでKeyとItemが相互に検索可能な型ってないかな。
DictionaryでもItemからKeyを割り出すには総当たりする必要があるんだよね。
だから相互に検索したい場合は必ずKey,ItemとItem,Keyの二種類作らないといけないのが難点。
0109デフォルトの名無しさん
2016/02/25(木) 07:02:34.77ID:mCYGSnMqクラスモジュールで自分好みなの作ったほうがよくないか?
0110デフォルトの名無しさん
2016/02/25(木) 07:49:00.88ID:L7nuKMZK0111103
2016/02/25(木) 10:28:36.61ID:GyIo03vyこらタコ。
そのまんまじゃないか。
そうじゃなく、
シェイプがたくさんあり、それらがコネクタでつながっていたとき、
すべてのコネクタが交差しないように自動配置したいとき
それはどういうコードを書けばいいのかな、と考えているのですが。
0112デフォルトの名無しさん
2016/02/25(木) 10:38:33.06ID:zmh5F+ll0113103
2016/02/25(木) 11:04:27.27ID:GyIo03vyそれだと
1つのシェイプから2つのコネクタが分岐するように下につながっている場合に
2つのシェイプが重なってししまわないですか?
シートに存在するすべてのコネクタでそれが分岐してるものかどうか判定する方法があればいいのですが。
シェイプやコネクタに便利なプロパティとかないですか?
0114デフォルトの名無しさん
2016/02/25(木) 11:15:21.22ID:L7nuKMZK分岐してる場合のずらしかたをまず定義しろ。
下方向や横方向のスペースの有無にもよるのか?
0115デフォルトの名無しさん
2016/02/25(木) 11:32:52.44ID:mCYGSnMq座標がわかるんだから
交差してるか計算すればいいじゃん
中学生レベルの数学
0116デフォルトの名無しさん
2016/02/25(木) 12:47:36.07ID:6DvGm9a+そもそも>>103の時点できちんと要件を提示していなかった癖に、回答者に対して悪態をつくとか
君の親御さんはマトモな躾も出来なかったのか?
要するにシェイプの移動ではなくコネクタを交差させないシェイプの配置を考える問題なら、まずは一つのシェイプは最大でいくつのコネクタに繋がってるのかとか、それがループする事は有り得るのかとか、そういう基礎的な条件提示がなけりゃだれにも回答できねーよ
(例えばループの中と外にあるシェイプ同士を何処とも交差せずに繋ぐのは不可能だしね)
そこまでややこしくない単純な樹形図みたいなやつなら
上流から順に見ていって縦横際限なく使えば良いだけじゃん
0117デフォルトの名無しさん
2016/02/25(木) 12:54:41.32ID:5AA/JocP0118デフォルトの名無しさん
2016/02/25(木) 12:59:54.85ID:YW3/y7UA0119デフォルトの名無しさん
2016/02/25(木) 13:53:09.83ID:UlMFP09hCollectionも順番が保証されなかった気がする。
0120デフォルトの名無しさん
2016/02/25(木) 20:29:01.53ID:2hov+RINもう15年以上 VBA 使ってたけど Collection でキーが指定出来るのを今知ったわ OTZ…
でもキーが存在するかを確認するすべがない(全て検索するかエラートラップで判定するしかない)
なんかこう言う大事なところが抜けてるんだよな、MSって
>>119
追加するときにシートの追加と同じように追加する場所も指定できるみたいだから、順序は保持されるっぽい
http://vbafrs.com/common/doc/main.php?contentsno=201003
0121デフォルトの名無しさん
2016/02/25(木) 20:56:13.16ID:s0Et/ttKむしろエラーで返すからキャッチすりゃいいだろ的な思想の様な気がする。
他のエラーが入り込まない単位に関数化してエラーで返す方が処理速い事もあるし(シートの指定とか)、
そうでないと調べられないものもある。(配列の次元数カウントとか)
0122デフォルトの名無しさん
2016/02/25(木) 20:59:59.00ID:EtQljN7P0123デフォルトの名無しさん
2016/02/25(木) 21:13:17.22ID:2hov+RIN> むしろエラーで返すからキャッチすりゃいいだろ的な思想の様な気がする。
それが気にくわないって話
ファイルオープンみたいにどうしようもないケースならわかるが、ExistKey( ) みたいなのをつけるだけでいいのに
てか、キーでアクセスできる仕様にしたら普通そういう手段用意しないか?
0124デフォルトの名無しさん
2016/02/25(木) 21:27:38.70ID:EtQljN7PCount( ) でいいんじゃない?
0125デフォルトの名無しさん
2016/02/25(木) 21:28:26.65ID:EtQljN7P0126デフォルトの名無しさん
2016/02/25(木) 21:53:09.39ID:s0Et/ttKCollection型は列挙が目的であって、Mapする事が目的のDictionary型とは違うだろうし。
0127デフォルトの名無しさん
2016/02/25(木) 23:29:01.95ID:ZlQNTHYh> Collection型は列挙が目的
なら Key なんて要らんだろ
やってることがちぐはぐなんよ
0128デフォルトの名無しさん
2016/02/25(木) 23:43:14.65ID:EtQljN7P0129デフォルトの名無しさん
2016/02/26(金) 05:08:03.17ID:ep0rFBnFWorkbooksやWorksheetsを人間の管理単位(=Key)で指定できたら便利だけど、
それが何番目であるかと常に結びつける必要性は薄いだろ。
あくまで人間の管理単位だから重複さえしなければマシン側は混乱しないし。
0130デフォルトの名無しさん
2016/02/26(金) 07:19:07.84ID:RsrUGJ3O>WorkbooksやWorksheetsを人間の管理単位(=Key)で指定できたら便利だけど、
>それが何番目であるかと常に結びつける必要性は薄いだろ。
WorkbooksやWorksheetsを扱うのにKeyを指定するのは
それが何番目であるかにKeyを使うのと同じくらい必要性が薄いかな。
普通そのWorkbookやWorksheets固有の処理を行うときは多態性で始末するから。
0131デフォルトの名無しさん
2016/02/26(金) 07:53:52.54ID:SzRtePL20132デフォルトの名無しさん
2016/02/26(金) 08:20:16.24ID:RsrUGJ3Oどう言う意味で?
WorkbookやWorksheetで個別の処理を行うのに多態性を使うと言ったら
そのWorkbookやWorksheetの役割に合わせて振る舞いを変えるように
コンポジションやデリゲーションを使って組むようなことをこちらは想定してるけど。
他に何か捉えようがあるということ?
0133デフォルトの名無しさん
2016/02/26(金) 08:28:40.81ID:SzRtePL20134デフォルトの名無しさん
2016/02/26(金) 08:44:27.62ID:RsrUGJ3O同じ型?何を言ってるんだ?
0135デフォルトの名無しさん
2016/02/26(金) 11:14:38.11ID:J5IqE0Yl問題は大きさが大きくなったとき他のシェイプと重なることを避けたいけどその判定が困難。
なにかいい方法はありますか?
単純に大きさを変えるときに重なるかどうか調べるときに他のすべてのシェイプと
For Each tmpShape in Activesheet.Shapes
を使って1つ1つ比べるのですが
もし重なりそうなら重なられるシェイプを右下方向に移動したいのですが
その移動によってまた「連鎖的に」重なる可能性があるわけじゃないですか?
言ってる意味はわかりますかね?
0136デフォルトの名無しさん
2016/02/26(金) 11:16:23.46ID:J5IqE0Ylo その方法が困難
0137デフォルトの名無しさん
2016/02/26(金) 11:17:50.55ID:J5IqE0Yl0138デフォルトの名無しさん
2016/02/26(金) 11:47:55.97ID:SzRtePL2君は>>130で何を言ってるんだい?
WorkSheets(1)とWorkSheets(2)に異なる処理を施すときに多態性で始末するんだろう?
0139デフォルトの名無しさん
2016/02/26(金) 12:04:49.44ID:l/+aTNAI処理の最後に重なりがなくなるまでDoループすればどうかな。
0140デフォルトの名無しさん
2016/02/26(金) 12:12:44.30ID:ZKuQ06pRそうだよ。それで?続けて。
0141デフォルトの名無しさん
2016/02/26(金) 12:16:28.41ID:J5IqE0Ylアドバイスありがとうございます。
でもそれってアルゴリズム的には同じじゃないですか?
もしよろしければ具体的なコードを教えてほしいのですが。
たとえばシェイプがActivesheet.Shapes.Count個あって
大きさを変える場合は右にincX、下にincYだけ増やしたいとします。
重なるかの判定の関数は、
Function isOverlap (shp1 as Shape, shp2 as Shape) as Boolean
とでもすると
Doループの中のコードはどんな感じになりますか?
0142デフォルトの名無しさん
2016/02/26(金) 12:20:47.73ID:x5+an1W20143デフォルトの名無しさん
2016/02/26(金) 12:25:05.60ID:SzRtePL2>>131の質問に答えよ
0144デフォルトの名無しさん
2016/02/26(金) 12:27:35.29ID:ZKuQ06pRだからそうだって答えてるじゃない。
それにどんな矛盾があるのか聞いてるんだけど。
だから続けてと言っている。
0145デフォルトの名無しさん
2016/02/26(金) 12:35:08.69ID:ZKuQ06pRむしろこっちが、そっちがどう思ってるのか聞きたいわ。
同じクラスで作成したインスタンスの振る舞いの違いを「多態性」と呼ばないということは、
.NetでいうDelegate、つまりVBAでそれはないが同じ結果を求めることが出来るCall By Nameとかは
「多態性」とは呼ばないと言っているんだよね。
これは何でだ?
0146デフォルトの名無しさん
2016/02/26(金) 12:44:05.19ID:ZKuQ06pRネットで見てたらちょうどいい文言があったので、これを使わせてもらう。
「実行される処理の実体が、コールされたメッセージではなく、メッセージを受けたオブジェクトによって決定される性質」のこと。
VBAでは継承が使えないので移譲とか委託と言われている方式を使う。
それを持って多態性と呼ぶということでいいか?
0147デフォルトの名無しさん
2016/02/26(金) 12:56:50.89ID:SzRtePL2ああ、それでいいよ。悪かった。
こっちは「WorkSheetオブジェクトが属するクラスを実行時に変えて多態するほげふがな方法」の話かと期待していた。
0148デフォルトの名無しさん
2016/02/26(金) 17:17:06.66ID:m7cX7XjEworksheet_Changeじゃわかりませんよね?
0149デフォルトの名無しさん
2016/02/26(金) 19:54:13.01ID:J5IqE0YlそれをCollectionに入れるとき
各シェイプのLeftプロパティとTopプロパティをこの順でソートして並べ替えるには
いい方法はありますか?
ひょっとして全部自分でソートのコードを0から書かないといけませんか?
0150デフォルトの名無しさん
2016/02/26(金) 20:07:18.31ID:SzRtePL20151デフォルトの名無しさん
2016/02/26(金) 20:13:56.67ID:ep0rFBnF問題はその「メッセージを受けたオブジェクト」によって、
「始末する」としている>>130の主張がどういう意図なのかなんだけどな。
0152デフォルトの名無しさん
2016/02/26(金) 20:54:08.51ID:ep0rFBnFソートアルゴリズムならWorksheetに一回吐き出せば優秀なのが使える。
0153デフォルトの名無しさん
2016/02/26(金) 20:59:38.60ID:faygSoUQ良い書き方があるなら教えてほしい
0154デフォルトの名無しさん
2016/02/26(金) 21:11:11.85ID:SzRtePL2サイトは覚えてはないけど、VBAでのクイックソートのサンプルは結構上がってる。
難しさは求める汎用性の程度にもよるだろうけど。
0155デフォルトの名無しさん
2016/02/27(土) 00:59:46.12ID:RZH3xb+7これはよく読むと、一般的なSortプログラムは必要なさそうだね。
「Collectionに入れるとき」と明言しているということは、まだCollectionには何も入ってないときのスタートになるので、
最初の1回目は普通にaddして、その後はCollectionに積み立てたShapeを捜査し、Leftプロパティが
追加対象の同プロパティより大きくなった、またはLeftプロパティが同じでTopプロパティが追加対象の同プロパティより大きくなったとき、
その前に追加してやればいいんじゃないかな?
0156デフォルトの名無しさん
2016/02/27(土) 18:10:19.33ID:AaTWQGJlあらかじめセルの幅をshapeが被らないぐらい大きくしといて、
あとからセルの幅を自動で調整すれば良いだけでは?
0157デフォルトの名無しさん
2016/02/27(土) 20:28:26.50ID:IvmFPQhFWorksheets("Sheet1").Select
これを1行で記述する方法はありますか?
0158デフォルトの名無しさん
2016/02/27(土) 20:35:34.69ID:LKPjzWREWorkbooks("1.xls").Activate: Worksheets("Sheet1").Select
もし1命令でって言うんなら無理
そのブックをSelectだけ出来ればよいなら
Workbooks("1.xls").Worksheets("Sheet1").Select
で出来る
0159デフォルトの名無しさん
2016/02/27(土) 20:40:06.27ID:B9pq57vqWorkbooks("1.xls").Worksheets("Sheet1").Select
こういう事じゃ無いのか?
0160デフォルトの名無しさん
2016/02/27(土) 20:40:54.65ID:IvmFPQhFありがとうございました。すっきりしました。
0161デフォルトの名無しさん
2016/02/27(土) 20:44:40.73ID:IvmFPQhFありがとうございました。
0162デフォルトの名無しさん
2016/02/27(土) 20:45:04.02ID:GQuhwfDJ0163デフォルトの名無しさん
2016/02/27(土) 20:50:07.41ID:B9pq57vqVBAマクロのHowToサイトで「マクロの記録機能を使ってみましょう」という教え方してる限り無くならないだろうな。
既存の有名なサイトを凌駕するようなExcelVBAマクロのサイトを作る以外にない。
0164デフォルトの名無しさん
2016/02/27(土) 22:14:34.86ID:TnvXsjWdもうちょっと品ぞろえを増やしてさー、〜べからず集とかないの?
0165デフォルトの名無しさん
2016/02/27(土) 23:35:53.32ID:qno9RqRgべつにいーじゃん
それでうごくんだから
0166デフォルトの名無しさん
2016/02/27(土) 23:55:03.39ID:TnvXsjWd0167デフォルトの名無しさん
2016/02/28(日) 00:04:29.01ID:wJzAdt4L変数名は一文字にするべからずとか、
このスレでコードは書くべからずとか?
0168デフォルトの名無しさん
2016/02/28(日) 00:41:52.16ID:b7qY0//80169デフォルトの名無しさん
2016/02/28(日) 00:56:15.60ID:sl3mg8QGそれを考慮せずに推奨・非推奨の話を始めると宗派の問題もあって泥沼になる。
0170デフォルトの名無しさん
2016/02/28(日) 02:49:21.29ID:/1Tq8dlSよねさんの解説では
myStr = "ABCDEFG"
Range("B3").Value = Right(myStr, 3)
一度変数に置き換えて抽出していますがわずらわしので
A1セルなどのセルに記載された数値や文言をダイレクトに指定して
文字を抽出するにはどうすればいいのでしょうか?
0171デフォルトの名無しさん
2016/02/28(日) 02:51:41.53ID:/1Tq8dlSこれを書いて投稿したとたんに思いつきました!ww
Sub aa()
Range("B3").Value = Right(Range("a1"), 3)
End Sub
これでできるのですね。事故解決!!
0172デフォルトの名無しさん
2016/02/28(日) 02:58:01.82ID:/1Tq8dlSあと例文に考える余地が隠されていて考えないと例文が理解できないようになっていたりするので急いでいると非常にむかつきます。
複数のレベルで例文が記載されてたらもっと使う人が増えると思うが
私は極力見ないようにしています。
0173デフォルトの名無しさん
2016/02/28(日) 03:02:16.63ID:/1Tq8dlS0174デフォルトの名無しさん
2016/02/28(日) 03:09:34.52ID:sl3mg8QG・ここはお前の日記帳じゃないんだ。チラシの裏にでも書いてろ。
・そんな低レベルな事すら分かってないのに緊急でマクロ作るとか悪手過ぎるだろ。
0175デフォルトの名無しさん
2016/02/28(日) 06:44:27.28ID:3hiq91mT0176デフォルトの名無しさん
2016/02/28(日) 09:45:37.94ID:emPXsfmMぜいたく言っちゃいかんと思う。
0177デフォルトの名無しさん
2016/02/28(日) 10:46:32.90ID:5Fk6wisRどういいうことでしょう?
シェイプの話をしているのになぜセルの幅の話になるのでしょう?
0178デフォルトの名無しさん
2016/02/28(日) 11:14:42.81ID:jDjzCPWr悪いけどプログラマー向かないと思う。
0179デフォルトの名無しさん
2016/02/28(日) 11:30:36.79ID:kYd0kHZJ0180デフォルトの名無しさん
2016/02/28(日) 12:44:17.68ID:5n5R60tK誰ともわからないターゲットに向けて書くんだから。
>>178
急にどうした?話が飛躍してるぞ。
0181デフォルトの名無しさん
2016/02/28(日) 12:51:47.81ID:awPHDJ6K月末の深夜という時間を考えると
切実な思いではないかと勘ぐってしまう
0182デフォルトの名無しさん
2016/02/28(日) 12:57:49.47ID:sl3mg8QG■ このスレッドは過去ログ倉庫に格納されています