Excel VBA 質問スレ Part39 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/11/27(金) 20:36:45.35ID:9HV+ag/s___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0565デフォルトの名無しさん
2016/01/23(土) 17:01:45.55ID:2O2OeDHJ本来だったら配列を昇順ソートしてからバイナリサーチやれば圧倒的に速くなるがね。
0566デフォルトの名無しさん
2016/01/23(土) 17:20:35.71ID:Ub1PC2hCCurrencyならEmptyチェックする必要ないんじゃない
後はそこだけで速くするのは難しそう
俺なら配列に値セット/変更する時に値チェックしてカウントするようにするかなぁ
案外配列じゃなくセルに展開して、カウントする数式入れたセル見た方が早いかもしれん
0567デフォルトの名無しさん
2016/01/23(土) 18:14:06.44ID:5/HkQk/m配列数式でできた
0568デフォルトの名無しさん
2016/01/23(土) 19:34:03.73ID:7fmpCrJtこの状態でどれぐらいの時間がかかってるのか教えろハゲ
0569デフォルトの名無しさん
2016/01/23(土) 19:41:11.42ID:UyBsumDJ調べてみましたが、やや難しそうです。(:;)
>>566
Emptyは必要ないですね//
配列をA列とB列にいったん貼り付けてワークシート関数で調べる方法ですよね。
ひとまず、やってみます!
>>567
使い方教えていただけますでしょうか?
SHL = WoksheetFunction.Countifs(Range( ),">60",Range( ) ,"HL")みたいな形で使えそうです。
0570デフォルトの名無しさん
2016/01/23(土) 19:45:35.16ID:G5thoHAj0571デフォルトの名無しさん
2016/01/23(土) 19:46:50.85ID:UyBsumDJ他のループも合わせてからの推測ですが50msぐらいです。
0572デフォルトの名無しさん
2016/01/23(土) 19:54:39.20ID:d6eRWlmRエクセルの1シートを1テーブルに見立ててデータの抽出、計算をしようと思っています。
ただデータの検索をクエリを書くのと同様に行えるのかが気になっています。
例えばSQLだとselect * from t where c < 10 and c > 0 と範囲検索が簡単に出来ますが、
エクセルvbaだとfind、findnext結果を順々に見ていくしかないんでしょうか?
access使えと言われるかも知れませんが自分も作ったものを使う人も
使ったことないので使う予定でないです。
0573デフォルトの名無しさん
2016/01/23(土) 19:55:52.13ID:UyBsumDJサンプルで作ってみたのですが、思った通りの動作ができません・・・
改善点をお分かりになりますでしょうか?
Sub jikkou()
Dim Keyword As Range
Dim CheckList As Range
Dim Checkcolumn As Long
With ActiveWorkbook.Worksheets("Sheet1")
Set Keyword = .Range("F2:F4") '順に田中、山田、井上
Set CheckList = .Range("A2:C9")
Checkcolumn = 2
Call Test(Keyword, CheckList, Checkcolumn)
End With
End Sub
0574デフォルトの名無しさん
2016/01/23(土) 20:12:01.85ID:9iIZKcSaたぶんSheet1に書いてない
0575デフォルトの名無しさん
2016/01/23(土) 22:41:50.10ID:rT+4QcAA使ったことないけどODBCでExcel読めるんだから同じように出来るんじゃなかろうか
0576デフォルトの名無しさん
2016/01/23(土) 22:56:00.52ID:VVSBE+9kODBCだけど
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
で普通にWHEREが効いたよ。
0577デフォルトの名無しさん
2016/01/23(土) 23:11:55.10ID:Lyhv/FJb0578デフォルトの名無しさん
2016/01/23(土) 23:31:40.97ID:d6eRWlmR>>576
成る程!
エクセルからODBCする発想はありませんでした。
ありがとうございます。
0579デフォルトの名無しさん
2016/01/24(日) 00:52:16.69ID:3BacWB5Qunion(range("A1:A3"),range("A4:A6")).select
とすると A1:A6がセレクトされてしまいます
A1:A3,A4:A6とばらばらに選択させるにはどうしたらいいのでしょうか
0580デフォルトの名無しさん
2016/01/24(日) 01:02:59.65ID:8yNc66kpRange("A1:A3, A4:A6").Select
0581デフォルトの名無しさん
2016/01/24(日) 01:24:07.69ID:3BacWB5QRangeを使った場合
少ないとOKなのですが
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90").Select
多いとエラーになってしまうんですよ
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90,
A91:A93,A94:A96,A97:A99,A100:A102,A103:A105,A106:A108,A109:A111,A112:A114,A115:A117,A118:A120,A121:A123,A124:A126,A127:A129,A130:A132,
A133:A135,A136:A138,A139:A141,A142:A144,A145:A147,A148:A150,A151:A153,A154:A156,A157:A159,A160:A162,A163:A165,A166:A168").Select
0582デフォルトの名無しさん
2016/01/24(日) 04:40:05.83ID:QDUQ11dLunion使いたくないってことなら適当な長さで区切って処理していくしかないね
0583デフォルトの名無しさん
2016/01/24(日) 08:31:19.18ID:P3FwbSRP0584デフォルトの名無しさん
2016/01/24(日) 08:43:14.19ID:OLLhmKw50585デフォルトの名無しさん
2016/01/24(日) 10:14:46.19ID:EERzV+Td0586デフォルトの名無しさん
2016/01/24(日) 10:17:27.22ID:U2BkwJ1U0587デフォルトの名無しさん
2016/01/24(日) 10:54:59.26ID:jAR/7hik理研の職員がwinnyでウィルス感染→個人情報流出?2
http://wc2014.2ch.net/test/read.cgi/rikei/1284822425/
27 名前:名無しゲノムのクローンさん[] 投稿日:2015/05/07(木) 22:59:50.36 ID:dgLqosr8Q
http://www.riken.jp/research/labs/bsi/behav_neurophysiol/
姓が変わってる
0588デフォルトの名無しさん
2016/01/24(日) 11:50:42.56ID:OLLhmKw5Selection.Offset(1).Insert
0589デフォルトの名無しさん
2016/01/24(日) 12:16:54.98ID:CzW7EpCeRange("A1:A168").Select
0590デフォルトの名無しさん
2016/01/24(日) 13:20:11.62ID:9Re4pm4/これ誰かわかりませんかね?
単純にループで要素をとって変換してるんですけどもっと効率よく書く方法知りたいんですけど
0591デフォルトの名無しさん
2016/01/24(日) 14:43:43.40ID:kddwELVpまず目的がわからない。Variant配列のままではできないことが何かあるの?
0592デフォルトの名無しさん
2016/01/24(日) 14:48:25.07ID:Qp0DBCKEそれでいいだろ
型が全然違うものをどうやってキャストするつもりなんだよ?
0593デフォルトの名無しさん
2016/01/24(日) 19:54:05.71ID:ZDzZlqZ2なんでできないんだってクレームだろうね
0594デフォルトの名無しさん
2016/01/24(日) 21:03:26.31ID:bw3MWu8t> ダブルからバリアントはできるから
はあ?
0595デフォルトの名無しさん
2016/01/24(日) 21:18:18.78ID:kddwELVpそれは原理的に無理だ。
0596デフォルトの名無しさん
2016/01/24(日) 21:31:15.52ID:LpWoFh+wオブジェクト指向はそういうの普通にやりますけど。
あれですか?
C言語しかしらない人ですか?
0597デフォルトの名無しさん
2016/01/24(日) 21:51:00.06ID:kddwELVpつ 配列
0598デフォルトの名無しさん
2016/01/24(日) 22:03:39.50ID:ZDzZlqZ2ポインタ渡すだけじゃないの
int型をオブジェクト指向のバリアントに渡すのは結局ループさせてると思うけどw
0599デフォルトの名無しさん
2016/01/24(日) 22:39:14.22ID:ZDzZlqZ2できるなら、そこからはじめよう
0600デフォルトの名無しさん
2016/01/24(日) 22:42:25.30ID:vxhR0ZQc今やってるのはセルのレンジをvbaでvariant配列として受ける→doubleの配列に変更したいというわけです。
0601デフォルトの名無しさん
2016/01/24(日) 22:46:42.39ID:kddwELVpdllを改変してVariant配列を受け取るようにしなさい。
C++側で工夫すれば中身がdouble配列でもinteger配列でもハンドリングできる。
0602デフォルトの名無しさん
2016/01/24(日) 22:49:15.03ID:kddwELVp0603デフォルトの名無しさん
2016/01/24(日) 23:16:09.36ID:ZDzZlqZ2valiantは仕組みがわかったとしてプログラムは難しいというか
メリットがあるのかどうか結局
doubleの配列に渡してdllに渡すプログラムになるだろ
正規ユーザーならマイクロソフトに聞いたらどうだ
0604デフォルトの名無しさん
2016/01/24(日) 23:31:31.52ID:CzW7EpCeそれがVBAの決まり
0605デフォルトの名無しさん
2016/01/25(月) 00:00:11.24ID:OVAwI95a自己レス
名前機能を組み合わせて最大1291の連続するセル範囲を選択することに成功しました
連続する単一セルならば最大2788
マクロだとこれが限界なのかなぁ
0606デフォルトの名無しさん
2016/01/25(月) 03:16:47.81ID:x8k2PtIT0607デフォルトの名無しさん
2016/01/25(月) 06:54:36.14ID:ZbEgu09Eそもそも変換どころか、キャストしたい
って話だしな
「自分のやりたいことは簡単に書ける方法が絶対あるはず教」の信者さんでしょ
0608デフォルトの名無しさん
2016/01/25(月) 07:04:40.46ID:ZbEgu09EVariant の仕様は MSDN に書いてあるし、API もあるから難しくはないよ
double しか渡されない(double 以外は保証しないよ)と言う仕様でいいなら double の配列の読み書きとたいして変わらん
お前は、それ以前に
> doubleの配列に渡してdllに渡すプログラムになるだろ
と言うワケわからん日本語書くのをやめれ
0609デフォルトの名無しさん
2016/01/25(月) 07:25:28.63ID:kQZEtAkwへえ。Object指向に普通にVariant型があると思ってるのか?
馬鹿だろお前。Object指向だろうがなんだろうがキャスト出来ないものはキャスト出来ねーよ。
Variant型変数にDouble型の配列を入れたと言うなら型変換しなくても使えるが、
Variant型の配列に突っ込んだ値をと言ってるんだろ?
て言うか、C++なんて糞言語ここで持ち出すなよ。ここ何のスレだか知ってて書いてるのか?
0610デフォルトの名無しさん
2016/01/25(月) 07:58:42.36ID:PYOqNH8O0611デフォルトの名無しさん
2016/01/25(月) 08:16:46.72ID:Ymzzk2Ep0612デフォルトの名無しさん
2016/01/25(月) 10:30:52.42ID:Ymzzk2Epでも一度作ってしまえばそれだけで対応できるから、型別に配列を扱うより結局ラクになる。
0613デフォルトの名無しさん
2016/01/25(月) 19:45:11.59ID:h5WdPhTZ以下の「ActiveSheet〜」のところで、を「変数が定義されていません」とエラーが出てしまいます。
ActiveSheetはどう変数定義すればよろしいのでしょうか?
--
Sub particles()
Worksheets(2).Activate
Dim x0, y0, x1, y1, x2, y2, r As Integer
x0 = 300
y0 = 300
x1 = 0
y1 = 0
x2 = 0
y2 = 100
r = 20
AcitiveSheet.Shapes.AddShape(msoShapeOval, x0 + x1 - r, y0 + y1 - r, 2 * r, 2 * r).Select
(以下略)
0614デフォルトの名無しさん
2016/01/25(月) 20:20:34.36ID:tSs+i5nu何かの理由でAddShapeが失敗してるとか
0615デフォルトの名無しさん
2016/01/25(月) 20:20:39.23ID:EI0NNUYrスペルミス よく見てみ
0616デフォルトの名無しさん
2016/01/25(月) 20:30:20.64ID:S6u4QlwXこんな数学的に説明できない糞言語使いにくいでしょ。
0617デフォルトの名無しさん
2016/01/25(月) 20:32:24.39ID:h5WdPhTZバカでした。すみません。ありがとうございます。
0618デフォルトの名無しさん
2016/01/25(月) 21:35:58.44ID:bhGrjqTq言語を覚えるだけで人生終わっちまう
しかもHaskellって関数型ってヤツで、地球人でも特別な人間にしか理解できないヤツだろ
0619デフォルトの名無しさん
2016/01/25(月) 21:39:21.69ID:6cjSwNuYカーソル移動するとエラーメッセージボックスがでてうっとうしいんですが
どうすればいいですか?
0620デフォルトの名無しさん
2016/01/25(月) 21:43:55.44ID:tSs+i5nu0621デフォルトの名無しさん
2016/01/25(月) 21:44:00.33ID:EI0NNUYr自動構文チェックを off にする
0622デフォルトの名無しさん
2016/01/25(月) 22:02:38.95ID:zDVscmGV0623デフォルトの名無しさん
2016/01/25(月) 22:06:25.75ID:xK2Lk5XQありがとうございます!
0624デフォルトの名無しさん
2016/01/25(月) 22:34:29.77ID:tSs+i5nu0625デフォルトの名無しさん
2016/01/25(月) 23:39:17.97ID:zDVscmGVHaskellでワークシートのデータに簡単にアクセスできてDBも読めるんなら使ってもいいぞ。
0626デフォルトの名無しさん
2016/01/26(火) 03:57:19.80ID:iVTpdqcA0627デフォルトの名無しさん
2016/01/26(火) 08:43:18.81ID:qqVXY/GV説明できないっけ。結構なレベルまで出来るけどなあ
0628デフォルトの名無しさん
2016/01/26(火) 09:18:40.01ID:5vRCDG8F使う環境が違うんだからそもそも比較の対象にならん。
純粋に言語部分だけで比較するんだと言うなら勝手だけど。
0629デフォルトの名無しさん
2016/01/26(火) 18:43:46.24ID:ZKGLEkP4この特殊記号をVBEに書き込む方法を教えてください
0630デフォルトの名無しさん
2016/01/26(火) 19:08:50.23ID:Le1AWrDO0631デフォルトの名無しさん
2016/01/26(火) 20:11:57.90ID:s2VOqCHE0632デフォルトの名無しさん
2016/01/26(火) 20:21:55.06ID:Ss3eGzB+関数型が難しいとか嘘まき散らしてるのはF欄卒の低能だよ。
国立の情報系出てれば普通に使える。
0633デフォルトの名無しさん
2016/01/26(火) 20:35:20.49ID:s2VOqCHE0634デフォルトの名無しさん
2016/01/26(火) 20:36:17.62ID:an9o+4d6自分のVBAには貼り付けできないんです…
なんでだろう…
0635デフォルトの名無しさん
2016/01/26(火) 20:44:20.93ID:s2VOqCHEエディターの設定でフォントは何になってる?
0636デフォルトの名無しさん
2016/01/26(火) 20:47:22.36ID:an9o+4d6まずいのでしょうか?
0637デフォルトの名無しさん
2016/01/26(火) 20:53:14.53ID:s2VOqCHEそのフォントだったら自分のとこでも大丈夫だなあ...
0638デフォルトの名無しさん
2016/01/26(火) 23:13:32.78ID:XA1jjBiE0639デフォルトの名無しさん
2016/01/26(火) 23:59:27.82ID:Ss3eGzB+0640デフォルトの名無しさん
2016/01/27(水) 02:32:20.61ID:FFJgZUiX0641デフォルトの名無しさん
2016/01/27(水) 09:55:13.64ID:AxnKqjSh0642デフォルトの名無しさん
2016/01/27(水) 16:56:55.10ID:M2nAG8/tcnt = 5 '(適当)
For n = 1 to cnt
if n = 1 then cnt = a + b
next n
このようにForLoopのcntをfor内で新たに出す場合、Forループの回数は新たに書き換えられるのでしょうか?
つまり、Forは5回で終わるか、新たに書き換えられるかという問題です。
私の実験で4回中1回書き換えが行われませんでした。詳しい方、ご教授お願いいたします。
0643デフォルトの名無しさん
2016/01/27(水) 17:06:25.62ID:peQY74NrVBAでのドキュメントが見つからないが
Forの終了条件の変数ははじめに評価されたあと再評価されないはず
つまりその例ではcntを書き換えてもnは1から5までしかループしないはず
試してもそうなってるけど、そうならないようなら環境とそのコード教えてくれ
0644デフォルトの名無しさん
2016/01/27(水) 21:23:26.05ID:Tz0t5sQ9怪しかったので、cntを先に求めるよう修正しました。勘違いがあったかもしれません。
再評価をしないということがわかり勉強になりました。ありがとうございます。
0645デフォルトの名無しさん
2016/01/27(水) 21:59:35.79ID:i9TI+OhTFor i = LBound(x) To UBound(x)
って書けるという面もある。
0646デフォルトの名無しさん
2016/01/27(水) 23:03:39.45ID:8GEb3XG20647デフォルトの名無しさん
2016/01/28(木) 00:16:58.40ID:w3bB+ovg実際使うかどうかはまた別だわな
0648デフォルトの名無しさん
2016/01/28(木) 20:19:00.28ID:l8d43dgOFor i = 1 to i
Next
みたいにリサイクルしちゃう事はよくある。
0649デフォルトの名無しさん
2016/01/28(木) 20:55:34.37ID:87VXcHukたまにあるならまだしもよくあるなら向いてない
特にループ変数に i とか使うのはまだわからんでもないが
> i = UBound(arr)
とか書く奴は単なるバカ
0650デフォルトの名無しさん
2016/01/28(木) 21:00:56.80ID:YELEWwrcはたまにやるけどな
0651デフォルトの名無しさん
2016/01/28(木) 21:22:27.24ID:l8d43dgOVBAは変数を宣言するともれなく初期化がついてくるから
これを抑制する為に可読性を損なわない様に工夫しつつリサイクルというのは割と普通だと思うんだけどな。
あとそれなりにVBAをいじってきて何か自負が芽生えてきた時期なんだとは思うけど
非常に限定された例でバカだの向いてないだの言うのは止めた方がいいぞ。
0652デフォルトの名無しさん
2016/01/28(木) 21:22:55.28ID:9fWHkl7Rメモリとか考えずにどういう仕様か注釈なくても
わかるように書け
i = UBound(arr) To LBound(arr) Step -1
と徹底してたら
i = UBound(arr) To 0 Step -1
が特別だと区別がつく
0653デフォルトの名無しさん
2016/01/28(木) 21:27:03.38ID:NmcV3G4Iこれって何かいいことあるの?何か悪いことあるの?>>651
0654デフォルトの名無しさん
2016/01/28(木) 21:28:24.36ID:Px8oTJsB0655デフォルトの名無しさん
2016/01/28(木) 21:41:49.39ID:Og0hCXDt他の言語だとループの終了値が再評価されてループ回数がおかしくなる場合があるし、
それを逆手に取るようなコードをわざと書く場合もある
言語仕様をいちいち確認しなきゃならんようなコードは悪手かなあ
0656デフォルトの名無しさん
2016/01/28(木) 21:58:29.74ID:BRaPySJX良いことなんて特に無い
だって普通に
For i = 1 To UBound(arr)
って書いたほうが読みやすいし行数も少ない
0657デフォルトの名無しさん
2016/01/28(木) 22:11:22.26ID:w3bB+ovgWith New とかやるって旧VBスレで言ってたのを思い出した
0658デフォルトの名無しさん
2016/01/28(木) 22:36:03.92ID:zD2EcWsW> VBAは変数を宣言するともれなく初期化がついてくるから
> これを抑制する為
抑制する理由書いてみ
君のアホさがわかると思う
> 非常に限定された例で
限定されてると思ってる時点で何も理解してないことが良くわかる w
0659デフォルトの名無しさん
2016/01/28(木) 23:00:29.67ID:D0vEBF/42つセルのアドレスを取得したのですが、
そこまで何列離れているかが知りたいのですが、
どうやって求めれば良いでしょうか?
0660デフォルトの名無しさん
2016/01/28(木) 23:25:11.76ID:BRaPySJXその二つのセルのColumnを引き算したら分かるんでないの?
0661デフォルトの名無しさん
2016/01/28(木) 23:27:32.34ID:D0vEBF/4ありがとうございます。
0662デフォルトの名無しさん
2016/01/28(木) 23:32:05.18ID:YELEWwrc0663デフォルトの名無しさん
2016/01/28(木) 23:33:03.80ID:YELEWwrc正 LBound も UBound も
0664デフォルトの名無しさん
2016/01/29(金) 00:42:17.43ID:/cWmSx8U宣言時の初期化を抑制する構文もないから
宣言と同時に変数を初期化するのを抑制なんてできないわけだが
まあ変数の数を減らす事によってその分のメモリと初期化時間を節約できるのは確かかもしれんが
それを当たり前にやらないとダメなような環境なら、VBA使うのがそもそも間違ってる
巨大な配列ならまだしも、可読性落としてまでやるような事じゃない
■ このスレッドは過去ログ倉庫に格納されています