Excel VBA 質問スレ Part21at TECH
Excel VBA 質問スレ Part21 - 暇つぶし2ch400:デフォルトの名無しさん
11/10/28 12:16:49.27
仕事でどうしても使わなきゃならなくなったんだけど、VBAって理不尽なエラーが多く出ないかい?
まあ、おじさん初心者が基礎をすっとばかして適当に組んでるのが原因ってのは解ってんだけどね

401:デフォルトの名無しさん
11/10/28 12:43:23.12
>>400
どんなアプリでもマクロ言語ってのはどうしてもそうなる。
それでもVBAはメジャーな分比較的きちんとしてるほう。


402:デフォルトの名無しさん
11/10/28 13:09:42.58
>>400
VBAに限らないよ
どんなプログラムでも素人が組むとエラーだらけになる

まともなアプリって、全体の半分ぐらいはエラー対策だったりするし
想定外の事態を事前にどれだけ予測してどれだけ対処できるかでプログラマーの腕がわかる

403:デフォルトの名無しさん
11/10/28 16:03:56.66
でも掲示板での質問にエラー対策が完璧な回答をしても喜ばれない。
コメントも同じ。
回答は本筋だけ示せばよい。

404:デフォルトの名無しさん
11/10/28 16:31:51.41
>>399
ありがとうございます。
staticで実現できました。

405:397
11/10/28 17:21:23.53
何方か判りませんかね~^^;

406:デフォルトの名無しさん
11/10/28 17:57:27.41
>想定外の事態を事前にどれだけ予測して

予測してたら想定外じゃないだろ

407:デフォルトの名無しさん
11/10/28 18:57:00.97
>>401
そんなもんなんですねぇ
今やっと、大体の画面作りが終わったので、これから計算や文字処理のルーチンを書いてく予定です
画面でこれだけ苦労したのに、本当に最後まで作ることができるんかいなと・・・
でもやるしかないんで、騙し騙しでも頑張るです

408:デフォルトの名無しさん
11/10/28 20:29:58.72
というか、「理不尽な」エラーなんて出た記憶がないな


409:デフォルトの名無しさん
11/10/28 20:54:19.01
理不尽なソースならいくらでもあるよ

410:デフォルトの名無しさん
11/10/28 21:08:04.44
エラー時にエラートラップされていない場合のみ止める設定の時に、
たまに数字だけのエラー表示があるのが、一寸鬱陶しくはある。
まあ、エラー時に止める設定にすれば判るから大して困りはしないが。

411:デフォルトの名無しさん
11/10/29 00:17:47.48
むしろ正常に動作していないのにエラーも何も出さないってのがMSのソフトには多いから困る

