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


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
それ、行番号さえ指定すればプロシージャ名は取得できるけど、
自分自身が何行目に書いてあるかってのは結局わからないのよ。






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

前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