Excel VBA質問スレ Pa ..
[2ch|▼Menu]
237:デフォルトの名無しさん
08/12/23 12:38:37
>>233
実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?


238:デフォルトの名無しさん
08/12/23 13:30:07
singleの方が使用バイト数少ないしね!

239:デフォルトの名無しさん
08/12/23 21:24:42
>>233
0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。

あと、ワークシートでの計算でIntegerとDoubleを区別するよりは
全部Doubleのほうが速いなんてこともありそう。いや想像だけど。

それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。

240:デフォルトの名無しさん
08/12/24 14:01:15
>>239
良く分からんけど
Excelが普通なんでしょ


241:デフォルトの名無しさん
08/12/24 19:50:07
>>239
てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。

変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。

242:デフォルトの名無しさん
08/12/24 20:35:29
んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。
ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。

レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。

243:デフォルトの名無しさん
08/12/24 21:58:35
>>241
いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。

244:デフォルトの名無しさん
08/12/24 23:50:41
floatよりdoubleの方が速いらしいぜ

245:デフォルトの名無しさん
08/12/25 00:30:23
>>244
マジレスすると、ケースバイケース。

246:デフォルトの名無しさん
08/12/26 00:36:57
質問です。

windowsXPでExcelは2007。

Dim lastRow As Long '最終行数

Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\新しいフォルダ\AAA.xls"

lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行の取得

で、lastRowに1しか入りません。
実際は1000と入らなければいけないのですが。

どこが間違っているか、御教示ください。


247:デフォルトの名無しさん
08/12/26 01:42:25
>>246
xlUpはどう言う意味?

248:デフォルトの名無しさん
08/12/26 01:49:04
たまたまこのスレ開いた俺が適当に答えてみる
Rows.Countって選択してるRowの数返すんじゃないの?

249:デフォルトの名無しさん
08/12/26 01:56:21
>>246
lastRow = Range("A1048576").End(xlUp).Row

250:デフォルトの名無しさん
08/12/26 02:04:26
シートを指定していないから
関係無いシートがアクティブになってるんじゃない?
一度シートが1つのBookで試してみ

251:デフォルトの名無しさん
08/12/26 02:06:54
おそらく、アクティブなシートを勘違いしている。

252:デフォルトの名無しさん
08/12/26 02:07:27
リロードすればよかった・・・

253:246
08/12/26 09:15:59
皆様ありがとうございます。
シートを1つにしてもlastRowには1しか入りませんでした。
最終行の取り方自体は合っているようなので、 シート関係を見直してみます。
ありがとうございます。

254:デフォルトの名無しさん
08/12/26 11:39:51
>>253
「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。

255:デフォルトの名無しさん
08/12/26 12:51:43
A列にデータが無いとかじゃないよな

普通Bookを開いたら、そのBookがアクティブになるから
問題は無いはず

まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい

256:デフォルトの名無しさん
08/12/26 12:58:20
>>255
> 普通Bookを開いたら、そのBookがアクティブになるから
> 問題は無いはず
ねーよ

257:デフォルトの名無しさん
08/12/26 15:30:49

ユーザーフォームでコンボボックスを3つ作成し、それぞれに

sample1
sample2
sample3

とオブジェクト名を指定しました。

コード内で変数を用いてそれぞれのコンボボックスにテキストを挿入したいときに、

For i = 1 To 3

j1 = i
j2 = "sample" & Cstr(i)

j2.Text = j1

Next i

という形でコードを組みましたがうまくいきません。
オブジェクト名を変数で定義することはできないのでしょうか?
稚拙な質問で申し訳ありませんが、よろしくお願いします。


258:デフォルトの名無しさん
08/12/26 15:42:33
>>257
Me.Controls("sample" & Cstr(i)).Text
でできないか?

259:デフォルトの名無しさん
08/12/26 15:49:02
>>258さん

解決しました。ありがとうございました。

260:デフォルトの名無しさん
08/12/26 21:56:21
知ってる人がいたら教えてほしいのですが、
エクセルVBAのコンボボックス(activX)の
設置数に限界は存在するのでしょうか?

とりあえず、3000+αのコンボボックスを1シートに
設定したいのですが・・・・

裏技的な方法でも良いので教えて頂ければ
ありがたいので宜しくお願いします。

261:デフォルトの名無しさん
08/12/26 22:13:21
>>260
Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?

262:デフォルトの名無しさん
08/12/26 22:27:44
>とりあえず、3000+αのコンボボックスを1シートに

ユーザーも大変だ w

263:デフォルトの名無しさん
08/12/27 01:03:57
良く分からないけど
一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど
1000作るを3回繰り返すと3000個出来た
For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a

264:デフォルトの名無しさん
08/12/27 01:51:37
失敗したときのコードを張ってみそ

265:263
08/12/27 02:04:11
For n = 1 To 3000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n

>>260を見て
試してみたら解るだろと思ってやってみただけだから
質問主じゃないよ

266:260
08/12/27 02:33:26
263氏の方法でなんとかなりそうです
ありがとうございました

267:デフォルトの名無しさん
08/12/27 07:25:59
いや、出来る出来ないはどうでも良いんだよ。
コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?

268:デフォルトの名無しさん
08/12/27 09:32:05
>>260
コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・


269:260
08/12/27 12:40:11
>>268 
項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。

>>267
コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。

こんなところでしょうか

270:デフォルトの名無しさん
08/12/27 13:10:26
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。
バカな物は作ってはいけない。


271:デフォルトの名無しさん
08/12/27 17:51:01
>>269
データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。

3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。

272:268
08/12/27 20:20:28
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。


273:デフォルトの名無しさん
08/12/27 20:34:24
>>272
こらこらw


274:デフォルトの名無しさん
08/12/27 20:47:59
>>272
DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。

エクセルをRDB的に使用する事があるのは、
シートがRDB構造と視覚的に同じである事が理由。
つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。

エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない)
やはりトランザクションとロックの概念が無いシステムでは怖い。
これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。

エクセルのシートにRDBをダンプすれば、言語が分からなくても、
オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。
関数だってクエリと言えるよね。これは凄く魅力的な事だよ。

全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。


275:デフォルトの名無しさん
08/12/27 23:59:21
>>263

---265氏のプログラム

For n = 1 To 3000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n

---君のプログラム

For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a

---私が265氏と同等と考えるプログラム

For a = 0 To 2
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & a * 1000 + n
Next n
Next a


276:デフォルトの名無しさん
08/12/28 00:09:40
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。

>>260さんの 私の>>268 に対する >>269の返信を見て、
顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの
小規模版データを想像してみました。

また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、
この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。

データ設計例?
 100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。

求めるもの
 2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。

この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。


277:デフォルトの名無しさん
08/12/28 13:15:14
>>275
---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。


278:デフォルトの名無しさん
08/12/28 13:37:14
自分のパソはメモリーが小さいのでかも。260さんではありません。
試しにやってみたものです。


279:263
08/12/28 14:39:49
名前が1208個までしか付けられないのか

280:277
08/12/28 16:44:44
>>279
私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。


281:デフォルトの名無しさん
08/12/28 19:45:07
mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。
誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。

282:デフォルトの名無しさん
08/12/28 20:22:28


283:デフォルトの名無しさん
08/12/29 06:36:24
ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな
効率のいいコードを書くために必要な知識とか教えてくれないか。

284:デフォルトの名無しさん
08/12/29 08:22:46
>>283
そのシステムはExcelで作ったの?

285:デフォルトの名無しさん
08/12/29 08:29:17
>>283
サブルーチンなり関数なりに分けましょう。

286:デフォルトの名無しさん
08/12/29 10:25:34
>>284
うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ

>>285
最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。