412:デフォルトの名無しさん
11/10/29 00:21:48.78
それは仕様です(キリッ

413:デフォルトの名無しさん
11/10/30 09:45:17.96
初心者です。

変数型によるメモリの使用量の違いを知りたくて

sub test()
debug.print application.memoryused
dim a as byte
a=1
debug.print application.memoryused
end sub

と byteをvariantに変更して比較したのですが使用量が変わりません。
どうしてなのでしょうか?

414:デフォルトの名無しさん
11/10/30 10:14:54.03
>>402は古いと思う

415:デフォルトの名無しさん
11/10/30 11:05:13.30
遅レスですが
>>386>>388
25.4とか28.4という数字は、どこから出てきた数字なんでしょうか?

416:デフォルトの名無しさん
11/10/30 11:32:07.66
>>323>>328
の話にあった
With Range("A1").CurrentRegion.Rows(1)
より
With Range("A1").CurrentRegion.Resize(1)
の方が楽、というのがわからないです。どういう場合に楽なんでしょう?
可読性は前者の方が高いと思うのですが??

417:196
11/10/30 11:51:53.93
良く分からんけど、
mov ax,0
の代わりに
xor ax,ax
するようなもん。

418:デフォルトの名無しさん
11/10/30 13:25:17.86
>>416
Resizeならピリオド打つと自動メンバ表示されるがRowsは実行時バインドのItemプロパティを使ってるので自動メンバ表示されない。
With Range("A1").CurrentRegion.Rows(1)これはWith Range("A1").CurrentRegion.Rows.Item(1)の略だ。
Withでくくるときは極力Itemプロパティは使わない方がよい。
>>298も読むように。

419:416
11/10/30 13:37:49.32
>>418
非常に分かりやすい説明ありがとうございました。
「Resize」の表記で直感的に意味がわかるようになることが
良いVBA使いに至る道のようですね。

420:416
11/10/30 13:40:10.44
>>417
アセンブリ言語が良くわからないので
喩えがあまり理解できませんでしたが
回答ありがとうございました。

421:デフォルトの名無しさん
11/10/30 21:15:04.72
UserFormについて質問です。
(XP&Excel2000,2003)

複数のフォームを開閉するマクロを組立て中です。
この時、1枚目を完全に閉じた上で、2枚目のフォームを開くことはできないでしょうか。
変数受け渡しでうまくいかないかと試行中。
Google先生はLoad/Showしか教えてくれない…。

422:デフォルトの名無しさん
11/10/30 22:25:32.61
どこで困ってるのか今ひとつ良くわからない

423:421
11/10/30 23:01:29.14
普通に
Unload Me
UserForm2.show

みたいにしてもフォームが消えなかったり、
先ほど開いていたフォームを開きなおすとエラーが出る等、かな。

424:デフォルトの名無しさん
11/10/30 23:25:05.89
>>421
どんなエラー?

425:421
11/10/31 06:57:57.73
>>424
マクロ本体が無いので少し説明不足でした。申し訳有りません。

ダミーで確認してみたところ、
「既にフォームは表示されています。モーダルにできません。」でした。
CommandButtonでの操作は問題ない(ように思う)のですが、
右上の×ボタン操作を閉じた時の動作が思うように行きません。

426:デフォルトの名無しさん
11/10/31 07:38:25.66
Aフォームのボタンから別のBフォームを表示させ、その時にAフォームを消す
んで、Bフォームを消してまたAフォームを表示させる
ってことやってるけど、全然そういうエラーは出たことはない

>変数受け渡しでうまくいかないかと試行中。


フォームを開くのに変数受渡しって何?


427:421
11/10/31 09:42:21.52
>>426

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserFormX.Show    Xは読み替えで。
End Sub

↑UserFormXが起動するので、Show以降が処理されない=閉じることができない。
だから、フォーム2の後ろにフォーム1が見えたままですし、フォーム2を閉じると上述エラーが出る。
「Me.Hide」を加えると見た目では消えている…けど途中で閉じるボタンが聞かなくなる。
そもそもHideとUnloadは役割が違う。


>>変数受け渡し
フォーム毎に変数(Public)を持たせます。
そして、閉じるときにスイッチOFFをいれつつ、フォーム管理マクロを呼び出し。
強引にフォームを閉じ、必要なフォームを開けないかと思いましたが、
結局↑と似たような感じになり断念。
フォーム数だけマクロ用意すれば変数不要な気もする。


代替案で「閉じるのはCommandButtonのみ、右上×ボタンは封印」
というのも考え中ですが、こちらで何かいい案が聞けないかなと…。

428:デフォルトの名無しさん
11/10/31 10:00:43.25
UserForm_Terminate()
に書けばいいよ

429:デフォルトの名無しさん
11/10/31 10:15:02.07
>>428
回答がお早い…。

Terminateでも同じフォーム開きなおすと、閉じるボタン聞かなくなりますねぇ。
他のボタンも動かなくなるのも同じです。

430:426
11/10/31 10:15:44.13
こっちはExcel2007

Query_Closeでやはり
既にフォームは表示されています。モーダルにできません。
というメッセージが出るね。

まぁ早い話、これを使ってのフォームの操作は諦めろってことでは?


431:デフォルトの名無しさん
11/10/31 10:30:54.52
UserFormX.Show
じゃなくて
dim f as new userformx
f.show

ってすればいいよ。

432:421
11/10/31 10:50:03.25
おぉ…完成しました。
開き方ひとつでこうも変わるものなんですね。

回答くださった方々、ありがとうございました。
少しずつですが勉強頑張ります。

433:デフォルトの名無しさん
11/10/31 20:26:14.54
このスレの趣旨と合うかどうか微妙ですが質問です。

オフィス2007使用で、会社のパソコンのマイドキュメント内に自分のフォルダを作成しそのフォルダを信頼する場所に指定して
その中で自分が直接作ったファイルのみを使用してます。この状態で他人が作ったマクロ有効ファイルを一切使わない場合、
マクロウィルスなどの被害にあう可能性はありますか?

434:デフォルトの名無しさん
11/10/31 21:39:37.48
>>433
マクロウィルス「など」ってちょっと曖昧ですね。
マクロウィルス以外の被害は想定しなくても良い前提なんですか?

まぁ、仮にエクセルのマクロウィルス限定だとしても
ほかの前提条件が不明だから可能性はゼロにはならないです。
たとえば、他人が勝手にそのPCを使って出所不明のマクロを実行してしまう。
なんてのはどうです?

ってそういう頓知を聞きたいわけじゃないですよね。

そのPCを自分以外は誰も使用しなくて、自分自身でマクロウィルスを作成・実行しない。
という前提ならエクセルのマクロウィルスの被害には遭わないです。
要は信頼する場所云々以前に出所不明のマクロを実行しないというのが肝であって
それさえ守れば後は関係ないです。(あくまでもマクロウィルス限定の話ですけれど)

435:デフォルトの名無しさん
11/10/31 22:07:49.81
あるかないかで言えば、アドオンが感染とかExcel本体が感染とか常駐型に感染とか、
マクロファイル以外にも感染ルート、可能性はいくらでもある

436:433
11/10/31 22:35:31.24
ありがとう。
いちおう自分がVBAを使い始めた事が原因で感染しなければ良いので。出所不明のマクロ使用しないですし大丈夫ですね。
会社がセキュリティソフト導入しないので、エクセル以外からの感染は仕方ない状態です。

共用してるもう一人が、俺のファイルが重すぎる、お前なんかしただろとわけわんない言いがかりをつけられてて一応自分のせいではないことを確認したかったのです。

437:デフォルトの名無しさん
11/10/31 23:56:58.15
嫌な現場だなw
そんな心配しなきゃいけない位なら
そんな所やめてしまえばいいだろうに。

438:デフォルトの名無しさん
11/11/01 00:05:05.81
>会社がセキュリティソフト導入しないので



すげぇ会社だな、ヲイ

439:デフォルトの名無しさん
11/11/01 00:08:46.05
MSEをこっそり入れとこう

440:デフォルトの名無しさん
11/11/01 03:59:10.14
本当に自分が直接作ったファイルしか使わないなら安全かもしれんが
ウィルスってのは、ファイルを書き換えたりするんだぞ
お前が作ったそのままだと思ってるファイルが実はこっそりウィルスに感染してる可能性は排除できんぞ

441:434
11/11/01 06:15:52.26
>>433
酷い職場ですね。
そんなんじゃあマクロウィルス以前に
どんなマルウェアに感染されてるか分かったもんじゃないですね。

ちなみにうちの会社だとインターネットにつながってるPCと
社内のネットワークだけにつながってるPCの2系統のネットワークがあって、
業務は社内ネットワーク上のPCでしか作業してないです。
外部記憶メディア(USBメモリなど)の使用も禁止です。
普段はそっちで仕事していて、
調べものとかがあるときだけインターネットにつながったPC使ってます。

442:デフォルトの名無しさん
11/11/01 14:06:28.11
>>441
うちもそういう構造してるけど、アップデート関係が完全に放置されてる。
隔離すればある程度安全には違いないんだが、
年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。

443:デフォルトの名無しさん
11/11/01 14:48:13.78
>>441
IT系じゃないよね?

444:デフォルトの名無しさん
11/11/01 17:08:02.57
>年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。

「ウイルス発見されたー ちんこもむなー」に見えた。
疲れてるな、俺。


445:434
11/11/01 19:53:43.66
>>443
ちがいます。
専門的な作業は外注しますし、
私はプログラマーとかじゃないのでVBAもろくに使えません。
でも簡単なマクロでも自分の仕事には十分役立ちます。

446:デフォルトの名無しさん
11/11/02 09:34:22.37
>>445
ウィルスって騒ぐほどの会社ならいいが。
世間一般的な(家庭レベル)セキュリティで十分な気がするけどな。
例えば、世界が認める日本企業なんかにいるんなら、そのサーバーを
ターゲットにするだろ?

一般企業でウィルス感染は、いわば社会人のモラル欠如の結果、
変なサイトにアクセスし感染って感じじゃね?だいたい一般的な
会社をターゲットにするなんて考えられない。メリットなしだ。

今のウィルスはマルウェア型で個人情報(カード情報)の抜き取り
がメインになりつつある(日経PC情報)。あまり、そこに力いれん
方が良いと思うけどな。

あとウィルスソフトのフリーも入れない会社自体も問題あるけどね!
長文すまん。むかつくやつはスルーしてくれ。

447:デフォルトの名無しさん
11/11/02 10:57:04.17
無防備なPCはそもそもネットにつなぐな

普段使うようなサイトでも改ざんされたりしてるだろ
相手のサーバがクリーンかどうかチェックできないのに
変なサイトかどうかは判断できない


448:デフォルトの名無しさん
11/11/02 14:16:05.36
>>447
>普段使うようなサイトでも改ざんされたりしてるだろ
ほんとに?

>変なサイトかどうかは判断できない
エロサイトやフリーダウンロード横行しているサイト
検証してアップいるサイトならOK。


449:デフォルトの名無しさん
11/11/02 14:17:29.21
変なサイトってここの事か?
昔ノートンが誤検知して大騒ぎした事があった

450:デフォルトの名無しさん
11/11/02 14:19:00.18
saymoveが改ざんされてたじゃまいか

451:デフォルトの名無しさん
11/11/02 15:59:02.41
>>450
saymoveは寄生型のサイト。
それを普通のサイトというのは変でないの?

452:デフォルトの名無しさん
11/11/02 19:36:59.65
読み上げについて、Excel2003です
Application.Speech.Speak Range("A1")
で文字を読み上げさせることはできたんですが、読み上げる音声(sam,kenji,naoko)を指定する方法ないですか?
コントロールパネルから設定できるのは知っていますが、VBAで制御する方法を教えてください。

453:デフォルトの名無しさん
11/11/02 20:02:24.73
読み上げについてです
コントロールパネルから読み上げる音声(sam,kenji,naoko)を設定できるそうですが
どうればよいのでしょうか?

454:デフォルトの名無しさん
11/11/02 20:39:14.89
>>452
.GetVoices().Item(n)

455:デフォルトの名無しさん
11/11/02 21:20:33.70
>>453
そのままOKボタン押せば設定されますよ

456:デフォルトの名無しさん
11/11/03 10:53:32.25
>>455
コントロールパネルのどこで?

457:デフォルトの名無しさん
11/11/03 11:46:58.15
URLリンク(www.geocities.co.jp)
コントロールパネルに「音声認識」がある場合に動作します


458:デフォルトの名無しさん
11/11/03 11:49:39.30
>>457
ニャイ場合は?

459:デフォルトの名無しさん
11/11/03 11:52:32.60
ア キ ラ メ ロ

460:デフォルトの名無しさん
11/11/03 12:09:33.23
ぃゃょ

461:デフォルトの名無しさん
11/11/03 13:38:29.29
使用ソフトexcel2003で質問です。
ある特定のフォルダにある複数のエクセルファイルから,幾つかの条件でデータを抽出し,
新規のエクセルファイルに集約するマクロを作りたいと思っています。お力を拝借いただきたいです。

○元データ
あるフォルダに顧客データファイル(氏名,都道府県,郵便番号,電話番号,性別,などが一行に並んでいる)が複数ある。
仮にファイル名「顧客1」「顧客2」……とする。

○抽出条件
例えば,氏名が「田中」または「斉藤」,かつ都道府県が「神奈川」「山梨」「鹿児島」「北海道」「沖縄」のいずれか,
かつ性別が「男」。など複数の条件

○作成ファイル
元データと同じ項目並び順で,条件に該当した顧客データを一つのエクセルファイルに収める

オートフィルタとコピペを繰り返せばよいかと思ったのですが,私の知識では複雑な条件に
対応させることができませんでした。上記の都道府県の例のように最低5つのキーワードで抽出を可能にしたいです。
どなたかそれらのコードを記述していただけませんでしょうか?

462:デフォルトの名無しさん
11/11/03 13:57:03.41
accessにするべき

463:デフォルトの名無しさん
11/11/03 15:25:20.59
>>461
こんなページが有ったよ。
参考にできるんじゃないか?
URLリンク(www.eurus.dti.ne.jp)


464:デフォルトの名無しさん
11/11/03 16:02:54.01
>>461
ExcelファイルにSQL投げればいいんじゃないかな

465:デフォルトの名無しさん
11/11/03 22:01:10.50
>>461
サンプルを用意すればそれに応じて
書いてみてもいい


466:デフォルトの名無しさん
11/11/03 22:23:55.12
データの件数によっては、VBAじゃ遅すぎて実用にならないんじゃ・・・。

467:デフォルトの名無しさん
11/11/04 03:28:43.61
元データがエクセル表だってんなら、何でやっても大差はでない気はするが

468:デフォルトの名無しさん
11/11/04 08:24:28.27
100件ぐらいまではたいした違いはないだろうけど、数千件、数万件となってくると、
一旦 CSV で出力して、Perl かなんかで処理したほうが、
CSV出力の手間を込みで見ても断然早いんじゃないかな。

469:デフォルトの名無しさん
11/11/04 09:33:12.22
ひとつのExcelファイルにまとめるスクリプトを書いてあげたよ。
URLリンク(codepad.org)
まあこれを超えるものは作れないだろう。

470:デフォルトの名無しさん
11/11/04 10:15:22.29
>>469
あなたすごいですねぇ。
こんな上級者がこのスレにいたとは!!!


471:デフォルトの名無しさん
11/11/04 11:11:46.91
そうか、code padはVBAの場合plaintextで置けば良いんだ。

472:デフォルトの名無しさん
11/11/04 11:38:07.14
>>469
何コレ。天才じゃないの?

473:デフォルトの名無しさん
11/11/04 12:18:24.35
初心者です。
アクティブセルの列番号は ActiveCell.column で取れますが、
フィルターをかけて非表示の列ができると結果が変わってきます。
フィルターをかけた状態で元の列番号を取ることはできるのでしょうか?
出来る方法があれば教えて下さい。

474:デフォルトの名無しさん
11/11/04 12:24:27.86
さすがの俺もそれは知らないなぁ

475:デフォルトの名無しさん
11/11/04 12:35:17.76
>>474
サンクスです

476:デフォルトの名無しさん
11/11/04 12:54:04.07
>>469 >>470 >>472
自演乙()

477:デフォルトの名無しさん
11/11/04 18:31:44.08
>>469
こういうのをサクッっと作れちゃう人尊敬する

478:デフォルトの名無しさん
11/11/04 21:35:16.35
IDでないんだな、それが

479:デフォルトの名無しさん
11/11/05 00:08:29.18
誰かExcel2003で下がエラーになるかどうか試してくんない?
俺は2007同様エラーになると思うんだが、エラーにならないと言ってるやつがいるもので。
Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Match(0, a, 0)
End Sub

480:デフォルトの名無しさん
11/11/05 00:21:37.78
今Excelが手元にないので

481:デフォルトの名無しさん
11/11/05 09:37:23.44
>>479
Excel2000の場合だと、

Dim a(1 To 5461) As Long

までならOKで、

Dim a(1 To 5462) As Long

以上だと

実行時エラー '13':
型が一致しません。

てのが出る


482:デフォルトの名無しさん
11/11/05 11:16:59.21
>>481
トン。
2000の制限は俺も知ってたんだけど、2003は2007同様65536までじゃないのかな~。

483:デフォルトの名無しさん
11/11/05 11:45:41.27
>>482
2003でやったところ、65536だとOK

484:デフォルトの名無しさん
11/11/05 18:51:59.71
>>483
65536でOKなのは知ってるが65537じゃどうなの?

485:デフォルトの名無しさん
11/11/05 20:24:02.33
2003でやってみたけどまさかこんな結果になろうとは

486:デフォルトの名無しさん
11/11/05 20:25:29.55
65536 "だと" OKって言ってるんだから普通に考えればNGだろw

487:デフォルトの名無しさん
11/11/05 20:42:14.70
もういいわ、誰か他の人に聞きたい。
Excel2003で次のコードはエラーになる?

Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Sum(a)
End Sub


488:デフォルトの名無しさん
11/11/05 20:46:58.23
2003で実行

65537:エラー
65536:OK

489:デフォルトの名無しさん
11/11/05 20:49:42.59
まぁ区切りのいい数字だわな

490:デフォルトの名無しさん
11/11/05 20:52:42.28
>>487
エラーになったらエラいこっちゃ。

491:デフォルトの名無しさん
11/11/05 21:04:48.81
>>488
サンクス。
やっぱ予想通りエラーだな。
某板だけどなんであんなウソ書くのかなぁ。

492:デフォルトの名無しさん
11/11/06 00:38:27.29
本家のVisual Basicも挑戦しようと思い本を読んでると
ExcelVBAでは A=A+1 と記述すべきところは Visual Basicでは A+=1 としないといけないみたいです。
でもこんなのイヤです。
Visual Basicでも従来どおり A=A+1 でも使用可能ですか?

493:デフォルトの名無しさん
11/11/06 00:49:34.68
さらにVisual Basicでは、標準モジュールは使わなくて、クラスモジュールを使うと書いてます(フォームモジュールもExcelVBA同様存在する)。
このクラスってなんですか?
上級向けの本ではよく出てくるので、おそらく大事だと思うんですが
ひとことでいえばどんなしくみですか?

494:デフォルトの名無しさん
11/11/06 01:20:13.48



495:デフォルトの名無しさん
11/11/06 01:28:29.79
型とは、長文でいえばどんなしくみですか?

496:デフォルトの名無しさん
11/11/06 01:29:32.60
>>492
使えるけど使わない。
論理演算子のAndやOrも、意味は知らなくてもいいから
Andalso、Orelseと書き換える様に。

497:デフォルトの名無しさん
11/11/06 01:32:49.84
>>479
一応だが…2010でも実行。
結果は他の人と同じだった。

>>492-494
一言どころか一文字とは。

498:デフォルトの名無しさん
11/11/06 01:35:42.91
>>493
VBの話はスレ違いなので
VBのスレ探してそこでやってください

499:デフォルトの名無しさん
11/11/06 01:43:19.62
>>495
例えば~ As Collectionとした場合、このCollectionに当る部分が型。
要するに~に当る部分が何ものなのかを定義している所。
このCollectionクラスはAddと言うメソッドを持っている。
クラスモジュールで似た様なもの作るとするならば、
Collectionと言う名をクラスモジュールに付けて、Addと言うメソッドを作る。
適当だけどこんな感じ。

スレ違いには同意なので、VB.Netスレで聞いて下さい。


500:493
11/11/06 01:54:08.04
さっぱりわからん

501:デフォルトの名無しさん
11/11/06 02:00:07.93
>>500
わからなくていいんです。
クラスってのはオブジェクト指向プログラミングの
中核を成すとても難しい概念。
そう簡単にわかってもらっちゃ、世の中のプログラマー
たちがメシを食えなくなりますんで。

502:デフォルトの名無しさん
11/11/06 08:54:58.20
わからなくて良くはないだろ。
その概念に出会って一月経ってわからん言ってる奴は
半年後もわからん言ってるよ。
そして1年後も3年後も5年後も同じこと言い続ける。

503:デフォルトの名無しさん
11/11/06 08:56:26.22
おっと、スレチへのレスだったか。突っ込まなきゃ良かった

504:デフォルトの名無しさん
11/11/06 09:01:51.18
VBA はいつまて VB6 ベースで行くんだろう?
そろそろ VB.net か C# でも書ける様にしてくれないだろうか。

505:デフォルトの名無しさん
11/11/06 10:51:32.57
C#でオブジェクト指向らしい言語にはなったが
大切なのはそれを設計に生かすこと
設計がオブジェクト指向ならVBでも十分
てか、メンテナンスに優れていて想像しやすいものならOK

506:デフォルトの名無しさん
11/11/06 11:05:38.78
>>505
>設計がオブジェクト指向ならVBでも十分

VB って今の VBA のこと言ってるの?

「書ける」と「書き易い」の違いぐらいは理解しようね。

507:デフォルトの名無しさん
11/11/06 11:14:25.39
エンドユーザー部門が使えるレベルの
マクロ・簡易言語としての側面をVBAは持つ。
本格的なクラスベースの言語になると
オブジェクト指向についての詳細な知識が必要となり
エンドユーザー部門がついてこれない。
おそらくずっとVB6レベルのままだろうし、そうでなくてはならない。

508:デフォルトの名無しさん
11/11/06 11:18:08.63
別の言い方をすれば
馬鹿でもオブジェクト指向らしくせざるを得ないのがC#
客はうんなこと分かってないから喜ぶわけだがw

509:デフォルトの名無しさん
11/11/06 11:40:05.15
>>502
じゃあ鯛焼き機の話でもしようか

510:504
11/11/06 12:01:24.06
>>507-508
いや、別に VBA を無くせといってるわけじゃないよ。

> VB.net か C# (* でも *) 書ける様に

そもそも、C# でオブジェクト指向らしくないコードなんていくらでも書けるだろ。

ひょっとして、class ってキーワードがあったらオブジェクト指向らしいとでも思ってるの? (w

511:デフォルトの名無しさん
11/11/06 12:07:25.11
>>510
いい加減スレ違いの話を続けるのはやめてくれ

512:デフォルトの名無しさん
11/11/06 12:12:05.59
あれ?

馬鹿がばれて逆切れ?(w

513:デフォルトの名無しさん
11/11/06 12:19:51.24
C#しか知らないんだろうね
ここで勉強しようよ 仲良く

514:デフォルトの名無しさん
11/11/06 12:21:03.69
ここはVBAのスレです。
そろそろ軌道修正願います。

515:デフォルトの名無しさん
11/11/06 12:29:40.65
まぁVbaにも継承こそ出来ないものの
クラスはあるんだからその話をすればいいじゃない

516:デフォルトの名無しさん
11/11/06 15:56:34.80
じゃあ行番号つけた旧BASICに則ったコード書こうぜ

517:デフォルトの名無しさん
11/11/06 16:13:24.96
>>516
旧BASICってどれだよ。N-BASIC 辺りのことか?
誰得だよw

518:デフォルトの名無しさん
11/11/06 17:35:57.95
やだなあ、先輩。Hu-Basicに決まってるじゃないですか。

519:デフォルトの名無しさん
11/11/06 17:38:45.67
いや、dbBASICかもしれんよ

520:デフォルトの名無しさん
11/11/06 17:48:44.86
ここはExcel VBA質問スレだろ?
ズレまくってるのを早く修正しる

521:デフォルトの名無しさん
11/11/06 17:57:18.44
じゃ質問よろしいかしら?

呼び出し元で例外処理を一括で行ってるとして、
呼び出し先でエラーが発生した時に処理していたセルを、
ログなどに記録したいとします。

記録先や記録方法は、よしなにするとして、
このセル情報を、どーやって保持・参照すれば良さげでしょう?

出来れば自前で保持などせず、例外オブジェクトあたりから引っ張れると素敵ですが、
そんな仕組みあったかしら?
なお当然ですが、呼び出し先で発生する例外は自前でスローするとは限りません。

522:デフォルトの名無しさん
11/11/06 17:59:39.33
tiny BASIC でスタートレックと聞いてやってきました。

523:521
11/11/06 18:08:01.49
>>521補足
擬似コードで説明するなら、下のe.getStacktrace()に代わる情報として、
処理中のセル位置情報を引っ張れたら幸せだなーと
でも、おそらけ例外オズジェクトからは取れないので
何か工夫しないとダメな悪寒。

class Caller() {
try {
new Callee().execute();
} catch (Exception e) {
log(e.getStacktrace()); //←これ相当
}
}

524:デフォルトの名無しさん
11/11/06 18:35:16.58
フォームのボタンについて

たとえば
Private Sub CommandButton1_Click()
textbox1.value=textbox1.value + 1
end sub

これをENTERで連打するとしっかり連続計算されるけどクリック連打だとダブルクリックになるのでゆっくり連打しかできない。
ダブルクリックイベントにならないようにクリックで早く連打してクリックイベントにする事は可能ですか?


525:デフォルトの名無しさん
11/11/06 18:36:36.77
ダブルクリックもクリックと同じ処理にすればいんでね?

526:デフォルトの名無しさん
11/11/06 18:38:17.42
>>523
そんなの書ける位理解してるなら
ファクトリーパターンでも使っとけ

527:523
11/11/06 18:54:22.09
>>526
生成だけハンドルすればOKならファクトリーメソッドでいんだけど、
どちらかっていうとテンプレートメソッドが近いですかね。

で、そこまではいんですけど、
今どこ処理してたの?情報は、VBAでだとどーやって引っ張ったらいいのかしらん?
という点が質問したい点なのですわ。
その情報としては実運用を考えるとセル位置とか知りたいなー

528:デフォルトの名無しさん
11/11/06 18:54:25.64
>>521
そもそもその例外はVBAのエラーであって、EXCELのエラーではないからな
それに、VBAの例外オブジェクトにスタックトレースとかなかった気もする
自分でスタックトレース相当な何か作る(当然設定も自分でする)しかないんじゃね

>>524
ダブルクリックと判定される間隔はシステムのコントロールに設定がある
つまり、アプリでどうこうしちゃいかんって事かと
とりあえずダブルクリックイベントで+2すれば?

529:524
11/11/06 19:23:46.00
ダブルクリックでも同じ処理したらいい感じになりました。エンター連打と同じぐらいスムーズには動かない
けど十分快適になりました。ありがとうございます。

530:521
11/11/06 19:51:50.89
>>528
うーん、やはりVBAの例外オブジェクトにはスタックトレース情報はないですよね。。
VBA風擬似コードで↓こんな感じにするしかないのかしらん

public sub caller()
on error resume next
 callee.execute()
if error
 log(ExcelContext.getInstance().getCell());
end if
end sub

class Callee
 public sub execute
  dim context as ExcelContext = ExcelContext.getInstance()
  foreach cell in Selection
   context.setCell(cell); //忘れずに呼ぶ
do本来やりたいことWith(cell)
  end foreach
 end sub
end class

忘れずに呼ばなきゃならない時点で
イケてない感がはんぱない。パフォーマンスも悪そう。
どなたか良いアイデアありますか?

531:デフォルトの名無しさん
11/11/06 20:39:04.45
ユーザーフォーム上のボタン名をセル上から取得するにはどうすればいいですか?
たとえばA1の値を参照して、A1が"あ"なら"あ"というボタンにする

532:521
11/11/06 20:45:15.17
Captionにセットするだけちゃうん?

533:デフォルトの名無しさん
11/11/06 21:36:47.24
Interface→implementsを使われている方にお聞きします。
今implementsにて実装しています。(勉強中…)
インターフェースクラス_インターフェース定義メソッド
の実装をしていくわけですが、実装の中で別のインターフェース定義メソッドを
呼び出す時にも インターフェース_ の接頭語みたいなのがつくので
何か違和感があります。こんなものですか?(下のサンプル参照)
インターフェース_の接頭語がつくような設計自体おかしい事ですか?

ご存じな方よろしくお願いします。

IAnimal
sub eat() :end sub
sub hunt() :end sub

//////
implements IAnimal
CLion
sub IAnimal_eat()
IAnimal_hunt()    ←この部分の違和感
foo()
end sub

sub IAnimal_hunt()
hoge()
end sub

534:デフォルトの名無しさん
11/11/06 22:42:14.77
>>530
Calleeのプロパティとして参照する。
getInstance?シングルトン?VBAのクラスのコンストラクタってprivateに出来たっけ?

>>533
知らないけど勉強中との事なので。
もう何年もVBAやってるけどInterface使うプロジェクトは見たこと無いです。

535:521
11/11/06 23:07:20.59
>>534
あら。CalleeとかCallerとかVBAだと予約語っぽいですね。
先のコードは書きやすい命名で書いちゃいましたが、命名規約的にNGっぽいかも。
ちと勉強してきますね。レスサンクスです。

シングルトンは格納先を素直に書いたらこうかな?レベルで書いた擬似コードなので
VBAだと書けないかも。
その場合は外部からインスタンス化されたら例外投げるとかで対処する感じでしょうかね。

536:デフォルトの名無しさん
11/11/06 23:38:42.94
>533

VBAでInplementsを使って実装する時は、
たとえば533のように、Interface名_methodのように
予約語がついてしまう。
これはVBAの仕様上の問題で、ヘルプにも書いてある。

たくさんの共通する命令がある時に
命令の実装忘れがないようにできるくらいで、
VBAで活用する機会は正直あまりないと思います。
(Interfaceの多重継承も一応できますが…)

537:デフォルトの名無しさん
11/11/07 15:28:13.65
末尾再帰の最適化について質問です。

FunctionA(n As Long)
If n=0 then
FunctionA=1
Else
FunctionA=FunctionA(n-1)+FunctionB(n-1)
End if
End Function

FunctionB(n As Long)
If n=0 then
FunctionB=2
Else
FunctionB=FunctionA(n-1)+FunctionB(n-1)
End if
End Function

このように末尾で2つの関数が再帰呼び出しされている場合、どのように最適化すればよいでしょうか。
nが大きいと2の累乗でスタックに詰まれていくから重くなるのだと思います。

538:デフォルトの名無しさん
11/11/07 15:31:06.87
>>537
頭痛が痛くなるな。俺には無理。

539:デフォルトの名無しさん
11/11/07 15:38:15.47
>>529
mouseupイベントに書けばいいのでは?

540:デフォルトの名無しさん
11/11/07 17:06:56.12
Excel2007

Listbox(1行につき3列)に抽出した結果を格納して表示することを考えてるんですけど、その結果が1件のみの時は、
フォームを出した時点で選択状態にしたいと思ってます。

んで、その選択状態にするにはどのようにするんでしょうか?


541:デフォルトの名無しさん
11/11/07 17:08:03.60
selectedindexとかない?

542:デフォルトの名無しさん
11/11/07 18:00:25.53
>>533
VBAの勉強してるなら、Interfaceの事は見なかったことにして忘れた方が良い
オブジェクト指向のクラス設計勉強してるなら、ちゃんとしたオブジェクト指向言語つかった方が良い

>>537
どっかアルゴリズムのスレ探してそこで聞いた方がいいんじゃね

543:デフォルトの名無しさん
11/11/07 18:16:54.06
>>541
フォームのInitializeで

Me.LstBox1.Selected(0) = True

ででけました。㌧クス

544:デフォルトの名無しさん
11/11/07 20:31:22.81
>>537

これ、初期値のA(0)=1とB(0)=2こそ違うけど、それ以降は
A(n) = B(n) = 3*(n-1)^2 で、再帰も糞もなくないですか


545:デフォルトの名無しさん
11/11/07 22:00:47.52
例に突っ込むって馬鹿なの?

546:デフォルトの名無しさん
11/11/07 22:30:43.31
例に突っ込むとかじゃなく最適化してるじゃん
こういう再帰的な呼び出しに関して
一般的な最適化の手法ってのはないんじゃね?

547:デフォルトの名無しさん
11/11/07 22:58:23.61
なんかテスト臭いな。
何て言うか、自分の考えていた答えよりちょっとレベルの低い答えが
帰ってニヤってしたかったけど、根本から最適化されてしまって逆切れしたみたいな。

548:デフォルトの名無しさん
11/11/07 23:17:54.08
おまいらなんの話してんだよ。高卒の俺にはさっぱりわからんぞ

549:デフォルトの名無しさん
11/11/08 01:05:39.01
馬鹿には無理

550:デフォルトの名無しさん
11/11/08 03:55:30.21
あれ、飛び石で範囲指定したセルってリサイズ不可?

A列の入力されたセルを選択して右に5セル移動して更に範囲を横20に拡大したいんだけど。

Columns("A").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
Selection.Offset(0, 5).Resize(, 20).Select

551:デフォルトの名無しさん
11/11/08 07:15:33.62
>>550
やってみりゃ分かるだろ?
For Eachでも回して処理するんだな。

552:デフォルトの名無しさん
11/11/08 07:16:45.11
書き忘れたがFor Eachはセル単位じゃなくAreas単位で処理な。

553:550
11/11/08 22:57:25.82
やっぱ無理か
changeイベントの実行範囲に指定したかったんだけどな…

554:デフォルトの名無しさん
11/11/09 00:03:03.63
sheetsとworksheets、どっち使ったらいいの?

555:デフォルトの名無しさん
11/11/09 00:28:41.37
そういう質問するうちは、worksheets を使ってればいい。

556:デフォルトの名無しさん
11/11/09 00:37:32.18
>>554
そういう質問をする内はSheetsを使っておけばいい。
対象にグラフのシートを含めてみれば分かる。

557:デフォルトの名無しさん
11/11/09 00:46:15.15
フォームコントロールとActiveXコントロールの違いは何ですか?
どう使い分けますか?

558:デフォルトの名無しさん
11/11/09 00:47:23.90
>>555-556
そういう回答をするうちは、ロムっていればいい。
ちゃんと解説できる日本語を身につけたら書き込みしてよい。

559:デフォルトの名無しさん
11/11/09 00:54:52.73
>>558
そういう突っ込みをする内は(ry

560:デフォルトの名無しさん
11/11/09 08:41:58.50
ワークシートと決まってればSheetsは間違い。
何か分からないときにSheetsを使う。
たとえば>>343の修正の>>345とか。

561:デフォルトの名無しさん
11/11/09 11:24:12.15
Activesheetだっけ、Activeworksheetだっけ、それともどっちも使えるんだっけ?
こういうどっちでもokみたいな仕様はexcel作者は即刻に止めていただきたい。
いつもとまどう。特に1か月以上ぶりにVBAを使い始めたとき。

562:デフォルトの名無しさん
11/11/09 17:15:55.07
excelの作者はちゃんと理由があって似たようなものを作ってるんだと思うんだが
問題はそれをちゃんと使い分けられないVBAプログラムの作者だろ

563:デフォルトの名無しさん
11/11/09 20:08:45.75
互換性を放棄すれば大分スマートな構造になりそうな気はする。
というか、そうなったらVBA自体確実に消されるなw

564:デフォルトの名無しさん
11/11/10 09:16:08.07
Sub test1()
Dim a as integer
Dim b as integer
a=10
b=Function test2(a)
End sub

Function test2(c as integer) as integer
test2=c*2
c=30
End function
------------------------------------------------
これを実行したあとは
a=30
b=20
c=30
になってますよね?

もし5行目をb=Function test2(a+1)にしたら
a=10
b=22
c=30
ですか?

さらに5行目をb=Function test2(a*1)にしたら
a=10
b=20
c=30
ですか?

565:デフォルトの名無しさん
11/11/10 13:10:50.31
withつこてる?

566:デフォルトの名無しさん
11/11/10 13:26:31.82
フォームコントロールとActiveXコントロールの違いは何?
どう使い分けます?

567:デフォルトの名無しさん
11/11/10 14:52:08.78
コマンドボタンに黒の左向きの三角を設定したいんだけど、
フォント名を合わせても四角が表示されてしまいます。
どうすれば設定できますか?
イメージでも良いです。
よろしくお願いします。

568:デフォルトの名無しさん
11/11/10 15:03:30.32
等式で大文字と小文字を区別するにはどうしたらいいの?

(例) If range("A1")=""Apple" thenで、A1がappleでもAPPLEでもaPPLEでも、正と判断してしまうので困っちゃうの。


569:デフォルトの名無しさん
11/11/10 15:08:18.03
そんなあほな

570:デフォルトの名無しさん
11/11/10 15:13:20.98
>>567
配置を縦にして▲を表示すればいいよ

571:デフォルトの名無しさん
11/11/10 15:19:07.49
>>568
Option Compare Text
があるんじゃない?

572:デフォルトの名無しさん
11/11/10 15:24:50.03
>570
おおおおおおおお!ありがとうございました

573:デフォルトの名無しさん
11/11/10 17:28:27.63
VBAから外部ソフトのボタンを押すプログラムを書きました。
いくつかあるボタンのうち、同じプログラムで押してはいるけど、
反応しないボタンがあります。

Ret = SendMessage(hwnd1, WM_LBUTTONDOWN, 0, 0)
Ret = SendMessage(hwnd1, WM_LBUTTONUP, 0, 0)

このプログラムでハンドルをハンドルを変えて実験すると、
きちんと反応するボタン、反応しないボタンがあるのはどう対処すればいいでしょうか?

ちなみに、ハンドルはスパイソフトでみてあっているのは確認しています。
ステップ実行でボタンがへこんで戻るのも確認しました。
Cで書いてやってみるときちんと反応します。

よろしくお願いします。


574:デフォルトの名無しさん
11/11/10 17:43:12.12
PostMessageにすればいいよ

575:デフォルトの名無しさん
11/11/10 18:22:42.16
>>573
VBAから外部ソフトを操作するのって、どういう命令を使うの?
それ実にやりたいことだから知りたい。

576:デフォルトの名無しさん
11/11/10 19:18:25.24
>>573
出来ました。
ありがとうございました。

>>575
ここでは説明できないし、自分もググりながらやってるから
間違った説明をしてしまうと思う。
VBA winapi とかでググってくれ。
大まかなことはすぐ理解できると思う。

577:デフォルトの名無しさん
11/11/10 19:26:47.69
間違えた。
>>574でした。

578:デフォルトの名無しさん
11/11/10 20:21:09.15
>>575
GUIアプリケーションって、
他のプロセスからメッセージを受け取って、その内容に応じてイベントハンドラを呼び出してるんだけど、
メッセージ送信は送信先アプリの送信先コントロールが分からないとダメで、
その識別子をウィンドウハンドルって言うよ。
SendMessageってAPIで送信出来るよ。

579:575
11/11/10 20:41:27.81
さっぱりわからん

580:デフォルトの名無しさん
11/11/10 20:56:18.21
何故、メモ帳に字が書けるか。
ボタンを押すとファイルの保存先を聞いてきて保存できるか。
まずはその仕組みのイメージだけでも理解しないと575のやりたいことは出来ないよ。


581:デフォルトの名無しさん
11/11/10 21:12:01.99
ワークブックのイベントで新しいシートを追加したら、
既存のSheet1のWorksheet_Changeのコードを追加したシート
にコピーする事は可能でしょうか?

自分なりにぐぐったところ下記の様な感じだと思うのですが

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim VBP, Code As String
With ThisWorkbook.Sheet1.VBProject.VBComponents("Sheet1").CodeModule
Code = .Lines(1, .CountOfLines)
End With

この後はどうしたら良いのでしょうか?

582: 忍法帖【Lv=2,xxxP】
11/11/11 02:58:43.64
>>581
InsertLines メソッド を使って書き込むんだけど
コードをコピーするんじゃなくて

ワークブックの Workbook_SheetChangeイベントで
イベント処理するってのはどうなのかな?
これなら新しいシートを追加してもイベント処理対象だし

583:583
11/11/11 04:37:40.14
セル範囲をVariant変数に入れて別のセル範囲にコピーする方法についての質問です。
ただ単にコピーするだけならできたのですが、
その中の1行目と2行目を入れ替えて貼り付ける事は可能でしょうか?
ためしに以下のようなコードを書いてみましたが
「インデックスが有効範囲にありません」のエラーが出ました。
Sub test1()
Dim MyData As Variant
Dim MyTemp As Variant
MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
MyTemp = MyData(1)  <-ここでエラーになる
MyData(1) = MyData(2)
MyData(2) = MyData(3)
MyData(3) = MyTemp
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub

・・・
>>584に続きます

584:583
11/11/11 04:38:17.31
>>583の続きです
ForNextのネストで変数内の配列要素を一個ずつ入れ替えることはできたのですが、
それではコードがゴチャゴチャしてあまりスマートでは無いように思います。
Sub test2()
Dim MyData As Variant
Dim MyTemp As Variant
Dim I As Integer
Dim J As Integer

MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
ReDim MyTemp(5)
For J = 1 To 5
MyTemp(J) = MyData(1, J)
Next J
For I = 2 To 3
For J = 1 To 5
MyData(I - 1, J) = MyData(I, J)
Next J
Next I
For J = 1 To 5
MyData(3, J) = MyTemp(J)
Next J
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub

何かよいお知恵があったら教えてください。よろしくお願いします。

585:583
11/11/11 04:41:48.59
すみません、最初に「1行目と2行目を入れ替えて」と書きましたが
コード中では3行目も入れ替えてますね。
とにかく、行の入れ替えがしたいということです。
よろしくお願いします。

586:デフォルトの名無しさん
11/11/11 07:05:07.56
一行ずつ取ってきて別の行にセットする。
CopyとPasteSpecialで事足りる気もするけど。

587:583
11/11/11 18:45:06.36
>>586
回答ありがとうございます。
行、列ともに少なければどんなやり方でも良いのですが、
前述のコードはあくまでもサンプルでして、
実際の業務では複数のブック間で(数百行、数十列)のセル範囲を
数千件単位でコピーする必要があって
データをコピーするときにはセルを操作するよりも
変数で処理するほうが速いのだそうで、
少しでも高速化できればと思っていた次第です。

エクセルのヘルプでも配列内の要素の操作は
ForNextのネストで行うような説明が書いてありましたし、
残念ですがあきらめます。

588:デフォルトの名無しさん
11/11/11 20:09:17.68
そんなもんマクロの記録で十分では?

589:デフォルトの名無しさん
11/11/11 22:11:24.39
回答した>>586>>588より質問者の方がレベルが高い件

590:デフォルトの名無しさん
11/11/11 23:05:47.35
行単位で扱えればいいって事でしょ?
配列を記録する配列を用意しておいて、行を記録する配列を動的に
作って行を記録。
で、コピーするときにコピーしたい順に配列を呼び出していけばいい。

591:デフォルトの名無しさん
11/11/11 23:14:01.49
>>587
普通に交換用のプロシージャ作れば?

例えば、
Sub 交換用プロシージャ(ar As Variant, r1 As Long, r2 As Long)
'2次元配列ar の r1行目と r2行目の要素交換する
とか。

なら、呼び出しで
交換用プロシージャ 1, 2
交換用プロシージャ 2, 3
で、>>584の交換ができる

592:591
11/11/11 23:15:25.98
間違えた
交換用プロシージャ MyData, 1, 2
交換用プロシージャ MyData 2, 3
だった…

593:デフォルトの名無しさん
11/11/11 23:16:03.74
>>587
状況にもよるけど、余り複雑だったり
ループを多く組まなければならないなら、
対象のシートにSQLを投げてレコードセットをシートに展開するループだけに
するって手もあるよ。

594:デフォルトの名無しさん
11/11/11 23:31:07.22
ある一定の範囲をドーーーーンとコピーして、別シートにバーーーーンと貼り付けて、
1行目に行挿入して、3行目をこぴーして、1行目に貼り付けて、3行目を削除でよくね?
screenupdateをfalseにしとけば、そんなに遅くないんじゃ値?

595:デフォルトの名無しさん
11/11/11 23:57:37.72
そうだよ
ドーーーーンにバーーーーンにビシャーーーーンだよ

596:デフォルトの名無しさん
11/11/12 00:21:33.42
ビビューンバシャーンズシーン

597:デフォルトの名無しさん
11/11/12 00:43:08.87
すまん, 583氏の質問に便乗。

この時プロシジャーとファンクションでの処理が考えられるけど、
それぞれのメリデメと実際どう使い分けてる?

sub swap(Mydata as variant, r1 as long, r2 as long) と定義し
call swap(Mydata, r1, r2)
TargetRange.value = Mydata

function getSwapVal(Mydata as variant, r1 as long, r2) as variant と定義し
TargetRange.value = getSwapVal(Mydata, r1, r2)


598:デフォルトの名無しさん
11/11/12 01:03:46.68
Mydataが二次元配列と仮定するなら、
FunctionだとVariantの内容がコピーされて返されないか?

>>583
最終的な並び順のインデックスを末尾の列に書き込んで、
Range.Sortメソッドでソート実行、
その上でコピペしまくるという方法もあるな。

599:デフォルトの名無しさん
11/11/12 01:15:33.01
>>597
MyDataが呼び出し先のプロシージャ内で書き換え可なら
Subプロシージャのほうがスッキリしていると思う。
書き換え不可なら、Functionプロシージャにして
プロシージャ内で戻り値用の配列を用意して使う。

どちらにしても配列は参照渡し
r1, r2 は値渡しにする

600:デフォルトの名無しさん
11/11/12 09:22:23.76
>>581
> ワークブックのイベントで新しいシートを追加したら、
> 既存のSheet1のWorksheet_Changeのコードを追加したシート
> にコピーする事は可能でしょうか?
>

シートの追加、じゃなくて、シートのコピー、ではダメ?

601:デフォルトの名無しさん
11/11/12 19:58:21.46
すいません、質問させてください。(XP / Excel2000,2003)
Formとボタンの形状を変えたと思っています。

(構想)
1 画像でフォーム外観、ボタン外観を作成
2 透過色の指定
3 カーソル先の座標習得
4 カーソル先の色を習得
5 MouseDownかClickイベントで、透過先をクリックできないようにする。

現在3,4を同時に進めているのですが難航しています。
いざ作り出してから非常に回りくどいとも思ったのですが、良案はないでしょうか。

602:581
11/11/13 09:06:54.82
>>582さん
>>600さん

ご返答有難うございます。

情報不足ですいません。
やりたい事としては、複数人で使用するワークブック「A」が有り、
「A」が変更された場合にワークブック「更新情報」に変更箇所を記録。
「A」を開いた時に「更新情報」が開いてない場合には、「A」のWorkbook_Openで
開く様にしてあります。

「更新情報」に変更箇所を記録まではうまく出来ているのですが、
新しいシートを追加された時、当然ながらWorksheet_Changeに何も
コードが無いもので対応出来ません。
なので Workbook_NewSheetのイベントで、既存Sheet1のWorksheet_Changeを
新規シートにコピー出来ないかな?と思い質問させていただきました。



603:デフォルトの名無しさん
11/11/13 09:48:07.24
>>601
リージョン操作系APIを使えば3, 4はWindows側がよしなにやってくれる
あとはWindowsAPI相談室で聞いとくれ

604:デフォルトの名無しさん
11/11/13 09:50:29.19
>>602
てか、元々そんな機能なかったか?
EXCELって。

605:デフォルトの名無しさん
11/11/13 10:02:00.37
>>602
コードを流し込むことはできなくなった
Workbook_NewSheetでコードなしシートが追加された場合
コード入りのシートをコピーして新規シートの内容をコピー
新規シート削除、コピーシートリネーム

606:デフォルトの名無しさん
11/11/13 11:38:30.11
>>602
共有設定じゃ実現できない事をやりたいの?

>>605
出来なくなったkwsk
セキュリティが厳しくなったって事とは別になにかあったの?

607:582
11/11/13 12:36:37.68
>>602
Worksheet_Change
じゃなくて
Workbook_SheetChange
にしたらって意味で >>582で書いたつもりだったんだけどな
後者の方は全てのシートのセルの変更に対してイベントが出るよ

...なんか俺 >>602のやりたい事を 勘違いしてるのかな

608:デフォルトの名無しさん
11/11/13 13:07:43.19
Sub テスト()
Range("A4").Value = Range("B4").Value & Range("C4").Value & Range("D4").Value & Range("E4").Value & Range("F4").Value & Range("G4").Value
End Sub

上記のソースを以下オートフィルをしたように内容をA列すべてに適用させたいのですが
Sub テスト()
Range("A5").Value = Range("B5").Value & Range("C5").Value & Range("D5").Value & Range("E5").Value & Range("F5").Value & Range("G5").Value
End Sub

Sub テスト()
Range("A6").Value = Range("B6").Value ・・・

どのように記述すればよいでしょうか?。。。

609:デフォルトの名無しさん
11/11/13 13:08:54.43
A行ですね・・・

610:デフォルトの名無しさん
11/11/13 13:10:12.97
>>608
いきなりコード書くんじゃなく、
Excelでセルに数式いれる作業を、マクロの記録でスクリプト化してみたらどうだろう?
ためしてないからダメかもだけど。

611:デフォルトの名無しさん
11/11/13 14:50:21.78
>>603
VBAでそれらしい機能が見つけれなかったので、
デバイスコンテキスト辺りを調査中。
ネットで例が見つからないわけではないのですが、
VBAで取り扱ったいるものが少ないので参考になったりならなかったり。
もう少し具体的なところで行き詰った時、
こちらかAPI質問箱で質問させて頂くかもしれません。
ありがとうございました。

612:デフォルトの名無しさん
11/11/13 16:55:38.57
>>608
ThisWorkBook.Sheets(1)内で、セルA4にB4からG4までの値をいれて、
セルA4以降のA列のすべての行について、A4の内容をオートフィルするマクロ

Sub Test_AutoFill()
With ThisWorkbook.Sheets(1)
.Cells(4, 1).FormulaR1C1 = "=RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]"
.Cells(4, 1).AutoFill Destination:=Range(.Cells(4, 1), .Cells(.Rows.Count, 1)), Type:=xlFillDefault
End With
End Sub

613:デフォルトの名無しさん
11/11/13 17:10:34.61
>>612
ありがとうございます!本当に助かりました!

614:デフォルトの名無しさん
11/11/13 19:04:54.85
あるbookに書かれたVBAを実行すると
コードから他のbookを開いて
その他のbookに記録されてるVBAを実行するにはどうすればいいの?

615:デフォルトの名無しさん
11/11/13 19:31:41.60
Application.Run

616:614
11/11/13 19:51:30.83
>>615
そのとき最初のVBAで使ってた変数をそのまま次のVBAでも使うにはどうすればいいの?

617:デフォルトの名無しさん
11/11/13 21:15:34.61
>>616
パロメータに引数で渡す

618:デフォルトの名無しさん
11/11/13 21:20:33.81
>>617
それパラメータのことですか?(大笑)

619:デフォルトの名無しさん
11/11/13 21:29:12.05
>>618
パラメータに引数で渡す
パラメータって言い方普段しないから

620:デフォルトの名無しさん
11/11/14 01:14:35.01
バロメーターが上昇中です

621:デフォルトの名無しさん
11/11/14 15:45:40.33
バカメーターが上昇中です


622:実行時エラー9が出ます。どこが悪いのでしょうか。
11/11/15 10:26:19.47
デバックしても、原因が表示されません。
Sub lister()
Sheets(リストシート).Range("B4").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlEqual, Formula1:="3,4,5"
.InputTitle = "ファイルレイアウトを選択して下さい。"
.ErrorTitle = "選択エラー"
.ErrorMessage = "リスト内にあるファイルレイアウトを選択して下さい"
.IgnoreBlank = True
End With
End Sub

623:デフォルトの名無しさん
11/11/15 13:25:54.88
>>622
"原因が表示されない"とはどゆういみ?
エラーメッセージが表示されないって事?
エラー行が表示されないって事?

実行時エラー'9'は "インデックスが有効範囲にありません。"

エラー行はたぶん2行目だとおもう
Sheets(リストシート).Range("B4").Select

624:デフォルトの名無しさん
11/11/15 13:30:10.10
実行ボタンを押しても、どこも黄色くならずダイヤログボックスだけが出るんです。
2行目のコード、どこらへんがまずそうでしょうか。

ちなみに、同じブック内に「リストシート」というシートはあります。
それとも、標準モジュールに置いて実行すべきでしょうか。

625:デフォルトの名無しさん
11/11/15 13:30:56.73
最終的には、Formula1:="3,4,5"を別のシートのセル範囲に置き換える予定でもあります。

626:デフォルトの名無しさん
11/11/15 13:36:09.46
誤: Sheets(リストシート).Range("B4").Select
正: Sheets("リストシート").Range("B4").Select

627:デフォルトの名無しさん
11/11/15 13:49:53.55
>>624
>>626
いきなり他シートのセルはセレクトできないよ?
いったんそのシートをアクティブにしないとね。
そもそもセレクトする必要はないんだけど。

628:626
11/11/15 13:59:31.65
おー たしかに
コードだけみて脊髄反射的に答えちゃだめだな俺

629:デフォルトの名無しさん
11/11/15 14:39:04.06
Sheets("リストシート").Activeをsubの次の行に入れました。
すると今度は、438番の実行時エラーになりました。



630:デフォルトの名無しさん
11/11/15 14:42:14.77
activateにしたら、エラーはなくなりました!

でも、Formula1:="3,4,5"の右側を
別のシートのセル範囲に置き換えると、実行時エラー424が出るようになってしまいました。

シート名!範囲名では、リストにするためのオブジェクトとして認識されないのでしょうか。

631:デフォルトの名無しさん
11/11/15 15:25:12.84
>>630
Excel(エクセル)基本講座:入力規則の使い方
URLリンク(www.eurus.dti.ne.jp)

632:デフォルトの名無しさん
11/11/15 15:56:44.22
「抽出条件 データの入力規則で、他のワークシートまたはブックへの参照は使用しません。」との
ダイアログボックスが出てきました。

Excel2003だからでしょうか。

633:デフォルトの名無しさん
11/11/15 15:57:22.72
マクロの方では、実行時エラー1004です。

634:デフォルトの名無しさん
11/11/15 16:00:29.12
解決しました。ありがとうございました。今日は、エクセルのセルの広さに救われましたね。

635:デフォルトの名無しさん
11/11/16 11:48:33.65
Sub test()
Dim a As Integer
Dim b As Integer
a = ActiveCell.Row
b = ActiveCell.Column
Dim c As String
c = Cells(a & "," & b).Value
MsgBox c
End Sub

msgboxがaのとき5、bのとき2が出ます。
そのセルには「rrt」と書きました。
でもmsgboxをcにすると、msgboxに何も表示されません。

原因は何なのでしょうか。

636:デフォルトの名無しさん
11/11/16 11:56:11.56
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$S$4:$S$20"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = "エラー"
.InputMessage = ""
.ErrorMessage = "エラー"
.IMEMode = xlIMEModeNoControl
.ShowInput = True
.ShowError = True
End With

入力規則の話で恐縮ですが、functionプロシージャの中のselect文に
上記のマクロを挟んだら、エラーが出てリストボックスが作れません。

再試行を促すダイアログボックスが出て、ユーザ定義関数はセルに挿入できますが
肝心の入力規則(リスト)は作られません。

637:デフォルトの名無しさん
11/11/16 12:12:56.36
>>635
Msgbox(Cells(a, b).Address と
Msgbox(Cells(a & "," & b).Address で
違いを比べてみてください。

638:デフォルトの名無しさん
11/11/16 12:35:37.94
>>636
セルに挿入したユーザ定義関数からは値を返すだけで 変更操作は出来ない

639:デフォルトの名無しさん
11/11/16 12:37:41.64
Msgbox Cells(a, b).Addressだと、セルを絶対参照したように$B$5が出ました。

Msgbox(Cells(a & "," & b).Address を少し直すと、$AZ$1が出ました。
ちなみに、Msgbox Cells(a & "," & b).Address じゃないと構文エラーになりました。

640:デフォルトの名無しさん
11/11/16 12:39:54.61
>>638
やりたいことは、値の取得だけです。
ユーザ定義関数を挿入したセルの入力規則を、その関数から操作するのは無理なのでしょうか。

641:デフォルトの名無しさん
11/11/16 12:45:11.51
c = Cells(a, b).Valueにしたところ、参照する件だけはアッサリ解決してしまいました。
でもまだ、不思議な気持ちです。

642:デフォルトの名無しさん
11/11/16 12:51:38.36
>>640
ん?
>>636をみると入力規則の設定を変更してるようにみえるが?

643:637
11/11/16 13:05:12.67
>>641   637は最後の「終わりカッコ」が抜けてました。
>でもまだ、不思議な気持ちです
Range(アドレス指定)と混同してますね
ひとつのセルを指定する場合は、
Range("B5")のように、カッコの中を1個の文字列値で指定するものと、
Cells(5,2)のように、カッコの中を、行と列を表す2個の数値で指定するもの
(カンマは2個の数値の区切り)の違いがわかりますか?

644:デフォルトの名無しさん
11/11/16 14:35:41.18
>>642
入力規則をセルに設定することはできますが、セルに設定されている入力規則の内容を変えることができません。

>>643
いろいろ試してみます。

>ALL
今日もたくさんお教えいただき、ありがとうございました。m(_ _)m

645:デフォルトの名無しさん
11/11/16 20:24:27.87
セル入力でオリジナルのfunctionを使うときに、
たとえばA1で記入、つぎにB1で記入など、二度連続で同じfunctionを実行したことを判別したいのですが、なにかアイデア下さい。

646:デフォルトの名無しさん
11/11/16 20:48:57.40
>>645
影響のないセル(例えばAZ1)に対して、「特定のFunction」と「それ以外のすべてのマクロ」が
異なる値を書き込むようにしたら、判別できるのでは?
初期値は 0 にしておく(ブックオープンのイベントで書き込み)
特定のFunction は 1 を書き込む(書き込む前にAZ1の値を調べ、1なら二度目ってわかる)
※3度目以上でも1のままですが・・・
それ以外のすべてのマクロ は 0 を書き込む

647:デフォルトの名無しさん
11/11/16 20:49:21.98
>>645
グローバル変数に走った回数を入れればいいんじゃないの?
聞いてる意味違う?

648:601
11/11/16 21:09:47.38
先日質問に来た者です。
リージョン操作というアドバイスを頂きながら、躓いてしまいました。
API系質問スレは覗いたのですが…
Google同様VBA系の質問がなさそうだったので、こちらの諸先輩方の方が良いかと思いました。
質問は2つです。よろしくお願いします。

1 リージョンでメニューバーを消したときのフォームの移動について。
  「SendMessage hWnd, WM_SYSCOMMAND, SC_MOVE, 0」
  というのを発見しましたが、動作させれませんでした。
  フォームクリック時に「メニューバーを操作している」情報を送るというものだと思うのですが。

2 多角形リージョンについて
  練習で長方形や楕円形のリージョンは作成できました。
  しかし、三角系の頂点指定だけはできませんでした。
  設定に失敗してもエラーが出ず、「角に黒い影が出る」or「全部消える」という挙動をしています。

Private Sub UserForm_Activate()

’座標指定
Dim p(100) As Point   ’???
'???
'リージョンの作成
Dim hRgn As Long
hRgn = CreatePolyPolygonRgn(p(0), 3, 1, WINDING)  'CreatePolygonRgnはエラーから抜けれなかった
'ハンドルの習得
Dim rc As Long, hWnd As Long
hWnd = FindWindowA("ThunderDFrame", Me.Caption)
'リージョン適用
rc = SetWindowRgn(hWnd, hRgn, True)

End Sub


649:デフォルトの名無しさん
11/11/16 22:14:30.32
PostMessageでよくない?

650:デフォルトの名無しさん
11/11/16 22:18:01.86
>>644
副作用を伴うユーザー定義関数が実行できたとしても偶然と考えておいた方が無難だよ

URLリンク(support.microsoft.com)
ワークシートのセル内の数式から呼び出されるユーザー定義関数では、Microsoft Excel の環境を変更できません。つ
まり、このような関数では次の処理が実行できません。
スプレッドシートでのセルの挿入、削除、または書式の設定。
• 別のセルの値の変更。
• ブックでのシートの移動、名前の変更、削除、または追加。
• 計算方法や画面表示など、環境オプションの変更。
• ブックへの名前の追加。
• プロパティの設定およびほとんどのメソッドの実行。


651:デフォルトの名無しさん
11/11/16 22:30:18.13
>>648
この話題は スレチだとおもうが
>>2 ★3,★4 参照

ググれば サンプルあるぞ
(VBのサンプルでも参考なる)

そもそも そのコードだと多角形の頂点座標をどこで指定してるんだい

652:デフォルトの名無しさん
11/11/16 23:05:11.79
>>646
ありがとうございます。
セルへのアクセスを減らすために実施しようと思ってますので、
少し違いますが、参考にします。

>>647
やはりそれですか。
関数がたくさんあって、
初期化を他の関数に追記するのがどうにもめんどうで。
たとえば、20個関数があったら、残りの19個はfalseにしたり0にしたりがどうも…

653:デフォルトの名無しさん
11/11/16 23:53:31.95
>651
長方形などは分かりやすかったのでVBのサンプルで解決できました。
↑で記入したコードも成功例のどれかからコピーして使っています。
しかし、PolyPolygonRgn/PolygonRgnは動かせなかったので、一つ具体例がほしいのが現状です。
設定に関しては、Declare等々と一緒で行数的に入らなかったのと、
試してみたどの設定を代表として書けばいいのか悩みました。

スレ違い申し訳ありませんでした。
API質問箱が若干荒れ気味なのと、
VBAの例の少なさ=回答の少なさになるかと迷っていたのですが、
あちらで改めて質問してきたいと思います。

654:デフォルトの名無しさん
11/11/17 00:08:31.63
>>653
VBなら ここで多角形(星型)のサンプルあるぞ
URLリンク(hanatyan.sakura.ne.jp)

655:デフォルトの名無しさん
11/11/17 00:12:42.47
>>652
ああ、連続でよばれたかどうかね。
関数に対応する連番を列挙体にでも用意しておいて、
1度目にグローバル変数かモジュール変数にしまった関数に対応する連番と
2度目に呼んだ時の関数に対応する連番と比較して同じなら連続でよばれたと判断できるよ。
何連続で呼ばれたかとか、連続で呼ばれたのは何回かと言うのが欲しいなら、
その関数に対応した連番をキーにコレクションやディクショナリに
回数を設定してため込んでやればそんなに面倒臭い事にはならないんじゃないかな。

656:デフォルトの名無しさん
11/11/17 02:12:10.37
>>654
えーっと…コピーしたマクロが正常に起動しました。
文章の送信前に最後の確認をしたら、
フォームが消えるパターンから変化しました。
「Me.Move」が原因だったようです。

(後出し情報になりますが)
座標の設定方法は同じだと思います。
違う点は頂点の数を、定数で設定しているところでしたが、数字に変えてもちゃんと動きました…。
ユーザー定義名も異なってましたが、「Declare」と設定を合わせたら動くことを確認できました…。
「CreatePolygonRgn」で動いた理由もよくわかりませんが、後程「CreatePolyPolygonRgn」も試してみます。

何というか本当にご迷惑をおかけしました。
自分がAPIに手を出すのは早すぎるようです。
ありがとうございました。

(追伸)
「PostMessage」を教えてくれた方にも感謝。
多分自分の独力ではこれ以上無理そうです。
別の方法で力技回避を試みます。

657:デフォルトの名無しさん
11/11/17 02:47:36.65
>>656
つか
VBAのユーザフォームでホントにそれが必要なのか再検討したほうがよくね
APIの勉強とか個人的趣味ならいいけど
業務に適用するんだったら後々メンテする人が苦労するだけかと

658:デフォルトの名無しさん
11/11/17 13:07:35.75
>>657に同意。
言語変えるなりVSTOなりにしたほうが…

659:デフォルトの名無しさん
11/11/17 13:36:19.78
VSTOとは?
Very Simple Technichal Option?

660:デフォルトの名無しさん
11/11/17 14:41:21.40
>>657
耳が痛いお話です。
一応、個人の趣味勉強。
ただ、業務へのフィードバックもやっていくつもりなので線引きは薄いです。
職場でVBA弄れる人間は私しかおらず、
私自身汚いソースをあまり見せたくありません。


>別言語
職場でも勉強できる(勝手にソフトを入れれない)、
エクセルが入ってないPCはほとんどない、
偶々サンプルとなるものがあったから。
(将来的には)C++、Javaも勉強したいです。

661:デフォルトの名無しさん
11/11/17 15:30:56.30
>>660
じゃあ仕方ないか
.NetはFrameWorkだけでビルド出来るけど初心者向けではないししね

662:デフォルトの名無しさん
11/11/17 16:15:47.91
>>660
IT系以外の職場だとそんな所多いと思う
だからこそ
業務へは あまりウケ狙い的な事をしないで

"シンプル・イズ・ベスト"

663:デフォルトの名無しさん
11/11/17 16:26:01.56
VBAだけだと、かゆい所に手が届かないんだよなあ
アプリを作るための言語じゃないから

まあ.Netもコントロールの出来が悪いから、できそうでできないこと多いけどね
使いやすいUIとか作ろうとすると、結局めちゃくちゃ手間がかかる

664:デフォルトの名無しさん
11/11/17 17:53:58.68
>>662
「ザ」がぬけてる。
"シンプル・イズ・ザ・ベスト"
英語系やってるとこういうフレーズにさえ著しい違和感を感じるようになる職業病。

665:662
11/11/17 18:25:39.46
へっ(汗;;;;)そうなんだ「ザ」抜きで憶えてた
学生時代英語は赤点だったからなーーー
ありがと

666:デフォルトの名無しさん
11/11/17 18:48:03.64
>>664
この場合、theは無くてもいいんじゃないかな。

667:デフォルトの名無しさん
11/11/17 19:33:10.94
ExcelでBlackOnyxのような3D迷路を作っているのですが
3D表示で直角三角形はどう表現したらいいですか?
■はInteriorに色をつけてやろうとしてるんですが
斜めの部分が再現できず困ってます。

668:デフォルトの名無しさん
11/11/17 19:39:02.79
「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では
下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか?

・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ

669:デフォルトの名無しさん
11/11/17 20:44:22.64
本屋で立ち読みして自分で判断ぐらいしやがれ、このクソボケ

670:デフォルトの名無しさん
11/11/17 20:47:42.40
>>669
なんだと、このハゲ頭

671:デフォルトの名無しさん
11/11/17 21:06:18.86
なんで俺がハゲだってわかった、このストーカー

672:デフォルトの名無しさん
11/11/17 22:11:11.62
>>667
無理しないでパターンで持てばいいじゃない。
むしろ色付けは条件付き書式でやった方が楽。

673:667
11/11/17 22:34:26.44
>>672
なるほど
32x32の正方形が3D画面だとして、
セルに透明色の1や2や3・・・・・を代入するだけで
あとは条件付き書式が勝ってに色付けしてくれるってわけですか。
そのアイデア採用させていただくでやんす。

ところでパターンとは何ですか?
念のため作ろうとしてるのはこんな青や水色の壁で、
斜めになってる部分が再現できないんです。
URLリンク(homepage3.nifty.com)

674:デフォルトの名無しさん
11/11/17 22:41:35.45
>667
Excelで学ぶ コンピュータグラフィックス技術入門
URLリンク(www.coronasha.co.jp)
URLリンク(www.youtube.com)

675:660
11/11/17 23:32:12.28
ROMに戻る前に一応ご報告。
「CreatePolyPolygonRgn」も動かせるようになりました。
問題点は、座標項目が途中からずれており、リージョンが線になっていた、というものです。


>ウケ狙い
あるマクロが一部で認められてしまい、
上に報告するか、という話が持ち上がっております。
そこで趣味で調べていたAPIを組み込もうとしたのが始まりです。


>>667
作りかけのテトリスが終わったら、
大迷路を作り、それを改造してWIZを作ろうとしてる人間がここに…。
斜めをは私も悩んでました。頑張ってください。


676:デフォルトの名無しさん
11/11/17 23:36:53.61
>>673
先にいくつかの壁の絵の部品のパターンを持っておいて、
周りの壁の状況に合わせてそれを組み合わせて表示する様にしておけばいいんじゃないかと
言うつもりでレスしたんだけど、
BlackOnixと全く同じにするのはかなり厳しいと思うよ。
何と言ってもシェイプがセルよりプライオリティ高いからね。
背景にBlackOnixと同じ線が入った絵を用意してやるか、全てシェイプで描くか・・・。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch