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


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 ) のスレへどうぞ。

711 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 23:59:42 ]
OS XP
EXCEL2003

dteProductDay=format(date,゙yyyy/m/d゙)
cells(1,1)=dteProductDay
というように、システムの日付を整形してセルに表示させたいのですが、
フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。



712 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 00:09:19 ]
>>711
書式を変えるか、または文字列で

713 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 02:12:09 ]
>>711
的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。

たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。


714 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 12:23:35 ]
OS-XP
Office2003

Shiftキーを押しながらドラッグでセルの移動ができますが、
Shiftキーを押さなくても常にセルを移動することはできますか。

もしくはExcel上でのみ、Windowsの固定キー機能のように
Shiftキーを押しっぱなしにすることはできないでしょうか。

キーボードでなら、たとえば上に移動したい場合
ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。

715 名前:711 mailto:sage [2009/01/30(金) 20:50:12 ]
>>712-713
ありがとん

cells(1,1)= "'" & dteProductDayでうまくいきました。


716 名前:7777 mailto:sage [2009/01/30(金) 22:31:30 ]
エクセルでシート1で例えばF団体をA列の1で書いてそれを
シート3のD列の3に自動記入させるマクロは分かるんだけど

シート1でF団体がA列の1以外になっても自動記入できるマクロある?
あるなら教えて

717 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:07:32 ]
日本語で質問できない人お断り

718 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:08:56 ]
>>716
Private Sub Worksheet_Change(ByVal Target As Range)
                        ~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる

719 名前:7777 mailto:sage [2009/01/30(金) 23:13:26 ]
718さん
意味がわかりません


720 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:18:17 ]
日本語読めない人お断り

721 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:31:13 ]
Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1")
みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?



722 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:53:13 ]
F団体ってなんだろ…新しい宗教か?

723 名前:7777 mailto:sage [2009/01/31(土) 08:51:59 ]
>>721
うん!!そのとおりです

724 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 09:19:07 ]
>>723
A1とA2の両方に値がある場合はどちらを採用するの?

725 名前:7777 mailto:sage [2009/01/31(土) 09:52:09 ]
>>724
1月23日 団体名  内容
       F団体
       

このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって

726 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 10:06:03 ]
>>725
1対1対応ならなんの問題もないでしょう?

それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行


727 名前:7777 mailto:sage [2009/01/31(土) 10:42:31 ]
A列からD列の10行までの範囲がコピー範囲のときは
どうマクロ組むの?

728 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:15:45 ]
>>727
マクロ記録してみたら?

729 名前:7777 mailto:sage [2009/01/31(土) 11:34:10 ]
できました!
ありがとうございました。

730 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:39:37 ]
俺が質問を理解できないうちに解決か

731 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 13:05:52 ]
>>730
VBAを使うやつは問題をミクロにとらえ過ぎている。
もっとマクロなレベルで考えるんだ。
コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?




732 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 15:18:32 ]
EXCELを使うのは本来はすんごく高度なスキル(=異常な思考様式)が必要
そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、
VBAは最高級のBASICの一つで、これだけでも結構重量物
(VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ
けはやめたほうがいい)
VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作
は遅いはExcelと基本的に合わないわでロクなことないね。

733 名前:7777 mailto:sage [2009/01/31(土) 15:24:34 ]
いやできてないんだけど
マクロ記録とは?

734 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:13:28 ]
もういいから帰ってくれ!


735 名前:7777 mailto:sage [2009/01/31(土) 17:09:51 ]
ひどすぎ

736 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:10:34 ]
>>725
マクロの前に日本語を勉強した方が…
でも一応想像してみた

シート1
年月日  団体名  内容
1/23   F団体  陳情
1/26   D団体  年始挨拶
1/27   A団体  予算ヒア
みたいに日付ごとの日報が書いてあって
団体ごとに各シートに抽出したいんじゃないのか?
でもこれだったらわざわざ聞いてこないよな。

737 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:50:16 ]
確かにそれだったらその辺のOL捕まえた方が手っ取り早いな。

738 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 19:48:09 ]
長文ですがお許しを
最近クラスモジュールを勉強しているんですがプロパティの設定で
Letがうまくいきません。

WindowsXPSP3、Excel2003
クラスモジュール内容
Private m_TestValue As String

Public Property Get TestValue()
TestValue = m_TestValue
End Property

Public Property Let TestValue(ByVal New_Value As String)
m_TestValue = New_Value
End Property

で標準モジュールに
Public Sub Test()
Dim Test As Class1
Set Test = New Class1

Test.TestValue = "testtest"
MsgBox Test.TestValue
End Sub

として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。
これはなぜでしょうか?

739 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 20:07:43 ]
Public Property Get TestValue() As String
もしくは
Public Property Let TestValue(ByVal New_Value As Variant)

Getの戻り値の型と、Letの最後の引数の型
つまり、ひとつのプロパティの型は一致させてください


740 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 21:01:13 ]

なるほど!Property Getの戻り値も型を指定する必要があるんですね。
m_TestValue変数の型を指定していてそれを返しているから
てっきりそれだけでいいと思ってた。

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

741 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:36:34 ]
ブックAにブックBへのハイパーリンクを張って、ブックBの
Private Sub Workbook_Open()
内で色々と処理をしているのですが、
ブックA内のハイパーリンクをクリックした時にブックBを表示させずにその後の処理を実行する方法はありませんか?




742 名前:デフォルトの名無しさん [2009/02/02(月) 00:57:32 ]
初心者です。教えてください。
今フォームを使ってデータの抽出をするプログラムを作っています。
データは階層構造になっています。
仮に3階層あるとして、フォームにその3階層をプルダウンで指定してやると条件に一致したデータが表示されるようにしたいのです。
その際、上位階層をプルダウンで指定すると、その上位階層が包含する下位階層のみが
プルダウンで表示されるようにしたいのですが、どうしたらいいのでしょうか。
フィルタオプションを使用しようと思うのですが、可能でしょうか?
困っています。教えてください。

743 名前:デフォルトの名無しさん [2009/02/02(月) 01:47:00 ]
こんばんは。すみません、エクセルの質問させてください。

ブックAのシート1のA1にブックBのシート1のA1からA5を、足した結果をだしたい場合、どの様に入力すればよいですか?
どうかおしえてください。お願いします。



744 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 04:53:09 ]
>>741
ハイパーリンクでは、ブックを非表示で開くことは出来ない
ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう
因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう>>1★5

>>742
入力規則のリストの連動ならまだしも、Excel用ではなく汎用ActiveXのコンボボックスの連動は
Excelに関係ない話なのでスレ違いです>>1★3〜★4
とりあえずVB6用の方法がほとんどそのまま使えるし、サンプルも転がってる

>>743
WorksheetFunction.Sum
中に入る式は、普通にシート上で入力する式と同じだから解るよな?
まあ解らなくてもスレ違いだから自分で調べろってことになるが

745 名前:741 mailto:sage [2009/02/02(月) 21:58:13 ]
>>744
741です。
お答えありがとうございます。
うーん、やはりハイパーリンクでは無理でしたか。

私の作った処理をもう少し詳しく言うと
ハイパーリンクをクリックするとそのセルがアクティブになることを利用して
ブックBのPrivate Sub Workbook_Open() の中で
Workbooks("B.xls").Worksheets(1).Cells(1, 1) = ActiveCell.Offset(0, 1)
みたいな感じでハイパーリンクの隣のセルの情報を転記するという処理を行っていたのですが。

例えばA1とA2のセルの上にセルと同じ大きさのボタンを作り、両方のボタンに同じマクロを登録して
A1の上に作ったボタンをクリックするとB1の情報を転記し、A2の上に作ったボタンをクリックするとB2の情報を転記する
という処理って作れますか?
ハイパーリンクみたいにクリックするとその下のセルがセレクトされるみたいな処理が作れればいいんですけど。

746 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 00:52:18 ]
>>745
作れるよ
ボタンに限らずオブジェクトには配置されてるセルアドレスを返すプロパティがあるから
それが何かくらいは自分で調べようね

747 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 07:39:03 ]
>>742
Private Sub
Select change
AddItem

748 名前:741 mailto:sage [2009/02/03(火) 23:43:31 ]
セルを左クリックするとマクロが起動する処理って作れませんかね?
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
というのを使うと目当てのセルをクリックしただけでマクロを起動できるようになったんですけど
エンターを何回か押していたらその目当てのセルまでアクティブが移動してしまって望まないタイミングでマクロが起動されてしまいます。
そうではなくあくまでクリックした時にマクロが起動できるようにしたいんですけど、いい方法ありませんか?

749 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 00:04:20 ]
>>748
WorkSheetにはクリックイベントがないから、
セルに同じサイズのボタンを貼り付けるぐらいしかないんじゃ

750 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 00:38:21 ]
ワークブックにWorkbook_SheetBeforeDoubleClickてイベントに有るし
Workbook_SheetBeforeRightClickっていうのも有るし、シート名を取得して実行すれば良いのでは?

751 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 01:35:00 ]
>>750
普通「クリック」と言えば左シングルクリックのことだろう。
右クリックやダブルクリックイベントでどうしろと。



752 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 02:43:54 ]
それ言い出すと、>>749
 セルをクリックで処理したいって言ってるのに
 ボタンクリックでどうしろと
ってことになるな。

俺は>>749>>750も代用法のひとつとして有用な情報だと思うけどね。
>>749も書いてるが「セル」の「左(シングル)クリック」イベントは無いから、
対象が「セル」であること(ボタンなどを配置しなくても済むこと)を優先するなら>>750
「左シングルクリック」で操作できること(ダブルクリックしなくて済むこと)を優先するなら>>749
ってことでいいじゃん。

俺の場合、目当てのセルが複数ならダブルクリックイベントで、ひとつならボタンで妥協するかな。

753 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 02:55:30 ]
ボタンでやってみたけど、色を透明にしておいてもクリックするとなぜか灰色になって
下のセルが見えなくなっちゃうんだな。XPと2003の環境で。
代用案として出すなら、イメージコントロールを貼り付けて透明なGIFを貼った方がよさそう。

754 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 16:22:39 ]
ボタンの代わりか・・・

つラベル

755 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 20:43:07 ]
なぜ“左”クソツクなのか。右でいいやん。

756 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 20:48:34 ]
作った本人が使うんならいいけど、人が使う物なら標準と異なるUIは避けるべきかと

757 名前:741 mailto:sage [2009/02/04(水) 20:59:06 ]
741です。
皆さん色々とありがとうございました。
とりあえずボタンでやってみようと思いますが、
745でも言ってるように複数張ったボタンの内一つを押した後それに応じたセルを指定する方法が
いまだにわからない状態です。
とりあえずもうちょい調べてみます。

758 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:05:26 ]
>>757
VBAにはコントロール配列が存在しないから、
ボタンをたくさん貼ればボタンの数だけ独立したイベントハンドラが作られる。
だから、ボタンごとに各セルの処理をずらずらっと並べて書けばいい。
冗長だし面倒だけど。

さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。

759 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:30:54 ]
疑似コントロール配列使おうよ
クラスの作り方工夫すれば、疑似コントロール配列にした上で
処理は同じだが対象は違うというようにも出来るし、
そもそもボタンがどのセル上に配置されてるかは取得できるし

760 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:53:42 ]
質問です
Sheets("sheet1").Select
Dim MyRange As Range
Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1"))
いくらやっても検索値がnothingになってしまいます
どこを変えればうまく検索できますか

761 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:03:34 ]
Sheets("Sheet2").Range("A1")に入っている値が
Sheets("sheet1")のA列に存在しないとnothingになるけど




762 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:28:03 ]
>>760
別にどこも間違ってないから、原因として考えられるのは、本当に探してるデータが存在しないか、検索条件が違ってるか、だな。
それでもうまくいかない時は、Findメソッドの検索条件を省略せずにきちんと書いてみる。一例を書くとこんな感じ。

Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1"), LookIn:=xlFormulas, LookAt:= xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False)

763 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:33:13 ]
Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。


764 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:03:24 ]
質問です。
Dim v(1 To 10) As Long
とするのと
Dim a(1& To 10&) As Long
とするのはどっちがいいですか?


765 名前:764 mailto:sage [2009/02/05(木) 00:05:42 ]
すいません。
vとaとなりましたが、どっちもvです。

766 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:08:28 ]
Columns("A")もまずいな。
シートモジュールに書いてるかも知らんしな。
ちゃんとシートくらいは指定汁.

767 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:09:34 ]
>>764
この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う

768 名前:764 mailto:sage [2009/02/05(木) 00:23:21 ]
>>767
そうなんですか。ありがとうございます。


769 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 11:43:29 ]
OS XP / EXCEL2003 です。
仮に「A」というファイルがあったとして「A」のVBAから、
別のファイル「B」の「ActiveX コントールのコンボボックス」の値を参照することは可能でしょうか?


770 名前:デフォルトの名無しさん [2009/02/05(木) 15:25:43 ]
sheet1を選択している状態で以下のマクロを実行しても
sheet2のAAAという文字列がBBBに置換されません

sheet2ではなく、sheet1のAAAが置換されます

Worksheets("Sheet2").Select
Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False

771 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:31:17 ]
>>770
1行ごと(処理ごと)にいちいち対象となるシートを書かないとActiveSheetが処理される。
Worksheets("Sheet2").Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
または、
Worksheets("Sheet2").Select
Selection.Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
みたいな感じにしなきゃいけない。
確認してないからオブジェクトのエラーが出るかもしれないけど、基本的な考え方としてはこんなところ。



772 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:33:20 ]
>>769
可能です

773 名前:769 mailto:sage [2009/02/05(木) 18:35:27 ]
>>772 ご返答ありがとうございます。
もし良かったら何か例文を載せて頂けないでしょうか。

774 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 19:10:09 ]
フォーム上に配置したWEBブラウザコントロールを印刷したいのですがうまくいきません。
印刷はフォームのPrintFormメソッドを使っています。
コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが
WEBブラウザが配置されているところは空白になってしまいます。

検索してみたところAPIを使用する方法を見つけたのですが理解することができませんでした。
APIはブラウザ表示内容を画像として取得する方法だったのですが
それをイメージコントロールに貼り付けるという流れになるのでしょうか?

よろしくお願いします。

775 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 03:46:41 ]
>>773
>>1★5の通り、ここはヒントだけで自分でコード書ける人用のスレなので例文は書きません
とりあえずヒントとしてBのブックオブジェクトさえ作ってしまえば、あとはBから取得するのと変わらないと言っておく

>>774
>>1★3,4
Excelと直接関係ない汎用コントロールの話はスレ違いです

776 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:08:58 ]
あのさー、何度も言ってるけど>>1はスレの合意じゃないから。
誰かが勝手に書いて、次スレ立てるときにコピペしてるだけ。
気に入らない発言はスルーしろよ。

777 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:34:26 ]
>>770
だから標準モジュールじゃなくシートモジュールに書いてるんだろ?
SHeet2のシートモジュールに書いてればCellsの親はSheet2なんだよ。
いちいちSelectしないコーディングを心がけてりゃそういう間違いはおかさない。
Worksheets("Sheet2").Select
Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
こんなことしないで
Worksheets("Sheet2").Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
と書けば標準モジュールでもシートモジュールでもユーザーフォームのモジュールでも
ThisWorkBookのモジュールでも無関係に処理できる。
>>760も同じ間違いだ・

778 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:37:42 ]
ちょっとミスった。
>>777の3行目は
Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。
に訂正。
>>771も嘘書いちゃいかん。
ActiveSheetが処理されるとは限らないんだよ。


779 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:42:36 ]
>>776
気に入らない発言はスルーしろよ。

780 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:42:54 ]
フォルダ「A」に
「A」「1」「2」「3」というファイル名のExcelワークシートが4つあります
ファイル「A」のcell(P1:DY1850)の数式をコピーし「1」「2」「3」のcell(P1:DY1850)に自動的に貼り付けていきたいのですが
どのようにすればいいのでしょうか?
よろしくおねがいします

781 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:43:52 ]
>>779
これ言っとかないと、>>1を理由にスレ違い認定したがる奴が増えるかもしれんからな。



782 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:48:13 ]
>>780
まずマクロの記録をやってみろ

783 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 11:41:22 ]
★使ってるのは多分一人。
気に入らないなら無視すれ。

784 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 12:32:05 ]
>>1のテンプレが無かった頃から、同じ様な内容の指摘は多々あったので
指摘が>>1★n形式か、毎回文章で書かれるかの違いでしかないんだけどね

反抗期の子って、対象が形(テンプレ)になると妙に反発心燃やしたりするけど
そもそもテンプレったって、書いてあることを端的に見れば
「バージョン情報書け(★1)」「他分野の話を持ち込むな(★2〜4)」「丸投げするな(★5)」「マクロの記録くらい試せ(★6)」
だけ

これに反発してる子って、バージョン情報不要だと思ってるの?
COMやOCXやWin32APIの話から、VB言語で組める全てのアルゴリズムの話までオールOK?
そして丸投げも大歓迎で、マクロの記録なんて試すくらいなら、俺が親切丁寧にコード書いちゃるってか?

実のところはそんなこと無いだろ?
結局形有る物に反発したい年頃なだけで、根底は>>1の内容に賛同してるんだろ?
上記3つともOKなら、「>>1は絶対のルールじゃない」とか「気に入らないなら無視しろ」とか
みみっちいこと書くのではなく、それこそ「気に入らない"スレ違い指摘"は無視」して、ちゃっちゃと答えちゃえば
スレ違い指摘の意味すら無くせるので一番効果的なはずなのに、それをしないのが何よりの証拠


と、暇なので長々と書いてみたが、「気に入らないなら無視すれ。」
言ってる本人が出来なかったら恥ずかしいからなw

785 名前:769 mailto:sage [2009/02/06(金) 13:13:03 ]
>>775 ご返答ありがとうざいます。

ブックオブジェクトを作るとのことだったので、
a.xlsに下記のように記述し実行してみたのですがエラーになってしまいました。
アドバイスを頂けないでしょうか。

Workbooks.Open Filename:="c:\b.xls"
Workbooks("b.xls").Activate
MsgBox Application.Workbooks("b.xls").ComboBox1.Value ←ここでエラーになります。

786 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:15:27 ]
>>784
落ち着けよ

787 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:17:16 ]
>>784
つまり、俺様はスレ違い認定する権利があってそれをするのだが、お前はそれに口出すな、ってことですね。

788 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:20:36 ]
>>786
とりあえず落ち着け

789 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:31:10 ]
>>785
コントロールの前にシートを指定していないせいだ

790 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:34:51 ]
>>784が★使ってスレ違い認定する奴だってことは分かった。

791 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:47:00 ]
>>787
別に口出ししてもいいよ
ただ、本当に>>1が気に入らないなら、スレ違い指摘してる奴に
ムキになって食い付くより、そんなの無視して答えちゃえばいいじゃんと
口出すなと言ってるのは>>776

>>790
もちろん俺も使ってるよ
というか、改めて言うまでもなく解るように書いたんだがw



792 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:50:41 ]
どっちがムキになってんだかw

793 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:55:11 ]
反論できないときは、相手を卑下して優位に立ったつもりになり
精神的安定を図るのが吉です

794 名前:769 mailto:sage [2009/02/06(金) 13:59:58 ]
>>789 ↓でできました!!ありがとうございます。!!!

MsgBox Application.Workbooks("b.xls").Sheets("Sheet1").ComboBox1.Value

795 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:13:36 ]
これも>>1に反発するなら、ブックだシートだとヒント出してる俺等を無視して、
丸投げ上等でスパっとコード書いちゃえばいいのに、何故それをしないんだろう?

結局は何かに反抗してみたい年頃なだけで、心底>>1を否定してるわけではないんだよな

796 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:26:17 ]
どうやって教えるかは決まってないし、人それぞれだから。
別にいきなり答えを書いちゃってもいいし、
それだと同じ人が何度も質問してきてウザく感じたりスレが荒れたりする可能性があるから、
できるだけ自分で考えるように誘導してやった方がいいと考える人もいる。
進行中の質問に別の回答者が割り込んで、いきなり答えだけを書いても何も問題はない。

797 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:54:01 ]
質問者だって、いきなり答えだけ書けよって思ってるかもしれないし
まじめにVBAの勉強をしてるかもしれない

798 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:38:01 ]
>>795
いや、俺は否定してるけど何か?

799 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:42:54 ]
質問です
隠しシートに読み込んだCSVファイルの中身を出力しようとしているんですが元のシートのほうに出力されてしまいます。
シート参照のが仕方マズイのでしょうかヒントをください

800 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:50:52 ]
・どうやって読み込んだのか書け
・「元シート」とは何だ?
・「シートの参照」とは具体的に?

801 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:51:26 ]
追加
・どこに出力しようとしてるのか書け



802 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:51:33 ]
↑のコードtoku.xdisc.net/cgi/up/ttt/nm9199.txt

803 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:54:38 ]
worksheets("隠しシート名").range(hogehoge


804 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:56:24 ]
>>803
やってみますありがとうございます

805 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 22:36:38 ]
みんな落ちつけ。
落ち着いてExcelにFlash張りつけろ。

806 名前:デフォルトの名無しさん [2009/02/07(土) 00:03:53 ]
>>805
Flashってなぁに??
聞いたことあるけど、、実際どおいうことができちゃうの?

807 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:05:04 ]
ググレカス

808 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:30:12 ]
>>807
カスは>>799
まんま>>777

ちょっとぐらいは過去レス嫁と小一時間(ry

809 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:53:38 ]
お前は過去スレに類似情報があると知ってるから読めと言ってるが、
大抵は類似情報なんかないのである。

810 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:21:59 ]
>>809
大抵のまともな人間はまず自力で何とかしようとするモンだ
それでも行き詰った場合に質問をするのがまともな人間の行動

だからお前みたいなヤツは、まともじゃない平均以下の存在価値の無い人間

811 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:26:40 ]
>>810
質問する奴がいなくなっちゃうね。
このスレもういらないや。



812 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:27:56 ]
おい、ここ2chだぞ。

813 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:29:47 ]
いや落ち着け
>>808
はツンデレだけどちゃんと教えてあげてる優しい人
そして
質問した>>799は学習して次は現スレくらいは読むだろう

814 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:34:41 ]
流れがさっぱりわからん

815 名前:807 mailto:sage [2009/02/07(土) 01:37:17 ]
>>808
は?
>>807>>806に言ったんだが、何か勘違いしてないか。

816 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:44:11 ]
過去レスなんか読まないのが今は普通なんだよ、オジサン

817 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:54:39 ]
>>816
おばはんですが何か?

818 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 10:19:16 ]
♪けんかはやめてー

819 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 12:27:12 ]
↑喧嘩、早めてぇ

820 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 21:36:24 ]
何これ

821 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 12:26:13 ]
コレクションのKey値を取得するにはどうすればいいんでしょうか?
具体的には、For Each In でコレクション内を回って、Key値がある値だった場合だけ、処理を実行させる
というコードを作りたいのですが



822 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 15:42:15 ]
>>821
Collectionでやりたいなら

' Module1
Dim col As New Collection
Dim itm As Class1

Set itm = New Class1: itm.Key = "A": itm.Text = "123": col.Add itm, itm.Key
Set itm = New Class1: itm.Key = "B": itm.Text = "456": col.Add itm, itm.Key
Set itm = New Class1: itm.Key = "C": itm.Text = "789": col.Add itm, itm.Key

For Each itm In col
  If itm.Key = "B" Then
    MsgBox itm.Text
  End If
Next itm
' EOF


' Class1
Public Text As String
Public Key As String
' EOF

823 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 20:42:26 ]
特定のBookを開いている時に
エンターキーを押すごとにマクロを起動させることってできませんか?

824 名前:823 mailto:sage [2009/02/08(日) 20:43:22 ]
書き忘れましたが、EXCELは2003です。

825 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 20:54:06 ]
>>822
おおクラスモジュールとかオブジェクト指向とかってやつですか・・・
やはりそういうのも覚えていかないと駄目ですね
ただ今回は隠しシートを使って済ませることにしました
回答ありがとうございました


826 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 23:38:45 ]
OSはXP
Excel2000
VB6.0です
ユーザフォームでツールボックスから「ピクチャボックスコントロール」と
いう物を貼り付けたいのですが、ツールボックスに入っておらず、
方法がわかりません。
コントロールを追加しようとしたのですがそれらしいのが見当たらず。

ググってもピクチャボックスが選択できる事が前提のようなので
探すことができませんでした。
どうすれば表示されるのか教えていただけませんか?

827 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 08:45:49 ]
>VB6.0です

きっと誤爆だな

828 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 09:02:10 ]
いやExcelのVBAから、VB6のインストール時に導入される
ピクチャボックスを使いたいってことなのでは?

しかしVB6使ってる人なら、こんなの簡単に解るはずなんだがな
因みにVB6持って無くて、ランタイムだけ入れてるとかは無しね
それじゃダメだから

829 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 12:12:54 ]
>>823
キーボードやマウスを使ったイベントはAPI使わないと無理

830 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 20:41:23 ]
実行しているsub名を取得する事は出来ますでしょうか。

sub aaa()
msgbox bbb '←aaaと表示したい
end sub

よろしくお願いします。

831 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 20:56:33 ]
>>830
>>1★3,4



832 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:30:35 ]
>>830
実行しているsub名を取得することはできないけど、次のようなことをするのは可能。
sub aaa()
msgbox "placeholder"
end sub
というコードを
sub aaa()
msgbox "aaa"
end sub
というコードに書き換えるようなこと。

ところで、何でそれ知りたいの?

833 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:39:59 ]
subの最初に適当な変数にsub名を入れとけばいいじゃん

834 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:46:13 ]
>>833
たしかに。
そういうの思い付く人と思い付かない人って
何が違うだろね


835 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:51:12 ]
そういう事か?
msgboxは質問時の方便で常時表示させたいんじゃないのか
今何の関数に飛んでますとか

836 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:57:13 ]
質問者のレス待てよ

837 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 01:30:14 ]
EXCEL2003です。

特定のフォルダの中に、テスト.xls、テスト1.xls、テスト1000.xls、という3つのEXCELがあるとして
killを使ってテスト.xls以外のブックをすべて削除する処理を作りたいと思っています。

kazu = "*"
Kill "\\フォルダ\テスト" & kazu & ".xls"
だとフォルダ内の3つはすべて消してしまうんですよね。
「テスト」の後に何もつかないブックだけを消さずに残すにはどうしたらいいでしょう?

838 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 02:03:56 ]
"テスト1*.xls"

839 名前:デフォルトの名無しさん [2009/02/10(火) 04:24:49 ]
かなりど素人なのですがEXCELでA列に文字を入力する際、A列の最終行数を
ランダムにしたいのですがどうすればいいでしょうか? 
      わかる方よろしくお願しますm(__)m

840 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 04:29:13 ]
>>839
こんな感じかな
A列のランダムな位置に文字を入れる

乱数 = Int(Rnd(1) * 65536) + 1
セル = "A" & 乱数
Range(セル) = "文字"

841 名前:デフォルトの名無しさん [2009/02/10(火) 04:31:48 ]
ありがとうございます●〜*



842 名前:デフォルトの名無しさん [2009/02/10(火) 04:40:29 ]
>>840
できました〜。 ホント感謝です(^−^)


843 名前:デフォルトの名無しさん [2009/02/10(火) 20:09:04 ]
質問です。
excel2000VBAでADOを使用して郵便番号データベースを参照したりいろいろしようと思い、とりあえず例のような条件(県は兵庫県、市と区は〜長田区・住所は読み仮名がイから始まるもの全て表示)で抽出したときの候補をずらずらと出したいと考えて組んでみましたが
For Each dbFld In dbRes.Fieldのあたりで「型が一致しません」というエラーが出てしまいます。

Sub CMD_New_Click()
Dim dbRes As ADODB.Recordset
Dim dbFld As ADODB.Fields
Dim dbCon As ADODB.Connection
Dim strSQL As String
Dim i As Integer
Set dbCon = New ADODB.Connection
dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "/KEN_ALL.mdb;"
strSQL = "SELECT KEN_KANJI,SHI_KANJI,CHO_KANJI,CHO_KANA FROM YUBIN WHERE KEN_KANJI='兵庫県' AND SHI_KANJI LIKE '%長田区' AND CHO_KANA LIKE 'イ%';"
Set dbRes = New ADODB.Recordset
dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly
If dbRes.EOF <> True Then
Set dbFld = dbRes.Fields
For Each dbFld In dbRes.Fields
Sheet1.Cells(1, i) = Trim(dbFld("KEN_KANJI").Value)
Sheet1.Cells(1, i) = Trim(dbFld("SHI_KANJI").Value)
Sheet1.Cells(1, i) = Trim(dbFld("CHO_KANA").Value)
  i = i + 1
  Next dbFld
Else
MsgField1.Caption = "見つかりません"
End If
End Sub

どのように直すとよいのでしょうか?よろしくお願いします

844 名前:843 [2009/02/10(火) 20:12:44 ]
補足です。
For Each を使わずに走らせると、正常に動作する(兵庫県神戸市長田区イカニケイサイガナイバアイ)
と表示されるため、SQL文やデータベースを開くことに失敗している可能性は低いです

845 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:18:39 ]
>>844
まずForの直前でDebug.Print TypeName(dbRes.Field)ってやって、
Fieldメソッドがコレクションを返してるかどうか確認汁。

846 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:21:47 ]
ごめん。今のなし。
よく見たらこの2行が矛盾してる。
Set dbFld = dbRes.Fields
For Each dbFld In dbRes.Fields
setの行を削除してみ。

847 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:40:56 ]
エラーの原因は、
×Dim dbFld As ADODB.Fields
○Dim dbFld As ADODB.Field
じゃね?
Set dbFld = dbRes.Fieldsは無しで。

しかし、
Do Until dbRes.EOF
...
dbRes.MoveNext
Loop
で回す部分が無いし、
出力先が全部Sheet1.Cells(1, i) ってのもおかしかろ?

848 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:06:52 ]
Option Base 1って邪道ですか?
先々で弊害とか出ます?

849 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:19:30 ]
>>848
昔はちょっとでもメモリを節約するために、用途に合わせて配列の範囲を削ってた。
VBAなら配列の範囲は自由に決められるからあんまり意味はないと思う。
盲腸みたいなもんだな。

850 名前:830 mailto:sage [2009/02/10(火) 22:23:28 ]
すみません。スレ違いと指摘を受け、昨日はレスできませんでした。レスありがとうございます。

皆さんが仰る通り、現在はsub名をコピペして、文字列として組み込んでおります。
なぜこの様な事をしているかと言いますと、
論理チェックのプログラム集合体を作成しています。(500個くらい)
現在、チェックのリストに振ってあるナンバーをsub名としております。

論理エラーがプログラムで検出された場合、sub名=チェックナンバー とエラーの内容を吐き出し、
チェックナンバーを主キーとして、リストからエラーメッセージを取得しています。

チェックナンバーをコピペして出力するのは問題無く出来ているのですが、
sub名を取得出来れば、コピペのミスが減ると思い、質問させていただきました。


851 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:44:46 ]
>>850
ExcelのVBAではモジュール名を取得する方法はない。
すでに書かれているように、スクリプトを使ってSubの直後にグローバル変数をセットするように
ソースを書き換えるのが、一番間違いが起こりにくいと思う。



852 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:47:18 ]
エラーナンバー体系と、チェック関数体系は分けたほうがいいと思うんだけど。
エラー内容とチェック関数が1:nやn:1の関係になったりしてない?
仮に1:1の関係だというのなら、チェック関数内に文字列を直接書いといた方がいいとも思う。
(関数名=エラーコードからエラー文字列が正しく対応しているかどうかのチェックが面倒なので)

それはともかく、コピペに勝る方法はまずないのだから、今回有効な手段としては、
後からチェックするコードを書くくらいかな。

853 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:49:51 ]
AccessのVBAなら自分自身の名前が取れるらしいので、Excelに依存しない作業ならAccessを使うという手もある。

854 名前:830 mailto:sage [2009/02/10(火) 23:15:07 ]
レスありがとうございます。
ExcelVBAで出来ないと言う事が分かったので、大きな収穫でした。
ダミーデータでエラーを出力した結果に対して目視チェックをする際、
1:1でエラーメッセージが取得出来ているかに重きを置く方向で調整したいと思います。

本当にありがとうございました。

855 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:16:14 ]
vba extensibility
support.microsoft.com/kb/410621/ja
使い方しらないけど、なんとなく近そうな道具

856 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:36:01 ]
>>855
それ、行番号さえ指定すればプロシージャ名は取得できるけど、
自分自身が何行目に書いてあるかってのは結局わからないのよ。

857 名前:843 [2009/02/10(火) 23:36:52 ]
>>845
>>846
>>847
動きました!いろいろアドバイス頂き、本当にありがとうございました

>>847
ああ・・・エラーの理由がわからないのでできるだけシンプルにしたかったのと
改行制限に引っかかったのでいろいろ削ってたのでこうなってしまいました。
すいませんでした

858 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:59:30 ]
>>855
マクロでコードを書き換えるとか、コードをマクロでチェックする系のレスは全部それ使うんだよ。

859 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:13:55 ]
ビミョーに方向違いの質問ですがすいません
まだおもちゃ程度にしかVBAいじれないんですが
On Error〜がらみは古いかもと思って避けてたんですよ

でもワークシート関数使うときにシート上で使うときはエラー処理が面倒なのに
VBA上だとOn Error〜で簡単にできるのに最近気付いてですね
こんな使い方はどこかに落とし穴があるんじゃあと気になるのと
ここで回答者されてる皆様のOn Error〜への視線ってどんなものかと思いまして

漠然とした質問すいません

860 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:30:21 ]
VBAで飯食わせてもらうくらいちゃんとしたもの使うならちゃんとエラー処理して、
エラー内容をユーザーにフィードバックする。
ちょっとしたマクロ程度ならOn Errorで十分。てか面倒。

861 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:40:07 ]
On Errorは滅多に使わん。
関数を呼ぶ前にちゃんと変数の値をチェックするとか、最初からエラーが出ないように作ってるから。



862 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:44:27 ]
>>860
えーと飯食わせてもらう作業のなかで利用しつつあるって感じなんですが
ちょっとしたマクロ程度でもあるし「使うな」って程でもないならちょっと安心です
ありがとうございます

863 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:48:34 ]
VBA自体を商品にするんじゃなくて、
業務効率化のためのマクロ使用なら
とにかく目的が達成できればいいんだから早く作れるほうがよい。

864 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:54:33 ]
>>861
あっやっぱりプロの方はそうですか・・・
ちょっと前まではVBAなしでワークシート上でやってたんですが
その時も確かにエラーが出ないように工夫はしてたんです
でも例えばFor〜Nextで回す時とか「結果がエラーになるときは飛ばす」って
ワークシート上でやってた時を思うとすごく斬新に思えてですね
もし初心者の私に気付いてない「ありがちな間違い」があればと思ってここにきました

865 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 01:00:25 ]
>>863
ですよねー
今のところ私のどんくささのせいでマクロ作るのも時間かかるし作らなくても時間かかるし(涙)

866 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 01:00:51 ]
事前にチェックするのと、事後にエラー処理するのと、どっちがいいかと言えばケースバイケースだけど、
VBAに限って言えばエラー処理が貧弱だから事前にチェックする方が結果的にコードがすっきり書けることが多い。

867 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:02:47 ]
on error resume next はたまに使います。 
いや、完全にデバッグしてから納品するのが当然なのは分かってる・・・。
分かってはいるんだが、ごく希に納品後にデバッグも止む無し、ってケースが・・・。
とりあえず動けば良い。とにかく早く、今日中に!! みたいな場合には。

868 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 10:56:14 ]
ネットワーク先が生きてるかどうかってエラーなしで判断できたっけ?

869 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 11:29:33 ]
「生きてる」の定義が問題だが、まぁスレ違いだわな

870 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:05:13 ]
>>868
ネットワークを介した共有フォルダorファイル?
ネットのURLの有効性?
TMネットワーク?

871 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:36:15 ]
画面描画しないとかカーソルを砂時計にするコマンドを使用している場合には
on errorは便利だよ。
カーソル砂時計になりっぱなしとか避けられるから。



872 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:31:26 ]
>>864
騙されるな。
本当にエラーが出ないほどチェックしてから関数を呼び出すなら、
チェックの部分が無防備なわけないだろ。

873 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:32:30 ]
>>867
インラインで処理するのと、何でもエラーを読み飛ばすのとは違うだろ。

874 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:41:12 ]
チェックするコードと処理するコードはアトミックじゃないから、普通はどんなチェックを行っても
原理的にはエラーが発生する可能性はある。
if dir("hogehoge") <> "" then
'ここでもうファイルが無い可能性がある
end if

875 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:03:16 ]
on errorで飛ばすんじゃなくて、簡単に予測出来るエラーの場合は条件分岐させて当然。
それでも出るのがエラーなのだよ。

876 名前:859 mailto:sage [2009/02/11(水) 20:39:36 ]
859ですレス頂いた皆さんありがとうございます
人様に売るものでもないんでマクロに産毛が生えたくらいのものしかつくってないんですが
ワークシート上で関数で処理するときはエラーになる時はそのセルを参照するときも意識してないといけないですよね
VBAでワークシート関数使ってから入力するならOn Errorですっ飛ばせば逆に綺麗に計算できるなと思ったんです
エラーになるかどうかの計算をさせる部分が省略できるから返って負荷軽減にはいいかもと勝手に思ってですね
あくまでワークシート関数使うときに限る話なんで皆さんのように複雑なプログラム組んでるときには
当て嵌まらないケースが多いんだと思います
それでもここまで読んでいて参考になりました

877 名前:デフォルトの名無しさん [2009/02/12(木) 00:25:55 ]

「firefoxで或るURLを開く」をvbaはどう書くの

878 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 01:13:31 ]
シェルに渡せ

879 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 13:33:52 ]
>>875
>>874

880 名前:デフォルトの名無しさん [2009/02/12(木) 17:23:16 ]
firefoxで「或るURL」を開くは、まさにその
URLのシェルへの渡し方がわからないので、聞いているんだが。


881 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:07:32 ]
>>880
firefoxの使い方とか、スレ違いだろ。

普通に。
コマンドラインからやるようにやればいいだろ。
"C:\Program Files\Mozilla Firefox\firefox.exe" www.yahoo.co.jp
とか。




882 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:31:56 ]
たぶん、こういうことだろ?
REM 「firefoxで或るURLを開く」

883 名前:880 mailto:sage [2009/02/12(木) 19:53:36 ]
>>881
もちろん、VBAの書き方の問題として、"""あたりのことが、気になっていたもので。
大変、参考になりました。所期の目的を達成することが出来ます。サンクス。
いままで、IEでやっていたのをfirefoxでやるにあたって、より難しいとの思い込みが
邪魔してましたw

884 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:33:35 ]
お前は一体何を言ってるんだ・・・

885 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:44:56 ]
すみませんアホな質問だと思いますがお願いします

標準モジュールで
Public Check As Boolean
Public Sub hoge()
Check = False
Load Form1: Form1.Show

として、
ユーザーフォームで
Private Button1_Click()
If TextBox1.Text = "" Then
TextBox1.SetFocus
Else
Check = True     ←※
Me.Hide
End If
End Sub

というコードなんですけど、
デバッグで※の所をちゃんと通っているのに、
標準モジュールに戻ってくると値がFalseになってるんですが
これは何故でしょうか?


886 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 21:12:24 ]
すみませんやっぱりアホでした
標準モジュールでDimで2重に宣言してました・・・
スレ汚しスミマセン

887 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 01:06:50 ]
>>884
自分で考えるより他人に聞いたほうが早いと、、、

888 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 18:21:30 ]
質問の文章を書いてると考えがまとまるんだよな。
脳が疑問点を俯瞰するというか。

889 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:33:48 ]
その場合
書き込みボタン押す前に
やめて欲しい

890 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 20:00:55 ]
ボタンを押した瞬間にひらめくんだよ、これが。
脳のどこかが切り替わるんだろうな。

例えば誰かに質問するために電話をかけて、
つながった瞬間解決するとか、誰でも経験あると思うんだけどなあ。

891 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 20:58:22 ]
とかいうつまんないやり取りは、くだらん質問よりうざい



892 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 21:05:19 ]
>>891
うぜー

893 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 21:25:13 ]
てな感じ

894 名前:デフォルトの名無しさん [2009/02/14(土) 06:55:41 ]
携帯からすみません。
一定時間経過したが、何も操作が無かったら、エクセル自体を閉じるコードを考えてます。
これって可能です?
ちなみに、エクセル2003です。
VBAは、ある程度使えます。

895 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 08:55:09 ]
>>894
Excelに標準で用意されてる関数だけでは無理
APIを使えば可能

896 名前:デフォルトの名無しさん [2009/02/14(土) 11:06:14 ]
APIですか〜
それは、手に余ってしまいます。
素直に、作業ブックを閉じるようにします。
ありがとうございました!

897 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:09:38 ]
本で勉強中なのですが

for nextの例で下記コードをためしにやってみたところ
変数が定義されていないとエラーがでます。
例と変わらずに打ち込んでいるのになぜエラーが出るのか教えてもらえないでしょうか?


Sub ループ()
For Cnt = 1 To 10

MsgBox ("こんにちは")

Next Cnt

End Sub


Cntがカウンタ変数って事でよさそうなんですが。

898 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:14:23 ]
そのまんまじゃんか。
Cntが宣言されてないんでしょ。

option explicit外すか、dim cntで宣言すれば良いんじゃない?

899 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:14:57 ]
ためしに
Dim Cnt As Integer
を追加してみたところうまく動作しました。

何度みなおしても本には>>897のコードだけで動くように書いてあるのですが。。
ちなみにEXCEL VBAのコツが面白いほどよくわかるって本です。

900 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:17:39 ]
>>898
ありがとうございます。
option explicitってオプションで「変数の宣言を強制する」って奴と関係してるものですかね?
ちょっと調べてみますが、この設定のせいだったんですね。
別の本だと「変数の宣言を〜」って設定を推奨してたので
チェックしてました。

901 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:19:30 ]
option explicit無しがデフォルト設定じゃなかったっけ?



902 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 19:17:07 ]
変数の宣言は強制しておけ。
ついでに、きちんと型の概念を持っておくと良いよ。

ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。
型を理解してない奴は、ほぼ100%お遊びマクロ。

903 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 19:21:32 ]
javascriptもお遊びですね

904 名前:名無しという名無し [2009/02/14(土) 19:21:39 ]
質問なんですけど
ExcelってXLSのことなんですか?
だとしたらここで質問したいんですけど
間違ってたらいってください

今、Excel viewer2003で
XLSのファイルを見ようとしてるんですけど
「コマンドラインオプションの構文エラーです
 Command /?を入力するとヘルプが表示できます」
とか出てきて訳わかんないんですけど詳しい人がいたら教えてください。
お願いします。
(一応、ググって見ましたが、僕の見る限りなかったと思います)

905 名前:名無しという名無し [2009/02/14(土) 19:24:16 ]
すみません上のやつ
書くとこミスりました
すいませんがスルーでお願いします
本当にすいませんでした

906 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:22:21 ]
すいません。質問なんですが、

Sub test()
Range("Q2").Select
Do Until ActiveCell.Offset(0, -1).Range("A1") = ""
ActiveCell.FormulaR1C1 = "=SUM(RC[-15]:RC[-1])"
ActiveCell.Offset(1, 0).Range("A1").Select
Loop
End Sub

このコードの、Do Until の条件式は、「アクティブセルの一つ左のセルが空白である」っていう意味であってるんでしょうか?
だとすると、「Offset(0,-1).」の後の「Range("A1")」にはどんな意味があるのでしょうか?
同様に5行目の「ActiveCell.Offset(1, 0).」の後の「Range("A1")」の意味がよく分かりません。
この「Range("A1")」が無いと正しく動作しないのでしょうか?

907 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:26:41 ]
何で自分で調べないの?

908 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:29:02 ]
調べたんですけど分からなかったです。スマンコ

909 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:55:56 ]
>>908
Offset()もRange()もRange型オブジェクトを返す。両者の違いは、
Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。
Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。
両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。

この場合に限って言えば、Range("A1")は単なる無駄。
わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?

910 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:23:26 ]
調べてない奴の台詞。> 調べたんですけど分からなかったです。

911 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:29:07 ]
>>909
なるほど!
調べたけど分からなかったことが分かりました!
ありがとうございます!



912 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:50:20 ]
┐(´ー`)┌

913 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:59:06 ]
グラフ範囲
=Sheet1!$O$3:$T$3,Sheet1!$O$5:$T$269
をマクロで実行するためにはどうすればいいですか?

myC = Range("L2")
ActiveChart.SetSourceData Source:=Sheets("Sheet1")
.Range("$O$3:$T$3", "$O$5:$T$ & myC")
, PlotBy:= _ xlColumns

で動きません。

よろしくお願いします。

914 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 23:12:30 ]
マルチすんな

915 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:10:16 ]
定数戦隊
vbRed
vbBlue
vbGreen
vbYellow
vbPink

敵か味方か、謎の戦士
vbBlack

916 名前:デフォルトの名無しさん [2009/02/15(日) 22:38:43 ]
エクセルで、全シートに同様の処理を反映させたいのですが

Worksheets.Select

For 行番号 = 2 To 10
.Cells(行番号, 列合計).Value = _
.Cells(行番号, 列数量).Value * Cells(行番号, 列単価).Value

Next 行番号

と書くと「.cellsが不正」と言われます。
どのあたりがおかしいのでしょうか。

917 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 23:04:53 ]
with で囲んでないのに、何でピリオドから始まってるの?


918 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:53:54 ]
質問させてください
以下の様な入力があった際に
A列は(A,1)だけ文字色を黒に、それ以下はすべて指定色に変更
B列は(B,1)が文字色黒、(B,2)(B,3)が指定色
(B,4)が文字色黒、(B,5)(B,6)(B,7)が指定色
になるようにしたいのですが、どのように実装すれば良いのでしょうか

A    B    C
ore  kimi  warota
ore  kimi  warota
ore  kimi  warota
ore  dare  warota
ore  dare  warota
ore  dare  warota
ore  dare  warota

919 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 14:20:01 ]
>>918
マクロの記録してから質問しろ

920 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 14:40:30 ]
なんか色々アレしてたら突破口が出来ました
スレ汚し失礼しました。

JavaとかCを軽くやっただけだったので
喜んで引き受けたんですが
スコープは分かりにくいし、なんか予約語?っぽいのがもうわかんなくて。。。
ま、すいませんでした、自力でなんとかしまウィッシュ

'2行目から終端までループしましょう
For i = 2 To LAST_ROW
'テーマが全項目と同じか調べる
'次の行のテーマを変数に入れときます
THEME_NEW = Worksheets("Sheet1").Range("A" & i).Value

'前の行と現在参照している行が異なる場合
If THEME_NEW <> THEME_OLD Then
Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 3
Else
Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 1
End If

THEME_OLD = THEME_NEW
Next







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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