[表示 : 全て 最新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)


610 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:05:26 ]
特定のEXCELシートが開いている時にはそのシートを閉じ、
開いていなければ何もしないという処理って可能ですか?

611 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:08:50 ]
>>610
ブックじゃなくてシート?

612 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:28:23 ]
>>610
ブックなら可能
やりかたは自分で調べろ

613 名前:610 mailto:sage [2009/01/23(金) 00:29:16 ]
>>611
間違えました。
シートではなくブックです。
失礼しました。

614 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:04:27 ]
>>613
Workbooks( ).Close

615 名前:610 mailto:sage [2009/01/23(金) 01:16:51 ]
>>614
それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。

616 名前:603 [2009/01/23(金) 01:22:49 ]
長かったので問題の箇所まとめました。

If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then

この分岐で(入力値)
J0235-2PtAuX10
H0053-1PtX2
を拾ってしまうんですが、何が原因でしょうか。

617 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:25:39 ]
>>615
Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け

618 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:37:15 ]
XP SP3 Excel 2002 SP3

ユーザフォームのShowModalをFalseに設定しています。

ユーザーフォームには、複数のテキストボックス、チェックボックス
コマンドボタンを配置しています。

ユーザフォームとワークシート間を移動した時の
イベントを教えて下さい。

Activate,Deactivateを試しましたが、該当しないようです。

宜しくお願いします。



619 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:47:47 ]
>>616
色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png

620 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:54:13 ]
>>618
該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。

621 名前:618 mailto:sage [2009/01/23(金) 02:06:26 ]
>>620

有難う御座います。

やはりそうですか。ほかに力技でも考えてみます。

長いこと調べていたんで、これですっきりしました。

622 名前:デフォルトの名無しさん [2009/01/23(金) 02:11:43 ]
>>619
そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。


623 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:17:18 ]
あのさ、偶に勘違いしてる人が居るけど、Like演算子の文字クラスで
[AB,CD,EF]とした場合、AB CD EF のどれかに一致するものではなく
A B , C D E F のどれかに一致するものという意味になる
つまり「 , 」は区切り文字ではなく検索文字のひとつに過ぎない

>>619の記述だと、B1のは「末尾が C , O S F e のどれかで終わるもの」という意味で
C1の記述だと「C X , O 2 のどれかが含まれるもの」という意味になる
その正しい仕様を理解していれば、○の付いてるものは正しく仕様法則に従っていることが解る

AB CD EFのどれかで終わる場合にマッチさせたければ、"*AB"、"*CD"、"*EF"の3条件をOrで重ねるか
Like演算子ではなく正規表現で"(AB|CD|EF)$"とするべきだ

624 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:19:54 ]
>>622
こうなったらRightとInstrで1個ずつ調べるしかないと思う

625 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:25:34 ]
>>619
たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?

626 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:26:37 ]
>>623
なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな

627 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:28:49 ]
>>617
ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。

628 名前:デフォルトの名無しさん [2009/01/23(金) 02:33:57 ]
>>625
>>626
そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。

長いコードを書くことが確定した。



629 名前:623 mailto:sage [2009/01/23(金) 02:40:06 ]
>>626,>>628
OfficeTANAKAかな?

まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物

630 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:51:41 ]
>>615
プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ

on error resume next
workbooks("B.xls").close
on error goto 0

631 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:24:46 ]
出来るなら
一度保存して閉じるけど


632 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:26:53 ]
そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。

633 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:04 ]
もし
開いていたら
閉じる


634 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:08:26 ]
>>602
ありがとうございます

635 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:21 ]
A1とA2セルの書式設定の表示形式をyy.mm.ddにして
A1セルに文字列で「09.08.07」と入力して

a = Cells(1, 1)
Cells(2, 1) = Mid(a, 1, 2) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 7, 2)

上のような処理を実行すると何故かA2セルに「07.09.08」と順番が入れ替わって表記されてしまいます。
何故なんでしょう?
EXCELは2000です。

636 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:44 ]
>>610
開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close

637 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:39:01 ]
>>635
年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す

638 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:43:34 ]
>>636
全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。

どの方法を使うかはケースバイケースだ。



639 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:58:53 ]
>>637
地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。


640 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:06:36 ]
>>639
ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。


641 名前:630 mailto:sage [2009/01/24(土) 22:09:05 ]
>>638
>エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる

実際にErrorステートメントなんか存在しなくても、
厳密なプログラムを書けば99.9%(経験上100%)同じことはできる

Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?

642 名前:635 mailto:sage [2009/01/24(土) 22:15:04 ]
>>640
639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。

現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。


643 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:19:03 ]
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ

644 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:22:37 ]
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな
書式の問題かもしれないし

645 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:11:33 ]
>>643>>644
A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。
ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。

それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。

この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。


646 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:48:18 ]
>>645
DateSerialをかますんだ!

Dim s As String
If TypeName(Range("A1").Value) = "String" Then
  s = Range("A1").Value
  Range("A1").Value = DateSerial(Left(s, 2), Mid(s, 4, 2), Right(s, 2))
End If

647 名前:635 mailto:sage [2009/01/25(日) 07:49:29 ]
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。

648 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:56:18 ]
Open ファイル名 For 開き方 As #ファイル番号

というコマンドの「#」の意味を調べてみたんですが
言及されてなくてわかりません。
この#にはどんな意味があるのでしょうか?



649 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:08:33 ]
あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?

650 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:25:52 ]
>>648
「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。

651 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:55:24 ]
>>649
Workbook_WindowActivate

652 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:04:08 ]
>>650
ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。

>>649
そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。

653 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:08:00 ]
開くときではなくアクティブにしたときでしょ?

654 名前:652 mailto:sage [2009/01/25(日) 19:12:30 ]
確かに。読み間違えました。
どうもすみません。

655 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:40:49 ]
>>651
ありがとうございます。

もう一つ質問です。

非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか?
現在ブックBがアクティブ状態で

Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1)

のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?

656 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 20:29:26 ]
そもそも、ちょっと考えてみれば当然のことだが
アクティブじゃないシートにはアクティブなセルなど存在しない

それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので
上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない

つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり
君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」
と表現するのが正しい

というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない

657 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 21:02:48 ]
うぜーよ

658 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 22:30:01 ]
べつにうざくはないが、よくそこまで親切にレスできるのかと関心する
職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで



659 名前:デフォルトの名無しさん [2009/01/25(日) 23:23:32 ]
EXCEL97です
ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A"
このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか

660 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:36:15 ]
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"

661 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:51:02 ]
>>656
丁寧にありがとうございます。

>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。


662 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 16:18:41 ]
ActiveとSelectを混同してると見た
俺がちょっと前までそうだったから

663 名前:デフォルトの名無しさん [2009/01/26(月) 19:12:35 ]
質問です。
データをシステムから取り込んだエクセルファイルなんですが、
セル内の数値の先頭に半角スペースがついてしまいます。
たぶんこれが原因で、数値の大小がおかしくなります。

例えば

変数=20.222
if 変数>10.333 then

これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。


664 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 19:51:29 ]
>>663
変数="20.222 "
if value(trim(変数)) > 10.333 then

665 名前:664 mailto:sage [2009/01/26(月) 19:58:01 ]
すまん、ワークシート関数と勘違いしました。
val(trim(変数))

666 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 20:58:54 ]
>>663
元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」

667 名前:デフォルトの名無しさん [2009/01/26(月) 20:58:56 ]
質問よろしいでしょうか。
乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。
会社のPCで結果が出るまでに2時間はざらなのですが、

会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz

単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、
逆に遅くなりました。
8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、
VBAで8コアフルに稼動させるようなソースは書けるんでしょうか?

しかし、前の乱数値の結果が次に影響するような演算なので、
追い越してなにかを処理しておくというのは意味なさそうです。

668 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:00:29 ]
>>663
csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?



669 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:04:13 ]
>>667
そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。

670 名前:667 [2009/01/26(月) 21:10:32 ]
>>669
ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…

671 名前:デフォルトの名無しさん [2009/01/26(月) 21:11:18 ]
www.nicovideo.jp/watch/sm5947975

672 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:14:15 ]
>>668
単純なcsvの読み込みなら、たとえ "  123   " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。

673 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:17:18 ]
>>670
そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。

674 名前:デフォルトの名無しさん [2009/01/26(月) 21:18:21 ]
664-666
ありがとうございます。
明日試してみます。


675 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:23:52 ]
>>670
10億回程度のループならそんなに多いとは思わんけどな。

無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、
誰か詳しい人には相談した?
それから基本的なこととしては、Variant型の変数は使ってないよな?

あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。

676 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:26:21 ]
675の言うことには耳を貸さないのが吉

677 名前:667 [2009/01/26(月) 21:43:17 ]
いろいろアドバイスありがとうございます。
すいません統計などと洒落たことを言ってしまいましたが、
プログラム自体はパチスロ機のシミュレータです。
自分ひとりでつかうならいいんですが、
プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。
そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、
うまいこと作り直す時間も知識もありません…。
同じ課でたまたまプログラムの知識があった私が任されています…
ので同じ課にはわかる人はいません…。
もちろん実機担当に質問はできますが、手一杯だとは思います…。

アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。
実機はもちろん人の操作によって一連の流れになるので、
アルゴリズムも単純な上から下です。

実行時間は現状でそれなりに満足しています。
10億試行は最終的段階なので、普段は5分とかそういうレベルです。

ただ、環境(CPU)による違いがなかったので質問した次第です。
気遣いありがとうございました。

