[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 12/27 15:50 / Filesize : 259 KB / Number-of Response : 921
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part9



1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ]
ExcelのVBAに関する質問スレです

前スレ pc11.2ch.net/test/read.cgi/tech/1219673793/

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)


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

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


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

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

こんなところでしょうか

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


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

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

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


273 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:34:24 ]
>>272
こらこらw


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

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

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

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

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


275 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 00:09:40 ]
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。

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

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

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

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

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


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


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


279 名前:263 mailto:sage [2008/12/28(日) 14:39:49 ]
名前が1208個までしか付けられないのか

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


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

282 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 20:22:28 ]


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

284 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 08:22:46 ]
>>283
そのシステムはExcelで作ったの?

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



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

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

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


288 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 13:11:23 ]
>>287
まぁ、そういうことなのかな。

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

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


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

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

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

291 名前:デフォルトの名無しさん [2008/12/29(月) 18:53:44 ]
100円  500円  250円

↓ マクロ発動

100円○ 500円  250円


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

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


292 名前:291 [2008/12/29(月) 19:08:00 ]
xp
2003

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


294 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/12/29(月) 22:31:54 ]
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね



296 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん [2008/12/29(月) 22:36:55 ]
296は293の訂正です

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

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

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



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

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

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


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

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

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

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




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

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

目的のセルはFindと FindNextで

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

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

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

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



306 名前:302 mailto:sage [2008/12/30(火) 17:09:11 ]
>>303
ありがとうございます!!!

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

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

308 名前:291 [2008/12/31(水) 14:49:44 ]
>>301
ありがとうごさいます

やってみます

309 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 23:29:23 ]
無い

311 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:31:04 ]
>>309
そもそもbreakしてどこへ行くつもりだ

312 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:36:55 ]
>>310
ありがと

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

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

314 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:41:51 ]
仕方なくGotoだな

315 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:16 ]
>>314
ちょ、おま、そんな最終手段をっ!



316 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:45 ]
>>313
どうすんの?

317 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:46:24 ]
>>316
Select Case exp
  Case 0
    IF xxx THEN
      処理
    End IF
End Select


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

319 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:48:59 ]
はあ〜書いちゃった。。

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


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

321 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:53:31 ]
答え発表!
ヒューヒュー

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

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

でした。

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


322 名前:デフォルトの名無しさん [2009/01/01(木) 00:53:35 ]
go away

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



324 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:04:13 ]
>>318
アホなのか・・・

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



326 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:14:31 ]
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If

328 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:27:43 ]
>>327
あ!ありがとうございます。
あったんだ。

329 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:48:45 ]
>>328
意外と素直w

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

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

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


333 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:30:42 ]
厨とか言っちゃうやつは例外なくアホ

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

C#への布石ですか?

335 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 17:12:57 ]
Excel 2008でVBAが使えないのは事実らしいが、
Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
www.microsoft.com/japan/presspass/detail.aspx?newsid=3439



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

337 名前:263 mailto:sage [2009/01/02(金) 09:22:34 ]
>>336
もしかしてデザインの話か
そんな誘導先ないだろ

338 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 09:23:06 ]
名前消し忘れた恥ずかしい

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


340 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 14:03:27 ]
あれ本当にOfficeに乗っけるの?

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


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

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

344 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 16:58:06 ]
絶版です

345 名前:336 mailto:sage [2009/01/02(金) 18:06:59 ]
>>337
そうですか…了解です。

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

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



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



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

348 名前:336 mailto:sage [2009/01/03(土) 02:30:30 ]
>>346
コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。

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

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

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

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

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

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

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

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

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

353 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 13:26:28 ]
オリジナリティ溢れるUIほど迷惑なものはない

354 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:11:29 ]
>トリプルクリックや4回クリックなどにも

何考えてんだ?

355 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:20:56 ]
V2C には6回クリックまであるぜ



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

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

358 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:18:27 ]
マウスの右ボタンを殺す

359 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:39:56 ]
BeforeRightClickイベントの第二引数にCancelがあるだろ

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

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

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

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


362 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:11:17 ]
>>361
色々あるだろうけど
普通は
if
elseif
elseif
else



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

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

365 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:56:00 ]
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<259KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef