Excel VBA質問スレ Part9at TECH
Excel VBA質問スレ Part9 - 暇つぶし2ch751:デフォルトの名無しさん
09/02/04 01:35:00
>>750
普通「クリック」と言えば左シングルクリックのことだろう。
右クリックやダブルクリックイベントでどうしろと。

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

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

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

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

754:デフォルトの名無しさん
09/02/04 16:22:39
ボタンの代わりか・・・

つラベル

755:デフォルトの名無しさん
09/02/04 20:43:07
なぜ“左”クソツクなのか。右でいいやん。

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

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

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

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

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

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

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


762:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/04 23:33:13
Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。


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


765:764
09/02/05 00:05:42
すいません。
vとaとなりましたが、どっちもvです。

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

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

768:764
09/02/05 00:23:21
>>767
そうなんですか。ありがとうございます。


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


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

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

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

771:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/05 15:33:20
>>769
可能です

773:769
09/02/05 18:35:27
>>772 ご返答ありがとうございます。
もし良かったら何か例文を載せて頂けないでしょうか。

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

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

よろしくお願いします。

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

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

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

777:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/06 10:37:42
ちょっとミスった。
>>777の3行目は
Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。
に訂正。
>>771も嘘書いちゃいかん。
ActiveSheetが処理されるとは限らないんだよ。


779:デフォルトの名無しさん
09/02/06 10:42:36
>>776
気に入らない発言はスルーしろよ。

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

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

782:デフォルトの名無しさん
09/02/06 10:48:13
>>780
まずマクロの記録をやってみろ

783:デフォルトの名無しさん
09/02/06 11:41:22
★使ってるのは多分一人。
気に入らないなら無視すれ。

784:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/02/06 13:15:27
>>784
落ち着けよ

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

788:デフォルトの名無しさん
09/02/06 13:20:36
>>786
とりあえず落ち着け

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

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

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

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

792:デフォルトの名無しさん
09/02/06 13:50:41
どっちがムキになってんだかw

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

794:769
09/02/06 13:59:58
>>789 ↓でできました!!ありがとうございます。!!!

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

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

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

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

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

798:デフォルトの名無しさん
09/02/06 20:38:01
>>795
いや、俺は否定してるけど何か?

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

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

801:デフォルトの名無しさん
09/02/06 20:51:26
追加
・どこに出力しようとしてるのか書け

802:Excel2003,XP home sp2
09/02/06 20:51:33
↑のコードURLリンク(toku.xdisc.net)

803:デフォルトの名無しさん
09/02/06 20:54:38
worksheets("隠しシート名").range(hogehoge


804:Excel2003,XP home sp2
09/02/06 20:56:24
>>803
やってみますありがとうございます

805:デフォルトの名無しさん
09/02/06 22:36:38
みんな落ちつけ。
落ち着いてExcelにFlash張りつけろ。

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

807:デフォルトの名無しさん
09/02/07 00:05:04
ググレカス

808:デフォルトの名無しさん
09/02/07 00:30:12
>>807
カスは>>799
まんま>>777

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

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

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

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

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

812:デフォルトの名無しさん
09/02/07 01:27:56
おい、ここ2chだぞ。

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

814:デフォルトの名無しさん
09/02/07 01:34:41
流れがさっぱりわからん

815:807
09/02/07 01:37:17
>>808
は?
>>807>>806に言ったんだが、何か勘違いしてないか。

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

817:デフォルトの名無しさん
09/02/07 01:54:39
>>816
おばはんですが何か?

818:デフォルトの名無しさん
09/02/07 10:19:16
♪けんかはやめてー

819:デフォルトの名無しさん
09/02/07 12:27:12
↑喧嘩、早めてぇ

820:デフォルトの名無しさん
09/02/07 21:36:24
何これ

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

822:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/08 20:42:26
特定のBookを開いている時に
エンターキーを押すごとにマクロを起動させることってできませんか?

824:823
09/02/08 20:43:22
書き忘れましたが、EXCELは2003です。

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


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

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

827:デフォルトの名無しさん
09/02/09 08:45:49
>VB6.0です

きっと誤爆だな

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

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

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

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

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

よろしくお願いします。

831:デフォルトの名無しさん
09/02/09 20:56:33
>>830
>>1★3,4

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

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

833:デフォルトの名無しさん
09/02/10 00:39:59
subの最初に適当な変数にsub名を入れとけばいいじゃん

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


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

836:デフォルトの名無しさん
09/02/10 00:57:13
質問者のレス待てよ

837:デフォルトの名無しさん
09/02/10 01:30:14
EXCEL2003です。

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

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

838:デフォルトの名無しさん
09/02/10 02:03:56
"テスト1*.xls"

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

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

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

841:デフォルトの名無しさん
09/02/10 04:31:48
ありがとうございます●~*

842:デフォルトの名無しさん
09/02/10 04:40:29
>>840
できました~。 ホント感謝です(^-^)


843:デフォルトの名無しさん
09/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
09/02/10 20:12:44
補足です。
For Each を使わずに走らせると、正常に動作する(兵庫県神戸市長田区イカニケイサイガナイバアイ)
と表示されるため、SQL文やデータベースを開くことに失敗している可能性は低いです

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

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

847:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/10 22:06:52
Option Base 1って邪道ですか?
先々で弊害とか出ます?

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

850:830
09/02/10 22:23:28
すみません。スレ違いと指摘を受け、昨日はレスできませんでした。レスありがとうございます。

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

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

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


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

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

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

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

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

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

855:デフォルトの名無しさん
09/02/10 23:16:14
vba extensibility
URLリンク(support.microsoft.com)
使い方しらないけど、なんとなく近そうな道具

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

869:デフォルトの名無しさん
09/02/11 11:29:33
「生きてる」の定義が問題だが、まぁスレ違いだわな

870:デフォルトの名無しさん
09/02/11 13:05:13
>>868
ネットワークを介した共有フォルダorファイル?
ネットのURLの有効性?
TMネットワーク?

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

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

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

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

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

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

877:デフォルトの名無しさん
09/02/12 00:25:55

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

878:デフォルトの名無しさん
09/02/12 01:13:31
シェルに渡せ

879:デフォルトの名無しさん
09/02/12 13:33:52
>>875
>>874

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


881:デフォルトの名無しさん
09/02/12 18:07:32
>>880
firefoxの使い方とか、スレ違いだろ。

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


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

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

884:デフォルトの名無しさん
09/02/12 20:33:35
お前は一体何を言ってるんだ・・・

885:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/12 21:12:24
すみませんやっぱりアホでした
標準モジュールでDimで2重に宣言してました・・・
スレ汚しスミマセン

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

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

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

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

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

891:デフォルトの名無しさん
09/02/13 20:58:22
とかいうつまんないやり取りは、くだらん質問よりうざい

892:デフォルトの名無しさん
09/02/13 21:05:19
>>891
うぜー

893:デフォルトの名無しさん
09/02/13 21:25:13
てな感じ

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

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

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

897:デフォルトの名無しさん
09/02/14 18:09:38
本で勉強中なのですが

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


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

MsgBox ("こんにちは")

Next Cnt

End Sub


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

898:デフォルトの名無しさん
09/02/14 18:14:23
そのまんまじゃんか。
Cntが宣言されてないんでしょ。

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

899:デフォルトの名無しさん
09/02/14 18:14:57
ためしに
Dim Cnt As Integer
を追加してみたところうまく動作しました。

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

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

901:デフォルトの名無しさん
09/02/14 18:19:30
option explicit無しがデフォルト設定じゃなかったっけ?

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

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

903:デフォルトの名無しさん
09/02/14 19:21:32
javascriptもお遊びですね

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

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

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

906:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/14 21:26:41
何で自分で調べないの?

908:デフォルトの名無しさん
09/02/14 21:29:02
調べたんですけど分からなかったです。スマンコ

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

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

910:デフォルトの名無しさん
09/02/14 22:23:26
調べてない奴の台詞。> 調べたんですけど分からなかったです。

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

912:デフォルトの名無しさん
09/02/14 22:50:20
┐(´ー`)┌

913:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/14 23:12:30
マルチすんな

915:デフォルトの名無しさん
09/02/15 01:10:16
定数戦隊
vbRed
vbBlue
vbGreen
vbYellow
vbPink

敵か味方か、謎の戦士
vbBlack

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

Worksheets.Select

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

Next 行番号

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

917:デフォルトの名無しさん
09/02/15 23:04:53
with で囲んでないのに、何でピリオドから始まってるの?


918:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/16 14:20:01
>>918
マクロの記録してから質問しろ

920:デフォルトの名無しさん
09/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



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