678 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 22:31:23 ]
会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz
で逆に遅くなるってのは悲しいな
結局クロックが全てか
てか
実機担当って職業プログラマーが居る、その会社は何だろう
気になる




679 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 22:41:48 ]
パチンコ機屋じゃないの?

680 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:30:39 ]
>>678
うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが
1スレッド処理でもi7の方が速いぞ

そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が
0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい
会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ
君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが
発生していると思われる

681 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:32:56 ]
質問です。

EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると
ブラウザにもハイパーリンクが表示されるけど
そのブラウザ上のリンクをクリックした時に
Private Sub Workbook_SheetFollowHyperlink
を起動することってやっぱ無理かな?

682 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:38:43 ]
>>680
自宅PCは省電力でクロックダウンしているんじゃないか?

683 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:59:12 ]
>>681
自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。

684 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 00:37:43 ]
何かにCPUパワーを喰われてるとか
「遅くなった」のが実は0.01秒程度の差だったとか
もし自作ならドライバがちゃんと入ってないとか

685 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 04:47:10 ]
CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、
よい方法はありませんでしょうか?

ネットのフォーラムなどの情報では、
 ActiveSheet.Buttons(Application.Caller)

 ActiveSheet.DrawingObjects(Application.Caller)
などでオブジェクトを取得できるとあるのですが、
プロパティがない、などと言われます。
代替手段はないものでしょうか?

環境:Excel2007



686 名前:685 mailto:sage [2009/01/27(火) 04:54:33 ]
すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。
どうしたらよいのだろうか

687 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:11:01 ]
>>686
押したボタンのクリックイベントに適当に書くのが普通じゃない?




688 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:23:04 ]
>>685
コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?



689 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:38:13 ]
>>685
「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
  MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub

690 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:43:14 ]
>>688
マクロが登録できるのはフォームコントロールの方だぞ

691 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 06:11:34 ]
>>686
そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
  Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?

692 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 07:45:56 ]
>>690
両方出来るぞ

693 名前:685 mailto:sage [2009/01/27(火) 10:53:06 ]
教えて! Watch Excel VBA Application.caller エラー2023について
oshiete1.watch.impress.co.jp/qa4024188.html

ここの方法でいけましたが、もう少しスマートな方法がないかな?と。

>>687 >>691
10個あったら、10個分イベントと名前の組をかかないといけないですよね。
冗長性があります。

>>689
ActiveXの方では無理っぽいです・・・

>>688
ActiveXの方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・

694 名前:685 mailto:sage [2009/01/27(火) 10:57:08 ]
URL間違えました。こちらでした。

moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
www.moug.net/tech/exvba/0150059.htm


695 名前:デフォルトの名無しさん [2009/01/27(火) 16:07:22 ]
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。

696 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:13:46 ]
>>695
いんじゃね

697 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:19:40 ]
ありが十匹!!

698 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 20:14:57 ]
>>693
一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから



699 名前:デフォルトの名無しさん [2009/01/29(木) 09:07:22 ]
すみません初心者ですが質問です。
Msgboxに「月度を入力してください」と表示
→インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、
1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」
というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と
表示するにはどう組めばいいでしょうか。
○には入力した月数を出したいのですがよろしくお願い致します。

700 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 09:08:34 ]
>>699
VB初心者スレへどうぞ。

701 名前:デフォルトの名無しさん [2009/01/29(木) 11:00:04 ]
>700
すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。

702 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 12:15:27 ]
>>699
流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ

703 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 14:29:53 ]
超初心者です。

何個か開いたファイルの中から、特定のファイルを探す。
という単純な事がしたいのですが
ファイル名が例えば「経理ファイル200812.xls」のように、
月によってYYYYMMの部分が変わってしまいます。
開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合
どのようにすればよいでしょうか。
ワイルドカードが使えないかと思ってやってみているのですが
よろしくお願いします。


704 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 15:01:32 ]
dim b as workbook
for each b in workbooks
if b.name like "経理ファイル*" then
b.activate
end if
next

705 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 15:53:30 ]
>>704

できました!!
ありがとうございました。

706 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 18:39:44 ]
質問です
h = 1
Do Until Cells(h, 6).Value = ""
If Cells(h, 3).Value = Cells(h + 1, 3) Then
Cells(h, 6).Value = Cells(h, 6).Value + Cells(h + 1, 6).Value
Rows(h + 1).Delete
End If
h = h + 1
Loop
2行のときは1行にできるのですが、3行以上のときも1行にしたい場合どのようにすればよいでしょうか

707 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 18:57:21 ]
>>706
最初に見つけた位置のhを保存しといてそこに入れていく

708 名前:707 mailto:sage [2009/01/29(木) 19:00:08 ]
違ったな
「Deleteしたときはhをインクリメントしない」かな?



709 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 19:45:32 ]
End Ifの前にh = h - 1で解決しました
ありがとうございます

710 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 23:41:33 ]
>>701
頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。






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

前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