287:デフォルトの名無しさん
08/12/29 12:51:23
>>286
ユーザインタフェースのプログラムを何とかしたいということ?


288:デフォルトの名無しさん
08/12/29 13:11:23
>>287
まぁ、そういうことなのかな。

入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。
コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。

運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。


289:デフォルトの名無しさん
08/12/29 14:19:59
>>288
UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。

290:デフォルトの名無しさん
08/12/29 15:09:44
>>288
誰もが一度は通る悩み。
モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。

モジュール結合度とかでググってみるといいよ

291:デフォルトの名無しさん
08/12/29 18:53:44
100円  500円  250円

↓ マクロ発動

100円○ 500円  250円


もっとも小さい数字を選んでその数字の横に
○印をつけたいのですが
なかなかうまくいきません

どういった関数を使えばいいでしょう?


292:291
08/12/29 19:08:00
xp
2003

293:デフォルトの名無しさん
08/12/29 21:35:37
>>291さん
こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub


294:デフォルトの名無しさん
08/12/29 22:24:22
約4000のテキストファイルをそれぞれのワークシートにインポートしたいんだけど、
テキスト名が 1001.txt、1002.txt、1004.txt
といった具合に連番じゃないので、下のプログラムだと1003.txtが存在しないので
当然エラーが発生します。都合上、ファイルの名前を連番にすることはできないんです。
理想としては、存在しないファイル番号は無視して次のファイルをインポートするように
したいのですが、イイ案が浮かびません。。
このエラーを回避する手段はありますか?

環境はXPの2003です。

Sub Macro1()
Dim bng As Integer
For bng = 1001 To 9996

ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;D:\Program Files\ootori\data\" & bng & ".txt", Destination:=Range("A1"))
.Name = "1001_1"
.FieldNames = True

中略(マクロの自動登録で書かれた部分)

End With
Next
End Sub


295:294
08/12/29 22:31:54
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね

296:デフォルトの名無しさん
08/12/29 22:34:16
勘違いしてました
訂正です
Sub mini()
Dim mymin
Dim myjuni
Dim datasuu
myjuni = 1
datasuu = 3
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲
For i = 1 To datasuu - 1
If Cells(myjuni, 1) > Cells(i + 1, 1) Then
myjuni = i + 1
End If
Next i
Cells(myjuni, 1) = mymin & "円○"
End Sub


297:デフォルトの名無しさん
08/12/29 22:36:55
296は293の訂正です

298:デフォルトの名無しさん
08/12/29 22:43:48
VBAのステップ実行時に、ウォッチでRangeを見てみました。
すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?

でも、Variant/Object/Range見たいな奴もあるし。。
(これはVariantでObjectでその実態はRangeということかな?)

Worksheet/Sheet1なんていうのもあります。
(これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)



299:デフォルトの名無しさん
08/12/29 23:19:00
ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。

300:デフォルトの名無しさん
08/12/29 23:48:10
別に、エラーをインラインで処理するのはおかしくない。
トラップすれば処理できているとは限らないのと一緒。
論理的破綻はどちらでも起こる。

301:296
08/12/30 00:08:18
>>291さんへ
たびたびすいません
こんなのありました
large関数
(指定された範囲データから大きい方から任意の数字番目を返す)
small関数
(指定された範囲データから小さい方から任意の数字番目を返す)


302:デフォルトの名無しさん
08/12/30 00:58:44
VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明)
をその文字の上に配置して、その文字を囲っているように見せたいと思っています。

そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、
オートシェイプを配置すべき座標を計算することを考えています。
フォントは固定幅で考えております。

今、自分が分からないのは、
(1)文字の幅の単位(cmとかインチ?ピクセル??)
(2)文字列の長さをcmとかインチで正確に取得する方法
(関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!)
(3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??)
(4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式

何方か教えていただけますですか?
(自分でも継続して調べます。)
よろしくお願いします。




303:デフォルトの名無しさん
08/12/30 04:13:54
シェイプの長さは
テキストのFont.Size掛ける文字数で

シェイプの位置は
セルの.Top .Leftで

目的のセルはFindと FindNextで

あとは細かい調整で
いいみたい

304:デフォルトの名無しさん
08/12/30 08:28:53
VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…

305:デフォルトの名無しさん
08/12/30 11:28:03
>>304
同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。
 VBAではやり方は良くわからんのだけど、
"Excel VBAによるWin32 APIプログラミング入門"
この辺を見ればよいと思う。
 タスク複製だのは結構癖があるからがんばって。

 あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。

306:302
08/12/30 17:09:11
>>303
ありがとうございます!!!

自分でも探したんですけどさっぱりその手の情報がなくて(;_;)
非常に助かりました。本当にありがとうございました!

307:304
08/12/30 18:30:26
≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30〜1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?

308:291
08/12/31 14:49:44
>>301
ありがとうごさいます

やってみます

309:デフォルトの名無しさん
08/12/31 22:39:19
Select Case…End SelectってC言語のswitch相当だと思うんですけど、breakって無いんですか?

Select Case exp
Case 0
IF xxx = FALSE THEN
Break  ←これ!!!!
End IF
End Select

みたいな。

310:デフォルトの名無しさん
08/12/31 23:29:23
無い

311:デフォルトの名無しさん
09/01/01 00:31:04
>>309
そもそもbreakしてどこへ行くつもりだ

312:デフォルトの名無しさん
09/01/01 00:36:55
>>310
ありがと

>>311
Selectの外に決まってんじゃん。。。

313:デフォルトの名無しさん
09/01/01 00:41:39
>>312
それがしたいだけなら、どうにでもなるだろと小一時間…

314:デフォルトの名無しさん
09/01/01 00:41:51
仕方なくGotoだな

315:デフォルトの名無しさん
09/01/01 00:44:16
>>314
ちょ、おま、そんな最終手段をっ!

316:デフォルトの名無しさん
09/01/01 00:44:45
>>313
どうすんの?

317:デフォルトの名無しさん
09/01/01 00:46:24
>>316
Select Case exp
  Case 0
    IF xxx THEN
      処理
    End IF
End Select


318:デフォルトの名無しさん
09/01/01 00:48:24
抜ける方法を聞いてんの。
わざわざ論理を逆にして書けば良いじゃんとか
抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか
そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ
あとさぁ
なんで
if()
{

319:デフォルトの名無しさん
09/01/01 00:48:59
はあ〜書いちゃった。。

じゃ、問題。何を書きたかったんでしょうか?


320:317
09/01/01 00:49:51
ちょっと説明不足かな
要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味
Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい

321:デフォルトの名無しさん
09/01/01 00:53:31
答え発表!
ヒューヒュー

あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}

みたいにELSE句にIFが書けないんだろう
欠陥だろ。。

でした。

>>320
そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。


322:デフォルトの名無しさん
09/01/01 00:53:35
go away

323:デフォルトの名無しさん
09/01/01 00:57:44
>>322
おや?外れたのかな?(^^)
勘がニブいんですねw



324:デフォルトの名無しさん
09/01/01 01:04:13
>>318
アホなのか・・・

325:デフォルトの名無しさん
09/01/01 01:06:26
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
ねーよ。

326:デフォルトの名無しさん
09/01/01 01:09:56
抜ける方法を聞いただけでこの荒れようww
VB厨はばかだなぁww
書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。
高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。
アセンブラじゃないんだからさぁ。
IF THEN
ELSE
 IF THEN
 ELSE
  IF THEN
  ENDIF
 ENDIF
ENDIF

うわっ。だっさ。最悪。

書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww

327:デフォルトの名無しさん
09/01/01 01:14:31
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If

328:デフォルトの名無しさん
09/01/01 01:27:43
>>327
あ!ありがとうございます。
あったんだ。

329:デフォルトの名無しさん
09/01/01 01:48:45
>>328
意外と素直w

330:デフォルトの名無しさん
09/01/01 02:10:17
あんまり笑わせるなよ。
VB分かってないやつがVB馬鹿にしてたのかよ。orz

331:デフォルトの名無しさん
09/01/01 02:11:14
明らかに分かってないのに、構造構造言いたがるのなんて、
情報系の一年生くらいだろ。

332:デフォルトの名無しさん
09/01/01 02:21:16
>>330-331
ゴメンね(´・ω・`)
ついイライラしてたから


333:デフォルトの名無しさん
09/01/01 02:30:42
厨とか言っちゃうやつは例外なくアホ

334:デフォルトの名無しさん
09/01/01 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか?

C#への布石ですか?

335:デフォルトの名無しさん
09/01/01 17:12:57
Excel 2008でVBAが使えないのは事実らしいが、
Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
URLリンク(www.microsoft.com)

336:デフォルトの名無しさん
09/01/02 08:30:00
このスレは、Excel の VBE で作るフォームについての質問はスレ違い?
スレ違いでしたら誘導をお願いします。

337:263
09/01/02 09:22:34
>>336
もしかしてデザインの話か
そんな誘導先ないだろ

338:デフォルトの名無しさん
09/01/02 09:23:06
名前消し忘れた恥ずかしい

339:デフォルトの名無しさん
09/01/02 13:45:39
どうせなら、VSTA2.0の情報とかを書けばいいのに
>>334-335


340:デフォルトの名無しさん
09/01/02 14:03:27
あれ本当にOfficeに乗っけるの?

341:デフォルトの名無しさん
09/01/02 14:17:09
>>335
よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?


342:デフォルトの名無しさん
09/01/02 15:03:36
そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。
この先もそれが続くと信じて安穏としているのは間違っているだろうが、
数年でなくなるような存在でもない。

343:デフォルトの名無しさん
09/01/02 16:48:02
Excel VBAによるWin32 APIプログラミング入門
この本って絶版でもう購入不可ですか?

344:デフォルトの名無しさん
09/01/02 16:58:06
絶版です

345:336
09/01/02 18:06:59
>>337
そうですか…了解です。

スレ違いを承知で 1 つだけ質問。
Excel のデザインで使うフォームのコントロールの仕様って VB6 と
同じなんですかね?

(コンボボックスでダブルクリックのイベントが起きないので調べたら、
 VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
 ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
 ダブルクリックのイベント絶対起きないじゃん…。)

346:デフォルトの名無しさん
09/01/03 00:31:02
ダブルクリックのイベントが発生しない が意味不明 
で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている
「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版
に第10章 入力画面を使ってみよう を読んでみたwww
ユーザーホームのデザインという用語が使われているが、この本では
ダブルクリックをする場面は、VBE上コンボボックスのことで、
excelシート上のコンボボックスではないよ。シート上ではダブルクリックは
使わないものと思っている。



347:デフォルトの名無しさん
09/01/03 00:58:20
>>346
セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが

348:336
09/01/03 02:30:30
>>346
コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。

というかワークシート上にもコントロールを置けたんですね。
で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで
ダブルクリックのイベントが発生しました。なんで?

目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを
取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。

方法は下記です。
(1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して
  モジュール変数に退避する。
(2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。
(3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった
  処理を実行する。

コンボボックスでダブルクリックのイベントを拾った後の使い道は、
(1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!)
(2) コンボボックスより詳細なリストが表示できるフォームの呼び出し
を考えていました。

上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。

349:デフォルトの名無しさん
09/01/03 03:55:36
トリプルクリックにまで対応できるのは素晴らしいけど
コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな

350:デフォルトの名無しさん
09/01/03 04:52:18
URLリンク(www.amazon.co.jp)ユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1

351:デフォルトの名無しさん
09/01/03 04:53:58
オレのExcel、コンボボックスにダブルクリックイベント有るけど
みんなのには付いてないの?
バージョン Excel2003

352:デフォルトの名無しさん
09/01/03 06:03:46
たぶん
コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う

353:デフォルトの名無しさん
09/01/03 13:26:28
オリジナリティ溢れるUIほど迷惑なものはない

354:デフォルトの名無しさん
09/01/03 16:11:29
>トリプルクリックや4回クリックなどにも

何考えてんだ?

355:デフォルトの名無しさん
09/01/03 16:20:56
V2C には6回クリックまであるぜ

356:デフォルトの名無しさん
09/01/03 17:11:00
API使えば、ダブルクリックの認識の間隔を取得できるから、
0.5秒決め打ちよりそれを使ったほうがいいと思う。
そういう話をしている場合でないとは思いつつ。

357:デフォルトの名無しさん
09/01/03 19:44:02
質問です。
セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが
どう設定のマクロを書いたものか、よろしく。
右クリックイベントによってコピーモードにしているのに、余分な作業を
するのを防止したいので。

358:デフォルトの名無しさん
09/01/03 21:18:27
マウスの右ボタンを殺す

359:デフォルトの名無しさん
09/01/04 02:39:56
BeforeRightClickイベントの第二引数にCancelがあるだろ

360:デフォルトの名無しさん
09/01/04 13:15:18
サーバサイドでの帳票の生成にVBAを検討していて、
安定性、処理性能、MSのライセンス違反等を懸念してますが、
何か懸念事項やアドバイス等ありますでしょうか?

361:デフォルトの名無しさん
09/01/04 14:49:46
論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、

列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の

「そうでないなら」はどう書いたものでしょうか?


362:デフォルトの名無しさん
09/01/04 15:11:17
>>361
色々あるだろうけど
普通は
if
elseif
elseif
else



363:デフォルトの名無しさん
09/01/04 15:18:49
>>357
ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ

364:デフォルトの名無しさん
09/01/04 15:21:38
>>361
>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf

365:デフォルトの名無しさん
09/01/04 23:41:35
まあOr使っちゃうのが一般的かつ簡単ではあるが
条件1つずつでネストした方が速い

何故なら、例えば列5に一致するならイベント処理は行うので
列6、列9に一致するか否かは判定する必要が無いのに
>>364では毎回全てを判定した上で論理演算してしまう
複数条件でAnd、Orを使わないのは、コード最適化の常套手段

逆に速度気にせず手を抜きたいなら、カンマ区切りで
複数条件指定できるSelect Case使う方がお手軽だろ
Case 列5, 列6, 列9
  イベント処理
Case Else
  Exit

因みに論理演算(>>364)の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ
とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな

366:デフォルトの名無しさん
09/01/04 23:56:00
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。

367:デフォルトの名無しさん
09/01/05 00:00:55
ショートサーキットはしないよ
まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど

368:デフォルトの名無しさん
09/01/05 12:09:49
>>365
Select Caseが105って一概には言えないだろ?
>Case 列5, 列6, 列9
これショートサーキットだから列5がTrueなら列6と列9は評価しないし。
>>366
ショートサーキットするのはVB.NetのOrElseとかAndAlso
今はVB.Netって言わないんdっけ?


369:デフォルトの名無しさん
09/01/05 13:14:41
>>368
Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値

そもそもが単一条件の場合でも、Select CaseはIfより遅いからね

370:デフォルトの名無しさん
09/01/05 14:13:14
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか?
例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)

371:デフォルトの名無しさん
09/01/05 14:19:16
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ

372:デフォルトの名無しさん
09/01/05 14:22:53
>>371
調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。

373:デフォルトの名無しさん
09/01/05 18:24:45
>>369
IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。
実測してみろよ。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo1()
  Dim i&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    Select Case i Mod 10
      Case 5, 6, 9
      Case Else
    End Select
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
Sub foo2()
  Dim i&, j&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    j = i Mod 10
    If j = 5 Or j = 6 Or j = 9 Then
    Else
    End If
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
foo1がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。

374:デフォルトの名無しさん
09/01/05 19:51:47
>>373
・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ

ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな

375:373
09/01/05 21:26:44
>>374
i Mod 10の値を処理で使わないんなら>>373が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?

376:デフォルトの名無しさん
09/01/05 21:35:16
> i Mod 10の値を処理で使わないんなら>>373が平等なコード。
そうでもない

> おめーんとこじゃ遅いのか?
うん

377:373
09/01/05 21:40:10
OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。
おまえは最速のコード書けないんだろ?


378:373
09/01/05 21:41:57
後ろは読んでなかったが、おれのとこと逆になるらしいな。
俺のとこはSelect Caseが速い。

379:デフォルトの名無しさん
09/01/05 22:00:24
実際の処理に置いて必ずModで算出した値を使うというわけではない以上
条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという
同じ状況を作ることが平等になる

Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、
君の言うとおりベストを尽くして最速コードを書くべきだけどね

380:デフォルトの名無しさん
09/01/05 22:12:28
なんか分かってないなぁ。
Modで算出した値を使わないなら>>373になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。


381:デフォルトの名無しさん
09/01/05 22:19:50
>>380
foo1が速かった

382:デフォルトの名無しさん
09/01/05 22:24:07
>>381
トンクス
j = i Mod 10
Select Case j
としても?

おれのとこはそれでもfoo1が速いが。

383:デフォルトの名無しさん
09/01/05 22:26:51
>>382
逆転した

384:デフォルトの名無しさん
09/01/05 22:31:23
>>383
ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?

385:デフォルトの名無しさん
09/01/05 22:33:56
>>384
してなかった

したら差は縮まったけどまだ
foo2が速い

386:デフォルトの名無しさん
09/01/05 22:35:45
>>385
おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。

387:デフォルトの名無しさん
09/01/05 22:36:45
すまん、また後ろ読んでなかった。

388:デフォルトの名無しさん
09/01/05 22:41:46
>>386
&で宣言したよ
30位foo2が速い

389:デフォルトの名無しさん
09/01/05 22:42:49
まぁModで算出した値を使わないなら>>373が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。

390:デフォルトの名無しさん
09/01/05 22:44:22
ちなみに
Excel2002です

391:デフォルトの名無しさん
09/01/05 22:47:06
>>390
トンクス。

392:361
09/01/05 23:18:31
>論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、
>列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
>「そうでないなら」はどう書いたものでしょうか?
訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。

If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub


393:デフォルトの名無しさん
09/01/06 00:21:36
文章だけだと伝わりづらいと思いますが、質問です。


ハイパーリンク │ 転記情報1
ハイパーリンク │ 転記情報2

EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、
それをWEBブラウザでプレビューできるようにしています。

WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?


394:デフォルトの名無しさん
09/01/06 03:38:21
>>392
背中がムズムズする……

395:デフォルトの名無しさん
09/01/06 05:39:55
>>394
気持ちは解る
条件式にnotと=を併用するヤツってもうね…

396:デフォルトの名無しさん
09/01/06 07:33:05
<>

397:デフォルトの名無しさん
09/01/06 09:47:49
>>392
「Aでないか、Bでないか、Cでない」ではなく「Aでもなく、Bでもなく、Cでもない」だろ?
前者だと必ずTrueだからな。
それは置いといて、普通イベント処理ならIntersect使うから列番号では判定しないが、どうしても列番号で判定したいとか基本のお勉強なら
Select Case Trget.Column
  Case 5, 6, 9
    '処理1
  Case Else
    Exit Sub
End Select
’処理2

処理2がなければ、何もわざわざCase Elseで抜ける必要なし。
というか抜ける記述は普通はしない。

398:デフォルトの名無しさん
09/01/06 09:49:54
何、今更?

399:デフォルトの名無しさん
09/01/06 09:59:59
>>392
書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。

400:デフォルトの名無しさん
09/01/06 10:02:35
>>398
昨晩のアフォの>>365か?
無視してすまんね。

401:デフォルトの名無しさん
09/01/06 10:29:05
悔しかったの?

402:デフォルトの名無しさん
09/01/06 10:30:29
シートに商品名が20,000件程度入力されている状態で
テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを
リストボックスに追加 という処理を考えていたのですが
下記の方法で試してみるとかなり時間がかかってしまいます
高速に処理をさせるには根本的な方法の見直しが必要でしょうか?

 dSelectForm.ListBox1.Clear
 LastRow = Sheet1.Range("C65536").End(xlUp).Row
 For i = 2 to LastRow
  Ans = 0
  Ans = WorksheetFunction.Find(inputKey, Sheet1.Cells(i, 3))
  If Ans <> 0 Then
   dSelectForm.ListBox1.AddItem Sheet1.Cells(i, 3)
  End If
 Next

403:デフォルトの名無しさん
09/01/06 10:59:47
相変わらずの人がいるなw

404:デフォルトの名無しさん
09/01/06 11:20:39
>>402
ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。

405:デフォルトの名無しさん
09/01/06 16:29:31
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。
条件に「合う」場合だけ判定して処理するように書くのが普通だね。

定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし
見た目のわかりやすさと保守のしやすさからCaseをすすめとく。
条件が増えたときに簡単に数字が追加できるから。

406:デフォルトの名無しさん
09/01/07 01:50:36
2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか?
08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。

407:デフォルトの名無しさん
09/01/07 03:34:54
>>406
セルの表示形式で「yy.mm.dd」

408:デフォルトの名無しさん
09/01/07 05:57:34
>>405
俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。

409:デフォルトの名無しさん
09/01/07 06:18:38
>>406
数式でよけれべ普通に=A1-B1なんてやりゃできる。
もし表示形式が日付形式になるようなら、G/標準とか0にすりゃいい。
2007では計算元の表示形式が日付でも普通に1になるが、たしか2003では数式セルは日付にならなかったっけ?

計算元の表示形式が文字列で、VBAでやりたいのなら
MsgBox CDate(Cells(1,1).Value)-CDate(Cells(1,2).Value)
MsgBox DateValue(Cells(1,1).Value)-DateValue(Cells(1,2).Value)
などとやりゃできないか?

410:デフォルトの名無しさん
09/01/07 07:26:12
if not hoge is nothing then

って構文が気持ち悪いんですけど、何か代替えはありませんか?

411:デフォルトの名無しさん
09/01/07 07:53:25
そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?

412:デフォルトの名無しさん
09/01/07 08:23:23
「代替え」なんて変な言葉を使う人に言われたくありません。
もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?

413:デフォルトの名無しさん
09/01/07 08:34:53
>>410
If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。

414:デフォルトの名無しさん
09/01/07 10:38:45
それならもっとシンプルにできる
If ObjPtr(hoge) Then
こういう書き方を知らないと意味がわからなくなるけど

415:デフォルトの名無しさん
09/01/07 12:12:25
>>412
URLリンク(dictionary.goo.ne.jp)


416:デフォルトの名無しさん
09/01/07 12:25:38
not 〜 nothingは俺も気持ち悪いと思う
直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って
英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ

俺もまだVBAを勉強中だから知らないだけかもしれないけど、
インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような
構文か関数ってないの?自分で作るしかない?

417:デフォルトの名無しさん
09/01/07 16:19:22
別にこの仕様でおかしくもないと思うけどねぇ
そもそもがNothingのときに何かをするってことの方が多いんだからさ
有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが
どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ

418:デフォルトの名無しさん
09/01/07 17:08:30
if hoge is not nothingと書けるのが一番良い

419:デフォルトの名無しさん
09/01/07 17:21:50
余計変だw

420:デフォルトの名無しさん
09/01/07 18:39:23
>>415
変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5142日前に更新/259 KB
担当:undef