Excel VBA質問スレ Part9

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
ExcelのVBAに関する質問スレです

前スレ http://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)
2デフォルトの名無しさん:2008/12/04(木) 15:43:49
3デフォルトの名無しさん:2008/12/04(木) 18:29:10
>>1

前スレ1000立てもせずに埋めやがって
氏ねばいいのに
4デフォルトの名無しさん:2008/12/04(木) 20:11:57
EXCEL VBAで実現可能で
おまいらが一番すごいと思うものって何?
参考までに教えてほしい
5デフォルトの名無しさん:2008/12/04(木) 21:03:29
Shift =シフト
alt =アルト
Delete =デリート
VBA =ブバ
6デフォルトの名無しさん:2008/12/04(木) 21:19:26
アルトw
7デフォルトの名無しさん:2008/12/04(木) 21:35:09
無理やりカタカナ表記するなら、オゥトが近いけどな。
8デフォルトの名無しさん:2008/12/04(木) 21:51:50
近くないし、半可通のスレ違い得意語りはどうでもいいから
9デフォルトの名無しさん:2008/12/04(木) 23:25:22
オルトとか言うオチじゃないよね?
10デフォルトの名無しさん:2008/12/05(金) 10:30:09
スレ違いでごめん・・・。
excel VBAからSAS参照できるんだけど、どこまで使えるのかがリファレンス見てもさっぱり・・・。
他言語とのマッシュアップでお勧めの本ってありますか?
もしくは他スレへ誘導してくれるとありがたいです。
11デフォルトの名無しさん:2008/12/05(金) 10:45:00
WebBrowserの使い方 教えてください
12デフォルトの名無しさん:2008/12/05(金) 11:45:16
>>10
そのSASとやらのスレに行けよ
13デフォルトの名無しさん:2008/12/05(金) 23:14:09
>>11
IEのアイコンをダボークリッ
14デフォルトの名無しさん:2008/12/06(土) 01:23:02
SendKeys "あア"
が「ああ」になるけど、半角カタカナは送れんの?
15デフォルトの名無しさん:2008/12/06(土) 02:05:44
試してみた。ちゃんとVBEのカーソル位置に「あア」と入力された。
Sub a()
  SendKeys "あア"
End Sub
16デフォルトの名無しさん:2008/12/06(土) 15:15:51
excel2007でダメだった
あ「あ」←未確定状態
17デフォルトの名無しさん:2008/12/06(土) 16:18:23
2003でも2007でも問題ないぞ。
うちがATOKだからか?
18デフォルトの名無しさん:2008/12/08(月) 11:59:35
Excel2002 + Microsoft IME Standard 2002 ver.8.1、VBE上で>>15を実行

IME     結果
OFF    :あア
ひらがな :あ「あ」
全角カナ :あ「ア」
全角英数:あ
半角カナ :あ「ア」
半角英数:あ
※「」内は未確定状態
19デフォルトの名無しさん:2008/12/08(月) 15:28:30
XP SP3 + Excel 2007 + Microsoft Office IME 2007

VBE上では あ だけ
IME OFF→ひらがな に変化

メモ帳に
あ「あ」

IME English
?? に

IMEに依存する模様
20デフォルトの名無しさん:2008/12/08(月) 22:25:49
VBA初心者になんかお題をください。
21デフォルトの名無しさん:2008/12/08(月) 23:06:58
>>20
VBAで数独。人に解かせる(GUI)のでもプログラムに解かせるのでもよし。
問題生成もできたらなおよし。
22デフォルトの名無しさん:2008/12/08(月) 23:14:13
100マス計算生成マクロ。
経過秒数、正答率表示機能付き。
23デフォルトの名無しさん:2008/12/09(火) 00:59:28
アドイン化が猿でもわかるサイトor本ってある?
24デフォルトの名無しさん:2008/12/09(火) 11:00:26
VBAを起動し「コードの表示」をクリック(フォームをWクリック)すると「メモリが不足しています。」と表示され、
コードの書き込みが一切できません。
新規で開いたエクセルファイルで、まっさらな状態でも
「メモリが不足しています。」と表示されます。
対処法はありますでしょうか?

Mac OS 9.2.2 Microsoft Office 2001 バージョン9.0(2615)です。あと何か必要な情報はありますか?
25デフォルトの名無しさん:2008/12/09(火) 11:58:26
2624:2008/12/09(火) 12:07:46
>>25
べらぼうに割り当てを増やしてもだめなんだよ。
27デフォルトの名無しさん:2008/12/09(火) 12:55:43
>>26
オマエのいってる「べらぼう」がなんだか知らないけど、
メモリがたりないんだろ?
2824:2008/12/09(火) 14:43:36
>>27
そういう基本的なことじゃないらしいというところまではわかっているんですけどね。
オマエ呼ばわりするオタクがいるところにきたオレがバカだった。
29デフォルトの名無しさん:2008/12/09(火) 14:51:50
>>28
わかってねーじゃん
30デフォルトの名無しさん:2008/12/09(火) 14:53:43
要するにVBEが使い物にならないんだな
再インスコくらいは試してるよな?
2chで質問する前にこんな基本的なこともしてないならマジでバカだな
31デフォルトの名無しさん:2008/12/09(火) 22:21:16
>>24
こちらへどうぞ
http://pc11.2ch.net/pcqa/
32デフォルトの名無しさん:2008/12/09(火) 22:48:23
FOMの本で勉強中なんですが
配列について教えてください。

Sub 配列変数()
Dim Nanakusa(6) As String
dim As Integer
Nanakusa(0) = "せり"
Nanakusa(1) = "なずな"
Nanakusa(2) = "ごぎょう"
Nanakusa(3) = "はこべ"
Nanakusa(4) = "ほとけのざ"
Nanakusa(5) = "すずな"
Nanakusa(6) = "すずしろ"
For i = 0 To 6
Cells(8 + i, 3).Value = Nanakusa(i)
Next i
End Sub

このサンプルコードなんですが、下から3行目の
Cells(8 + i, 3).Value = Nanakusa(i) この部分は
セルC8から下方向にインデックスiの配列変数Nanakusaの値を入力。 と書いてあるのですが

(8 + i, 3) ←ここがよくわかりません。

CellsだとR1C1?形式みたいので列も行も数字で指定するってのはわかったのですが
どこで"下方向"ってのを指定してるのか
また、( 8,3 + i) ←列と行を指定してから変数iを入れる感じの、これのほうがしっくり来る気がするのですが
どういうことなんでしょうか?
33デフォルトの名無しさん:2008/12/09(火) 23:11:07
(row,col)ってことです。
34デフォルトの名無しさん:2008/12/10(水) 01:47:18
便乗質問。>>32のサンプルでわからない部分があるのですが
dim As Integer
これはどういう意味ですか?
35デフォルトの名無しさん:2008/12/10(水) 01:48:57
電卓のテンキーと電話のテンキーみたいなもの
36デフォルトの名無しさん:2008/12/10(水) 07:01:07
変数の宣言が判らないレベル?
37デフォルトの名無しさん:2008/12/10(水) 08:18:23
すみません。

A1セルに「業務1」という値がある場合、A2セルに「担当1」、
A1セルに「業務2」という値がある場合、A2セルに「担当2」
B1セルに「業務1」という値がある場合、B2セルに「担当1」...
というようなものを、現在If関数でやっています。
追加追加で来ていたので、ネストがかなり深いです。
だんだん条件が増えてきたので、何とかマクロで作成できないものかと考えています。

メンテを楽にする条件で、変数と代入で可能でしょうか。
VBAが初めてなので、ちょこちょこ調べながらなのですが、
方向性がつかめなくて・・・
38デフォルトの名無しさん:2008/12/10(水) 10:44:31
テンプレ読めないやつ多いな・・・

>>37
1行目に業務を入れて2行目にその担当を出したい
今はIFでやってるから業務が増えてくると大変なのでどうにかしたい
ってところか?
LOOKUPとかじゃだめなのか?
39デフォルトの名無しさん:2008/12/10(水) 11:48:48
デフォルトの型をバリアントから変更する方法でもあるのかと思ったけど試したらエラーになったから
Dim i As Integerの書き間違い?

コピペすれば間違いようがないと思うんだけど、もしかしてパソコン使わずに本だけで勉強してんのかな。
40デフォルトの名無しさん:2008/12/10(水) 17:03:11
>>37
VBAやったことない人なら、lookup なり作業列なり使って、
考え方から整理し直した方がどう考えてもラク
今の考え方のままだと、VBAでも if でネストしまくったわかりにくいコードになりそう
改行とインデントがある分読みやすいだけみたいな
41デフォルトの名無しさん:2008/12/10(水) 18:46:07
すみません・・・
VLOOKUPであっさり出来ました・・・orz

VBAもちょこちょこ勉強していきます。
スレ汚しすみませんでした
42デフォルトの名無しさん:2008/12/10(水) 19:40:57
WindowsXP&Excel2003で質問です。
印刷された時に、セルに入力されているデータが長すぎて、
全文表示されなかったりしますが、
そういう状態かどうか調べるにはどうしたらいいでしょうか?
43デフォルトの名無しさん:2008/12/10(水) 19:48:51
>>42
文字数や文字バイト数(unicodeだと全部2バイトだから変換しる。)で情報量を調べておいて、、
予め余裕持って設計しましょう。
80バイト毎にheightをX倍してやるとかね。

印刷すると崩れるのは仕方の無い事。
崩したくないならば、excelじゃなくて優秀なドローツールを使うか、ラスタライズしてから印刷するとか。
44デフォルトの名無しさん:2008/12/10(水) 20:48:45
左から6文字が空白ならという条件式は次のでいいですか?
xp 2003 空白文字も含めて全て全角にしています。

if left$(moziretu,6)=space(6) then
4544:2008/12/10(水) 20:50:50
効いていないので効きました。
よろしく
46デフォルトの名無しさん:2008/12/10(水) 21:09:53
if left$(moziretu,6)="      " then
47デフォルトの名無しさん:2008/12/10(水) 21:58:41
>>44
mid関数
48デフォルトの名無しさん:2008/12/10(水) 23:47:47
>>47
左から6文字「目」じゃない
49デフォルトの名無しさん:2008/12/11(木) 10:42:48
>>
それは半角の空白6文字かどうかの判定式。
全角6文字の空白かどうかなら
If Left$(moziretu,6)=String$(6," ") then
混在だとちょっと面倒かな?
50デフォルトの名無しさん:2008/12/11(木) 11:48:18
>>49
全角半角考慮してこんなのはどうかな?
LTrim$(Left$(moziretu, 6)) = ""
51デフォルトの名無しさん:2008/12/11(木) 13:07:48
>>50
なるほどね。
それが一番いいだろうな。
52デフォルトの名無しさん:2008/12/11(木) 16:54:36
StrComp(Left$(moziretu,6),Space(6),vbTextCompare)
53デフォルトの名無しさん:2008/12/11(木) 17:24:22
空白文字も含めて全て全角にしています、って書いてあるし、
数も6個で固定なら>>46で充分でしょ
わざわざ余分な関数使う意味がわからない
5450:2008/12/11(木) 18:16:07
>>53
>>45を読めばその一言が信用できないことくらい分かるだろ?

49だけ読んでレスした漏れが言えた事じゃないがw
55デフォルトの名無しさん:2008/12/11(木) 20:34:08
>>43
ありがとうございました。
バイト数を数える事で対応してみます。
56デフォルトの名無しさん:2008/12/13(土) 03:22:22
VBAフォームに、VBのFlexGridのようなマス目の入ったものを
表示させてEXCELのシートとやりとりしたいのだが、
そういったコントロールってないの?
今使ってるのがEXCEL2000なんだが。。。
57デフォルトの名無しさん:2008/12/13(土) 03:48:02
アホ発見
58デフォルトの名無しさん:2008/12/13(土) 14:45:20
会社でやってる作業を自動化したくてVBAに興味を持ったんですが、よい参考資料が見つかりません。

VBAのリファレンス本でお勧めを教えて頂ければ助かります。

環境はWin2kでExcel 2003です。Cとか弄ったことがあるのでまるっきり初心者ではないです。
59デフォルトの名無しさん:2008/12/13(土) 14:56:02
丸っきりの初心者ではないと言い張るのなら、参考資料など見つからなくても何とかするもんだ。
60デフォルトの名無しさん:2008/12/13(土) 16:22:48
>>56
owc

>>58
msdnのヘルプ
61デフォルトの名無しさん:2008/12/13(土) 18:39:41
本といわれてヘルプを紹介するアホはどうにかならんかね。
62デフォルトの名無しさん:2008/12/13(土) 18:43:12
どうにもならんよ
63デフォルトの名無しさん:2008/12/13(土) 19:36:14
大きな本屋に行って参考書探すくらいの努力したら?
64デフォルトの名無しさん:2008/12/13(土) 20:57:44
経験者なら本なんていらんだろ。
VBAくらい中学生でも使え紆余w
65デフォルトの名無しさん:2008/12/13(土) 22:32:27
折れは、このスレだったか昨年知った次の本を薦める。
「技術評論社 Excel VBA ポケットレファレンス」
成りは小さいが、他のどの本よりも役に立った。
今年、確か、2007対応の改訂版が出たと思うが2003等も使えるように整理してあるはず。
66デフォルトの名無しさん:2008/12/13(土) 22:55:26
ヘルプを見るのは常識として
本なら俺も↑のポケットリファレンスだな。
あとはできる大事典VBAもいい
勉強中なら本のほうがやりやすい所あるし。

6758:2008/12/14(日) 15:30:22
コメントくださった方、ありがとうございました。

>65,66で紹介して頂いたポケットリファレンスを購入してきました。
ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
68デフォルトの名無しさん:2008/12/14(日) 16:42:59
>ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
だったらそれを先に書いておけよ。
69デフォルトの名無しさん:2008/12/14(日) 17:19:15
それくらい読み取れよアホ
70デフォルトの名無しさん:2008/12/15(月) 02:04:11
まあ解決したみたいだからいいじゃないか。
71デフォルトの名無しさん:2008/12/15(月) 16:37:15
2007は関数の追加や仕様の変更が色々あったおかげで説明が増えて少し読みにくくなったので、
もし2003で使うならブックオフあたりで古いやつを探すといいかも。
72デフォルトの名無しさん:2008/12/15(月) 23:15:34
スレチでしょうか…?初心者です。質問させて下さい
WindowsXP、Excel2000です

マクロでゲーム作りに挑戦し、遊べる段階にまで出来上がったのですが…
なぜだか遊んでいると、高確率で突然「画面更新」が止まってしまいます。
処理は続いているので、音も鳴りますし、Escボタンでコードの実行を中断すると、画面更新が再開され内容が反映されます。
その時「継続」を選ぶとゲームを続けられるのですが、しばらくするとまた止まってしまいます。
ループ中にScreenupdating = Trueを入れてみましたが、効果はありませんでした。

何が原因なのでしょうか?思い当たる節があれば教えて下さい。
因みに落ちゲーで、セルドット方式です。Sleep関数を多用しています。

長文失礼しました…
73デフォルトの名無しさん:2008/12/16(火) 00:01:40
仕様です。
おとなしくFlashの勉強するのが吉。
7472:2008/12/16(火) 04:33:53
>>73
レスありがとうございます。
仕様ですか…Excelの描写速度が遅いことは知っています。
しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。

コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。
自信はありませんが、Sleepが問題な気がします。どうでしょうか。
75デフォルトの名無しさん:2008/12/16(火) 04:41:10
「否」でなく「非」でした
76デフォルトの名無しさん:2008/12/16(火) 06:08:43
だったらコードを晒したら?
それができないなら自分で勝手に調べて答えを出せばいいよ。
77デフォルトの名無しさん:2008/12/16(火) 10:00:26
データ型について質問です。
エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが
時間の時も日付型(DATE)の方が良いのでしょうか?
それともSingleやDoubleでしょうか?

VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・
78デフォルトの名無しさん:2008/12/16(火) 12:24:26
>>76
やっぱり、コード見ないとどうしようもないですよね…
お騒がせしました
79デフォルトの名無しさん:2008/12/16(火) 13:09:50
そりゃぁ、Sleepが問題だなんて認識している香具師とまともに会話が成立するとは思えないもんねぇ。
80デフォルトの名無しさん:2008/12/16(火) 13:10:45
>>77
勉強を兼ねているんだろ。全部やれ。
81デフォルトの名無しさん:2008/12/16(火) 13:15:49
>>80
試してみてどちらでもできるということは確認済みなんです
でも一般的に、どちらがベターなのかなと思いまして
82デフォルトの名無しさん:2008/12/16(火) 13:27:29
一般的には、シート関数だな。
83デフォルトの名無しさん:2008/12/16(火) 15:03:10
>>79
Sleep関数は問題無いんですね?ありがとうございます!安心しました
Sleepが使えないとなると凄く面倒になるので…

以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、
その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。
自己解決出来るよう、もう少し頑張ってみます
84デフォルトの名無しさん:2008/12/16(火) 15:42:22
エクセルでVBAを使ってじゃんけんゲームを作れと言われたのですがわかりません
教えてください
85デフォルトの名無しさん:2008/12/16(火) 15:50:10
宿題丸投げはご遠慮ください。
VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。
86デフォルトの名無しさん:2008/12/16(火) 21:46:59
VBスレでも宿題はお断りだw
87デフォルトの名無しさん:2008/12/16(火) 23:12:04
V=チョキ
B=グー
A=パー

としてじゃんけんを楽しんでください。
88デフォルトの名無しさん:2008/12/17(水) 07:58:32
意地悪なやつらだな。
逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。
おまえらのご自慢のテクニックを披露できるチャンスだぞ。
89デフォルトの名無しさん:2008/12/17(水) 09:42:52
と学生が申しております
仕事で使うわアホ
90デフォルトの名無しさん:2008/12/17(水) 11:06:52
>>89
VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw
91デフォルトの名無しさん:2008/12/17(水) 12:55:10
>>89>>90
どんなことに使ってるの?
92デフォルトの名無しさん:2008/12/17(水) 13:49:36
ルーチンワークは大体そう
他は資料をデータベースっぽく正規化するために使うことも

・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね
93デフォルトの名無しさん:2008/12/17(水) 13:51:22
SAPのBWなんかはExcelマクロ
94デフォルトの名無しさん:2008/12/17(水) 13:57:12
オフコンからデータ(CSVとか)受け取って
帳票(見積書とか)の形に整えて印刷とか
95デフォルトの名無しさん:2008/12/17(水) 18:51:26
WindowsXP、Excel2002ユーザの質問です。

現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの
実行ファイルのフルパスを取得しようとしています。Firefox3が

・標準のフォルダ以外にインストールしている可能性がある
・HTML、HTTP等に関連付けられている
・デフォルトブラウザに指定されている

という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか?
検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、
他の方法は無いでしょうか?

参考になる情報をご存知の方、教えてください。
96デフォルトの名無しさん:2008/12/17(水) 19:27:43
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]
97デフォルトの名無しさん:2008/12/18(木) 01:52:45
問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで
VBAで整形&正規化してる。なんか>>94とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。

中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。
98デフォルトの名無しさん:2008/12/18(木) 10:56:24
何年前に作ったシステムだよ?
99デフォルトの名無しさん:2008/12/18(木) 11:40:21
wikiによるとPC-9821が入ったのは早くても15年位前らしいな

パソコンで動くエミュレーターがあるにもかかわらず
いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね?

まぁスレ違いだしこの辺で流れ斬ろうか・・・
100デフォルトの名無しさん:2008/12/18(木) 13:42:45
ダム端って言うんだよ
101sage:2008/12/18(木) 15:09:13
いまユーザーフォームを利用してモグラたたきを作っているのですが
じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが
うまく作用せず、モグラの動きのプログラムが終了すると
再びカウントダウンするようになってしまいます。両方とも独立して動くように
したいのですがよい方法はありませんか。
102sage:2008/12/18(木) 15:11:29
ソースです

スタートボタンを押すと時間のカウントダウンを開始
Private Sub CommandButton1_Click()
starttime1 = 2
starttime2 = 0
startflag = 1 'ゲーム開始用フラグ

Do While starttime1 >= 0

keika = Timer + 1
Do While keika > Timer
Loop
starttime2 = starttime2 - 1
If starttime2 < 0 Then
starttime2 = 59
starttime1 = starttime1 - 1
End If
If starttime1 < 0 Then
MsgBox "TIME UP!" '時間が過ぎたら
Exit Do
End If
Label4 = starttime1 & ":" & starttime2 'ラベルに時間のカウントダウンを表示
DoEvents
Loop
End Sub
103sage:2008/12/18(木) 15:18:27
ソースの続き

Private Sub back1_Click() back1はイメージオブジェクトです
If startflag = 1 Then
Call moguratataki
End If
End Sub
コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと
思っていますがそれもまだ分からないので調べ中です。
call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
104sage:2008/12/18(木) 15:22:58
ソースの続き2

Sub moguratataki()

Randomize
kyarass = 15
stsuu = Int((3 * Rnd) + 1)
hozon(0) = stsuu
hozon(1) = stsuu
a = 0
Do While stsuu > 0
stkyara = Int((kyarass * Rnd) + 1) - 1
If krflag(stkyara) <> 1 Then
trkyara(a) = stkyara
krflag(stkyara) = 1
stsuu = stsuu - 1
a = a + 1

End If
Loop


105sage:2008/12/18(木) 15:25:33
ソースの続き3
b = 0
Do While hozon(0) > 0
stbasyo = Int((25 * Rnd) + 1)
If anaflag(stbasyo - 1) <> 1 Then
If stbasyo < 16 Then
anaflag(stbasyo - 1) = 1
yokoti = (stbasyo Mod 5) - 1
If stbasyo = 5 Or stbasyo = 10 Or stbasyo = 15 Then
yokoti = 4
End If
If stbasyo = 15 Then
stbasyo = 14
End If
tateti = Int(stbasyo / 5)
anax(b) = xti1(yokoti)
anay(b) = yti1(tateti)
b = b + 1
hozon(0) = hozon(0) - 1
106sage:2008/12/18(木) 15:26:25
ソースの続き4
Else
anaflag(stbasyo - 1) = 1
yokoti = (stbasyo Mod 5) - 1
If stbasyo = 20 Or stbasyo = 25 Then
yokoti = 4
End If
If stbasyo = 25 Then
stbasyo = 24
End If
tateti = Int((stbasyo - 15) / 5)
anax(b) = xti2(yokoti)
anay(b) = yti2(tateti)
b = b + 1
hozon(0) = hozon(0) - 1
End If
End If
Loop
107sage:2008/12/18(木) 15:27:54
ソースの続き5
For i = 0 To hozon(1) Step 1
mogura(trkyara(i)).Move anax(i), anay(i)
mogura(trkyara(i)).Visible = True
Next i
For i = 30 To 0 Step -3
For j = 0 To hozon(1) Step 1
mogura(trkyara(j)).Move anax(j), anay(j) + i
Next j
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
Next i
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
For i = 0 To 30 Step 3
For j = 0 To hozon(1) Step 1
mogura(trkyara(j)).Move anax(j), anay(j) + i
Next j
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
Next i

For i = 0 To hozon(1) Step 1
mogura(trkyara(i)).Visible = False
Next i
end sub
108sage:2008/12/18(木) 15:30:53
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば
教えてください。
109デフォルトの名無しさん:2008/12/18(木) 15:31:07
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。
っつってもわかんねーかな。
110デフォルトの名無しさん:2008/12/18(木) 15:46:55
<<109 さん
おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!
111デフォルトの名無しさん:2008/12/18(木) 20:25:38
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。

それをif判定で、試してみたところうまく結果がでませんでした。
プルダウンの選択式だと、"○"として扱われないのでしょうか?
112デフォルトの名無しさん:2008/12/18(木) 20:46:33
>>111
何のプロパティをチェックしてるの?
113デフォルトの名無しさん:2008/12/18(木) 20:48:17
>>112
cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・
114デフォルトの名無しさん:2008/12/18(木) 21:40:37
>>113
実際のif文は?
115デフォルトの名無しさん:2008/12/18(木) 21:41:19
>>113
そもそも、プルダウンじゃなくすれば判定できるの?
116デフォルトの名無しさん:2008/12/18(木) 21:48:14
>>114
do until なんとか =""
with ほにゃらら
if .cells(x, y).value = "○" then
処理
end if
loop

.valueにはいってる値を確認したところ、×とかちゃんとはいってました

セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな

117デフォルトの名無しさん:2008/12/18(木) 22:26:25
sheet1の2-24行、D列に○×のプルダウンがはいっています。
これでやるとエラーがでますifの行に

x = 1
i = 2
y = 4
Do Until Cells(i, y).Value = ""

If Cells(i, y).Value = "○" Then
Sheets(2).colums(x).Delete

x = x + 1
i = i + 1

End If
Loop
118デフォルトの名無しさん:2008/12/18(木) 22:36:44
i=i+1はEndIfとLoopの間だと思う。

sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。

どちらもエラーの原因じゃないけど。
というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。
すまんな。
119デフォルトの名無しさん:2008/12/18(木) 22:46:18
あとcolums→columns、だね

それでもif文の行にはエラーは出ない。
力になれなくてすまんな。
120デフォルトの名無しさん:2008/12/18(木) 22:48:29
そうでした^^;
たしかにインクリメントしないといけませんね

Dim i As Integer
Dim y As Integer
Dim x As Integer

x = 1
i = 2
y = 4


Do Until Cells(i, y).Value = ""

If Cells(i, y).Value = "○" Then
Sheets(2).colums(x).Delete
x = x - 1

End If
i = i + 1
x = x + 1

Loop

End Sub


これでやったらif文にオブジェクトはプロパティかメソッドをサポートしてない
ってでてまたエラーになってしまいました
121デフォルトの名無しさん:2008/12/18(木) 22:53:48
ありがとうございます!
columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
122デフォルトの名無しさん:2008/12/18(木) 23:16:55
失礼します


シート1から実行するとしてセルB2には名前という文字が入っております
const mojicell as string "B2"

のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか?
やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして

実際どのように試し方といいますと

Sheets(mojicell).cells(...... のように使いました。
SHeets("名前").cells(...  に置き換えられるかとおもっていたのですが、
実際はSheets("B2")と 入っておりました。

const で指定したセルが参照する値を格納することはできないのでしょうか?
123デフォルトの名無しさん:2008/12/18(木) 23:19:36
セル参照だけならrangeオブジェクト使いなさい。
シートまで含むならまずconstの値を工夫しなさい。
124デフォルトの名無しさん:2008/12/18(木) 23:21:20
>>122
const mojicell as string = "B2"
worksheets(range(mojicell).value).cells(...
125デフォルトの名無しさん:2008/12/18(木) 23:50:23
>>124
これだと
シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが
シート2からこのマクロを実行してシート1にあるセルを参照するとなると、
できなくなるのでは?
126デフォルトの名無しさん:2008/12/19(金) 00:50:28
>>124
これだとエラーでます・・・
127デフォルトの名無しさん:2008/12/19(金) 00:59:34
A17にテストという文字をセットしておくとします

Sub tes2()
Const moji As String = "A17"
Sheets("テスト").Cells(3, 1).Value
Sheets(Range(moji).Value).Cells(3, 1).Value

これだと下の文がインデックスが有効範囲にないとエラーでます
128デフォルトの名無しさん:2008/12/19(金) 01:03:33
>>127
"A17"は、シート名じゃねーだろ
129デフォルトの名無しさん:2008/12/19(金) 01:06:10
>>128
これの意味するところは
range("A17").value = テスト   という所なのでは?
よって
sheets("テスト")  と>>124さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz
130デフォルトの名無しさん:2008/12/19(金) 01:16:52
>>129
どのシートの"A17"で
どこのマクロだよ
131デフォルトの名無しさん:2008/12/19(金) 01:18:18
>>129
右辺を書け!
132デフォルトの名無しさん:2008/12/19(金) 01:23:35
sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております

で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして
sheets("テスト")の3行1列目のセルの値を取得します


でも、なぜか
print Range(moji).value
テスト
とは表示されるのに、先ほどの下の文では表示されません
133デフォルトの名無しさん:2008/12/19(金) 01:26:27
Sheets(Range(moji).Value).Cells(3, 1).Value

これではインデックス範囲のエラーがでますorz
134デフォルトの名無しさん:2008/12/19(金) 01:35:00
実際のファイルを作って、アップしろ
135デフォルトの名無しさん:2008/12/19(金) 01:42:37
Sub tes2()
Const moji As String = "A17"
Sheets("Range(moji).Value").Cells(3, 1).Value
End Sub

sheets(1)のA17セルには、テスト という値が格納されている
sheets("テスト")のセル(3行1列目)の値には、たとえば 100 といった値が格納されている

このマクロをsheet("テスト")にて実行する方法ということです
今のままじゃエラーがでますので
136デフォルトの名無しさん:2008/12/19(金) 01:46:07
>>135
実際に作ったものをアップしろって
137デフォルトの名無しさん:2008/12/19(金) 02:16:52
まったくわからない・・・
138デフォルトの名無しさん:2008/12/19(金) 02:19:01
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。

質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。
const moji as string = "A17"
debug.print worksheets(sheet(1).range(moji)).cells(3,1)
139デフォルトの名無しさん:2008/12/19(金) 02:22:16
>>138
それを実行してみたところ型が一致していません。とでました。
140デフォルトの名無しさん:2008/12/19(金) 02:23:02
>>138

>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。
141デフォルトの名無しさん:2008/12/19(金) 02:24:54
シートの名前は
1がSheet1
2がテスト
です。

Sheet1のA17セルには、テスト と書かれています。他のすべてのセルは空白です。
テストのcells(3,1)の場所には適当に文字を書き込んでいます。

で、お教え頂いたマクロを実行したところ>>139のエラーがでました。
const moji as string = "A17"
debug.print worksheets(sheets(1).range(moji)).cells(3,1)
142デフォルトの名無しさん:2008/12/19(金) 02:26:16
>>141
だから、実際のものをアップしないと話にならねーって
143デフォルトの名無しさん:2008/12/19(金) 02:35:29
>>138
デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
144デフォルトの名無しさん:2008/12/19(金) 02:37:35
うーむ、簡単に見えてむずかしいようですね・・・
145デフォルトの名無しさん:2008/12/19(金) 02:41:18
>>144
オマエが単純に間違ってんだよ。
現物をアップしろよ
146デフォルトの名無しさん:2008/12/19(金) 02:43:48
ごめんよ、テストなんてしてなかったからさ。

だいぶゴツクなっちゃったけど、それでもよければどうぞ。
Sub test()
Const moji As String = "A17"
Dim sh As Worksheet
Dim obj

For Each obj In ThisWorkbook.Worksheets
If obj.Name = Worksheets(1).Range(moji) Then
Set sh = obj
Exit For
End If
Next obj

If IsObject(sh) And (Not sh Is Nothing) Then
MsgBox sh.Cells(3, 1)
End If

End Sub
147デフォルトの名無しさん:2008/12/19(金) 02:44:20
sheet1のA1セルに テスト  と入力します
sheet2のシート名を手動でテストという名前に変更します
sheet2のA1セルに 値 と入植します

このブックをつくって
マクロを
sub テスト()
const moji as string = "A1"
debug.print worksheets(sheets(1).range(moji)).cells(1,1)
end sub

これでエラーがでてしまうということです。下から2行目のところにエラーが・・・
148デフォルトの名無しさん:2008/12/19(金) 02:45:00
>>147
それはもういいんだよ。
現物上げろよバカ
149デフォルトの名無しさん:2008/12/19(金) 02:45:47
>>146
さすがにこれは長いですね・・・
150デフォルトの名無しさん:2008/12/19(金) 02:46:35
>>148
現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
151デフォルトの名無しさん:2008/12/19(金) 02:47:40
>>150
こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。
152デフォルトの名無しさん:2008/12/19(金) 02:48:58
>>150
概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ
153デフォルトの名無しさん:2008/12/19(金) 03:05:44
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。

>>149
長いのが気になるだけなら別関数にしてね^^
154デフォルトの名無しさん:2008/12/19(金) 03:06:30
でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね
155デフォルトの名無しさん:2008/12/19(金) 03:10:01
>>154
オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。
156デフォルトの名無しさん:2008/12/19(金) 03:11:19
>>155
先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
157デフォルトの名無しさん:2008/12/19(金) 03:13:36
ごめん。それは俺のミス。

以上で終了───
158デフォルトの名無しさん:2008/12/19(金) 03:13:43
>>156
rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。
159デフォルトの名無しさん:2008/12/19(金) 03:31:01
おぉ。rangeってrangeなのね。そうなのね。
そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
160デフォルトの名無しさん:2008/12/19(金) 07:04:25
rangeが指定する値を保存する方法って?
161デフォルトの名無しさん:2008/12/19(金) 07:10:54
オブジェクト変数にrangeをセット
162デフォルトの名無しさん:2008/12/19(金) 13:17:19
>>147
質問するとき小文字でコードアップするんじゃねーよ。
実際にVBEからコピペしろ。
回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。

Sub テスト( )
Const moji As String = "A1"
Debug.Print Worksheets(Worksheets("Sheet1").Range(moji).Value).Cells(1,1).Vallue
End Sub

と.Valueが抜けてるから型が一致しないとなるんだよ。
最後の.Valueはなくても動くが途中のは必須。
>>158が書いてるのはこういうこと。
163デフォルトの名無しさん:2008/12/19(金) 13:22:11
>>162
その発言、なんかのギャグ?
164デフォルトの名無しさん:2008/12/19(金) 13:25:02
>>162
流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?
165デフォルトの名無しさん:2008/12/19(金) 14:00:42
日本人はひとつのジョークで3回笑う
1回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき
166デフォルトの名無しさん:2008/12/19(金) 14:09:44
excel2002 SP3を使っています。

以下のようなへたくそなマクロを作りました。

------------------------ここから------------------------

Private Sub Macro1()
Worksheets("IV").Range("B2:B96").Select
Selection.Copy
Worksheets("IV").Range("C2").Select
Selection.Insert Shift:=xlToRight
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Worksheets("IV").Columns("C:C").Select
Worksheets("IV").Application.CutCopyMode = False

nextTime = Now() + TimeValue("00:01:00")
Application.OnTime nextTime, "Macro1"
End Sub

------------------------ここまで------------------------

"IV"のシートを表示させているときは問題なく動作するのですが、
他のシートを表示させると以下のエラーとなって動作してくれません。

実行エラー"1004"RangeクラスのSelectメソッドが失敗しました。

何がいけないのか教えていただけますでしょうか。お願いします。
167デフォルトの名無しさん:2008/12/19(金) 14:13:32
>>166
アクティブにしないとセレクトできないんじゃないの?
168デフォルトの名無しさん:2008/12/19(金) 14:24:07
>>167
そうなんですか。困ったな。。。

普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?
169デフォルトの名無しさん:2008/12/19(金) 14:40:39
Worksheets("IV").Range("B2:B96").Copy
Worksheets("IV").Range("C2").Insert Shift:=xlToRight
Worksheets("IV").Range("C2").PasteSpecial ...
Application.CutCopyMode = False
170デフォルトの名無しさん:2008/12/19(金) 14:51:43
>>169
おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。
171デフォルトの名無しさん:2008/12/19(金) 14:56:51
>>169
できたああああ!
ありがとう!!!!
感謝感謝!!!!
172デフォルトの名無しさん:2008/12/19(金) 20:04:42
質問させてください。
指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。

例:範囲 A1:C3
  A   B  C 
1 山  川  海
2 海  海  川
3 川  都  南

この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。

よろしくお願いします。
173デフォルトの名無しさん:2008/12/19(金) 20:14:52
このファイルで別シートからマクロを実行して
特定の列だけ抽出して別のシートに表示したいです。

列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が
下のテーブルです。

このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには
どのようしすればいいでしょうか?
単にセル結合を考えない抽出ならできるのですが、
セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった
手順でやるのが最適でしょうか?よろしくお願いしますm(__)m

ファイルは以下のやつをみていただければわかりやすいかとおもいます
http://www.dotup.org/uploda/www.dotup.org5812.xlsx.html
174デフォルトの名無しさん:2008/12/19(金) 22:38:02
101で質問したものです。
もぐらたたきが大まかですがだいたいできたので
UPします 
ttp://www.mediafire.com/?bj352f2jaxz
ttp://www.mediafire.com/?mn94db0mc4j

まだもんだいはありますがよろしければ批評してください
175デフォルトの名無しさん:2008/12/19(金) 23:33:05
>172
配列数式でも良ければ
{=SUM(1/COUNTIF(A1:C3,A1:C3))}
176デフォルトの名無しさん:2008/12/20(土) 00:54:59
>>172
配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。

このロジカルなら一瞬だと思うけど。
配列で総当たりってのがちと気になった。


177デフォルトの名無しさん:2008/12/20(土) 01:05:35
>>173
シート名を明示してやればOKだね。

タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。

これを組むのが面倒なら、
結合を全部解除して、全てのセルにタイトルを振ってしまう。
最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。

削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
178デフォルトの名無しさん:2008/12/20(土) 08:34:25
>タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。

抽出してしまった場合、左にもうタイトルはないのではないでしょうか?
あらかじめこれも全ての結合を解除したという前提かな?
でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合
たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに
別のタイトルが埋め込まれますよね?
このファイルに対してはいけそうですが、ない場合は大変かな?

>結合を全部解除して、全てのセルにタイトルを振ってしまう。
>最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。

これもタイトルがない行があった場合、処理に困るかな・・・

追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
179デフォルトの名無しさん:2008/12/20(土) 12:23:58
すみません。CLASSモジュールの書き方がわからないんですが
どこかに説明しているサイトないですか?
180デフォルトの名無しさん:2008/12/20(土) 12:29:58
>>178
元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。

人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。
帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。
レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。

いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
181デフォルトの名無しさん:2008/12/20(土) 19:32:18
Excel2003を使ってます。
VBAの勉強をしたいのですが、良い本や教材はありますでしょうか?
バカでもわかるようなのでいいです。
182デフォルトの名無しさん:2008/12/20(土) 22:48:34
VBAで何やりたいの?
183デフォルトの名無しさん:2008/12/21(日) 00:50:07
質問です。

アクティブになっているシートから別のシートを選択したいのですが、
エラーが出てとまってしまいますが、なぜでしょうか?

エラーの内容はシートの保護がかかっている状態で、
そのシートを選択したとき(Activate)と同じエラーです。

エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。
もちろん保護ははずしましています。
考えられる原因はなにがあるでしょうか。

文章がわかりにくかったらすいません。
184デフォルトの名無しさん:2008/12/21(日) 02:20:11
185166:2008/12/21(日) 12:41:12
>>166です。先日はありがとうございました。
動作のたびに画面がフラッシュして非常にストレスを感じます。

Insert Shiftが重たいのかなとおもうのでInsert Shiftを使わず、
C列、D列、E列・・・と列の最後尾に貼り付けたいと思うのですができますか?
(xlToRightを使うのかな・・・)

あとクリップボード経由だとこれまた重たいようなので、
クリップボードを使わずにそのまま貼り付けできればいいのかな
(Destinationを使う???)と思っているのですが、どうなのでしょうか?


作成したマクロは以下です。アドバイスください。
よろしくお願いします。

---------------ここから---------------

Private Sub Macro1()

Worksheets("IV").Range("B1:B96").Copy
Worksheets("IV").Range("C1").Insert Shift:=xlToRight
Worksheets("IV").Range("C1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

nextTime = Now() + TimeValue("00:01:00")
Application.OnTime nextTime, "Macro1"

End Sub

---------------ここまで---------------
186デフォルトの名無しさん:2008/12/21(日) 13:44:32
>>185
画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
187デフォルトの名無しさん:2008/12/21(日) 13:53:12
>>185
細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。
188デフォルトの名無しさん:2008/12/21(日) 14:27:42
>>186>>187

ありがとうございます。値貼り付けにできますか?
あとこのマクロは時間処理が少しおかしいです。

しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき
(マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。

そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
189デフォルトの名無しさん:2008/12/21(日) 16:06:47
>>172
矩形範囲の種類を数える高速なワークシート関数なんてない。
1列とか1行でソートされてるとかなら簡単だが、矩形範囲ならユーザー定義関数作れ。
Dictionaryオブジェクトの方が簡単だが、>>176の書いてるCollectionを使うなら

Function CountKinds(r As Range) As Long
  Dim col As Collection
  Dim element As Variant
  Dim cnt As Long
  Set col = New Collection
  On Error Resume Next
  For Each element In r.Value
    If Not IsEmpty(element) Then
      col.Add Empty, CStr(element)
      If Err.Number = 0 Then
        cnt = cnt + 1
      Else
        Err.Clear
      End If
    End If
  Next
  CountKinds = cnt
End Function

一次元配列に移してからソートして数える方法もあるが。
190183:2008/12/21(日) 16:15:46
>>184
少し意味がわかりませんが。
PCが違うときに同じマクロでもエラーが出るんです・・・。
自宅PC>動く
会社PC>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。
191デフォルトの名無しさん:2008/12/21(日) 16:34:38
>>190
単純に考えて、同じマクロではないのだろう。
192デフォルトの名無しさん:2008/12/21(日) 16:46:37
VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか?
VBとかcとかはあるんだけど、VBAのやつは見つからない。
193183:2008/12/21(日) 17:33:42
>>191
すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。

会社のファイルがシート保護されていたので、
ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。
なので設定の問題かなと予想してますが。

エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)
194166:2008/12/21(日) 17:49:37
>>187
Copy Destinationですと値貼り付けできないようなので、
PasteSpecial Paste使ってデータをとることにしました。

もう少し研究して使いやすいものを作ってみたいと思います。
(作成したマクロは下です)。ありがとうございました。

---------------ここから---------------

Private Sub Macro1()

nextTime = Now() + TimeValue("00:03:00")
Application.OnTime nextTime, "Macro1"

Worksheets("IV").Range("B1:B96").Copy
Worksheets("IV").Range("IV1").End(xlToLeft).Offset(0, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

End Sub

---------------ここまで---------------
195デフォルトの名無しさん:2008/12/21(日) 18:00:59
.valueを転載したいだけなら、forなりfor eachなりでまわして、
sheets(2).cells(1,1).value = sheets(1).cells(1,1).value
の考えで代入して行っても良いんでないかな。

まぁ、ある程度の量以上になると遅いけど。
196デフォルトの名無しさん:2008/12/21(日) 20:18:24
>>195
For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。
Set r = Range("IV1").End(xlToLeft).Offset(0, 1)
Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value
197デフォルトの名無しさん:2008/12/22(月) 07:46:08
rangeをvariant型の2次元配列に代入するのもいいね。
198デフォルトの名無しさん:2008/12/22(月) 11:08:13
>>197
>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。
199166:2008/12/22(月) 17:36:11
>>195->>198
ありがとうございます。
>>196さんのVBAを使わせてもらってます。

あと3分間に3回も4回も動作を繰り返す症状があり、
以下のサイトを参考にしてexcelを強制リロード
させるようにしたところ安定動作するようになりました。
http://www.efcit.co.jp/cgi-bin2/exqalounge.cgi?print+200502/05020118.txt

お礼まで。
200デフォルトの名無しさん:2008/12/22(月) 21:47:11
Cells(1, 1) = Format("2008 / 12 / 22", "aaa")

これを実行すると (月) ってなるんだけど
両側の括弧を消したい場合は文字を操作するしかないですか?
201デフォルトの名無しさん:2008/12/22(月) 21:49:23
>>200
replaceで括弧取り除くユーザ関数でも作れば?
202デフォルトの名無しさん:2008/12/22(月) 21:51:41
>>200
ならないよ
203デフォルトの名無しさん:2008/12/22(月) 22:04:30
>>202
申し訳ない、環境書きます
osx excel 2004

この環境特有の処理かな?
204デフォルトの名無しさん:2008/12/22(月) 22:18:23
st = "個"
Range("d5").NumberFormatLocal = "0.0""個"""

これだと設定を変えられました。stに代入する意味はありませんが

st = "個"
Range("d5").NumberFormatLocal = "0.0""st"""

これだとエラーがでます。文字列なので""をとってみても
"0.0"st"" 無理でした。
どうすれば代入した値を扱えるのでしょうか?

205デフォルトの名無しさん:2008/12/22(月) 22:46:05
>>203
mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
206205:2008/12/22(月) 23:05:03
>>203
すいません
こうですね
Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1)
若しくは
Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)
207デフォルトの名無しさん:2008/12/22(月) 23:05:49
IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか?
もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
208デフォルトの名無しさん:2008/12/22(月) 23:11:10
>>204
st = "個"
Range("d5").NumberFormatLocal = "0.0" & st
209デフォルトの名無しさん:2008/12/22(月) 23:15:04
>>196 198さんのに関して、横レスですが、是非、教えてください。

>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?
210デフォルトの名無しさん:2008/12/22(月) 23:18:10
>>208
それでもエラーでましたorz
211デフォルトの名無しさん:2008/12/22(月) 23:29:43
>>207
今思いついたのは

n = (Cells(5, 4).Value * 10) Mod 10
If n <> 0 Then MsgBox "小数"

>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね
212デフォルトの名無しさん:2008/12/22(月) 23:34:53
>>211
2.0も小数点扱いしたいです・・・
213デフォルトの名無しさん:2008/12/22(月) 23:40:40
>>212
書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね
214デフォルトの名無しさん:2008/12/22(月) 23:46:52
文字列にして"."をFind
215デフォルトの名無しさん:2008/12/22(月) 23:50:59
>>210
こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st
216デフォルトの名無しさん:2008/12/22(月) 23:58:08
>>209
調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。
217デフォルトの名無しさん:2008/12/23(火) 00:18:33
find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか?

If Obj Is Nothing Then

これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね
その逆の順番にしたいのです
218デフォルトの名無しさん:2008/12/23(火) 00:20:50
>>209
んな難しく考えんでも、行/列 って2次元じゃん。
2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
219デフォルトの名無しさん:2008/12/23(火) 00:22:03
>>217
if obj is nothing then
else
〜〜

じゃダメなの?

if not obj is nothing then

にしたいって事?
220デフォルトの名無しさん:2008/12/23(火) 00:39:13
>>219
はい、そうです
Dim Obj As Object
Set Obj = Cells(1,1).Find(".") '小数点含むなら

If not Obj Is Nothing Then

セル1,1に値を入力しました。5と入力したところ
objはnothingになりません・・・一体なぜなのでしょうか?
221デフォルトの名無しさん:2008/12/23(火) 00:46:03
>>220
表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。

値=Cells(1,1)..Value
If Int(値) = 値 Then
とかで判定した方がいいと思う。
222デフォルトの名無しさん:2008/12/23(火) 00:47:32
Sub test()
Dim a As Range
Set a = Cells(1, 1).Find(".")
If Not a Is Nothing Then
MsgBox a.Address
Else
MsgBox "nothing"
End If
End Sub

普通にnothingだけどねえ。
223デフォルトの名無しさん:2008/12/23(火) 00:50:45
>>222
LookInがxlValuesなんだろ?
デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
224220:2008/12/23(火) 00:53:43
どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。
無事、解決いたしました。ありがとうございます。
225デフォルトの名無しさん:2008/12/23(火) 00:56:00
セルの値が文字列かどうかって判定できますでしょうか?
数値か文字列かを判定したいだけなのですが、
この場合、どうしたらよいでしょうか?
226デフォルトの名無しさん:2008/12/23(火) 00:56:31
完全一致検索とかも考えられるか。
Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
227デフォルトの名無しさん:2008/12/23(火) 01:00:41
>>225
VarType関数で調べる。
いまいちな人はWorksheetFUnction.IsNumberで調べる。
228デフォルトの名無しさん:2008/12/23(火) 01:08:34
>>227
If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、
何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。
これは回避できないのでしょうか?
229デフォルトの名無しさん:2008/12/23(火) 01:16:35
>>228
釣りか?
"Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
230デフォルトの名無しさん:2008/12/23(火) 01:20:55
流石に釣りだろ・・・。
231デフォルトの名無しさん:2008/12/23(火) 01:37:50
セルに値入力をして、たとえば整数を入力します77とか8とか
その入力したセルに対してvartypeやtypenameで調べてみると
vartype=5 typaname=double と表示されます。
なぜ整数扱いではないのでしょうか?
232デフォルトの名無しさん:2008/12/23(火) 01:48:55
>>231
EXcelの仕様。
Long型とかInteger型はありえない。
233デフォルトの名無しさん:2008/12/23(火) 01:52:44
>>232
こんな仕様にした理由は何かあるのでしょうか?
普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが
わかりやすい?

いや、絶対値とるためにdoubleにしてるのかな
でも、typenameやvartypeをそのまま使えないってのは面倒かも
234デフォルトの名無しさん:2008/12/23(火) 08:12:18
熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。
235デフォルトの名無しさん:2008/12/23(火) 08:13:11
間違えた…キニスルナ!
236デフォルトの名無しさん:2008/12/23(火) 09:46:16
ディズニーランドは東京、でも浦安は千葉。
みたいな感じ?
どうでもいいわw
237デフォルトの名無しさん:2008/12/23(火) 12:38:37
>>233
実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
238デフォルトの名無しさん:2008/12/23(火) 13:30:07
singleの方が使用バイト数少ないしね!
239デフォルトの名無しさん:2008/12/23(火) 21:24:42
>>233
0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。

あと、ワークシートでの計算でIntegerとDoubleを区別するよりは
全部Doubleのほうが速いなんてこともありそう。いや想像だけど。

それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。
240デフォルトの名無しさん:2008/12/24(水) 14:01:15
>>239
良く分からんけど
Excelが普通なんでしょ
241デフォルトの名無しさん:2008/12/24(水) 19:50:07
>>239
てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。

変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。
242デフォルトの名無しさん:2008/12/24(水) 20:35:29
んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。
ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。

レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
243デフォルトの名無しさん:2008/12/24(水) 21:58:35
>>241
いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。
244デフォルトの名無しさん:2008/12/24(水) 23:50:41
floatよりdoubleの方が速いらしいぜ
245デフォルトの名無しさん:2008/12/25(木) 00:30:23
>>244
マジレスすると、ケースバイケース。
246デフォルトの名無しさん:2008/12/26(金) 00:36:57
質問です。

windowsXPでExcelは2007。

Dim lastRow As Long '最終行数

Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\新しいフォルダ\AAA.xls"

lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行の取得

で、lastRowに1しか入りません。
実際は1000と入らなければいけないのですが。

どこが間違っているか、御教示ください。
247デフォルトの名無しさん:2008/12/26(金) 01:42:25
>>246
xlUpはどう言う意味?
248デフォルトの名無しさん:2008/12/26(金) 01:49:04
たまたまこのスレ開いた俺が適当に答えてみる
Rows.Countって選択してるRowの数返すんじゃないの?
249デフォルトの名無しさん:2008/12/26(金) 01:56:21
>>246
lastRow = Range("A1048576").End(xlUp).Row
250デフォルトの名無しさん:2008/12/26(金) 02:04:26
シートを指定していないから
関係無いシートがアクティブになってるんじゃない?
一度シートが1つのBookで試してみ
251デフォルトの名無しさん:2008/12/26(金) 02:06:54
おそらく、アクティブなシートを勘違いしている。
252デフォルトの名無しさん:2008/12/26(金) 02:07:27
リロードすればよかった・・・
253246:2008/12/26(金) 09:15:59
皆様ありがとうございます。
シートを1つにしてもlastRowには1しか入りませんでした。
最終行の取り方自体は合っているようなので、 シート関係を見直してみます。
ありがとうございます。
254デフォルトの名無しさん:2008/12/26(金) 11:39:51
>>253
「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。
255デフォルトの名無しさん:2008/12/26(金) 12:51:43
A列にデータが無いとかじゃないよな

普通Bookを開いたら、そのBookがアクティブになるから
問題は無いはず

まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
256デフォルトの名無しさん:2008/12/26(金) 12:58:20
>>255
> 普通Bookを開いたら、そのBookがアクティブになるから
> 問題は無いはず
ねーよ
257デフォルトの名無しさん:2008/12/26(金) 15:30:49

ユーザーフォームでコンボボックスを3つ作成し、それぞれに

sample1
sample2
sample3

とオブジェクト名を指定しました。

コード内で変数を用いてそれぞれのコンボボックスにテキストを挿入したいときに、

For i = 1 To 3

j1 = i
j2 = "sample" & Cstr(i)

j2.Text = j1

Next i

という形でコードを組みましたがうまくいきません。
オブジェクト名を変数で定義することはできないのでしょうか?
稚拙な質問で申し訳ありませんが、よろしくお願いします。
258デフォルトの名無しさん:2008/12/26(金) 15:42:33
>>257
Me.Controls("sample" & Cstr(i)).Text
でできないか?
259デフォルトの名無しさん:2008/12/26(金) 15:49:02
>>258さん

解決しました。ありがとうございました。
260デフォルトの名無しさん:2008/12/26(金) 21:56:21
知ってる人がいたら教えてほしいのですが、
エクセルVBAのコンボボックス(activX)の
設置数に限界は存在するのでしょうか?

とりあえず、3000+αのコンボボックスを1シートに
設定したいのですが・・・・

裏技的な方法でも良いので教えて頂ければ
ありがたいので宜しくお願いします。
261デフォルトの名無しさん:2008/12/26(金) 22:13:21
>>260
Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
262デフォルトの名無しさん:2008/12/26(金) 22:27:44
>とりあえず、3000+αのコンボボックスを1シートに

ユーザーも大変だ w
263デフォルトの名無しさん:2008/12/27(土) 01:03:57
良く分からないけど
一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど
1000作るを3回繰り返すと3000個出来た
For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a
264デフォルトの名無しさん:2008/12/27(土) 01:51:37
失敗したときのコードを張ってみそ
265263:2008/12/27(土) 02:04:11
For n = 1 To 3000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n

>>260を見て
試してみたら解るだろと思ってやってみただけだから
質問主じゃないよ
266260:2008/12/27(土) 02:33:26
263氏の方法でなんとかなりそうです
ありがとうございました
267デフォルトの名無しさん:2008/12/27(土) 07:25:59
いや、出来る出来ないはどうでも良いんだよ。
コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?
268デフォルトの名無しさん:2008/12/27(土) 09:32:05
>>260
コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・
269260:2008/12/27(土) 12:40:11
>>268 
項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。

>>267
コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。

こんなところでしょうか
270デフォルトの名無しさん:2008/12/27(土) 13:10:26
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。
バカな物は作ってはいけない。
271デフォルトの名無しさん:2008/12/27(土) 17:51:01
>>269
データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。

3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。
272268:2008/12/27(土) 20:20:28
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。
273デフォルトの名無しさん:2008/12/27(土) 20:34:24
>>272
こらこらw
274デフォルトの名無しさん:2008/12/27(土) 20:47:59
>>272
DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。

エクセルをRDB的に使用する事があるのは、
シートがRDB構造と視覚的に同じである事が理由。
つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。

エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない)
やはりトランザクションとロックの概念が無いシステムでは怖い。
これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。

エクセルのシートにRDBをダンプすれば、言語が分からなくても、
オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。
関数だってクエリと言えるよね。これは凄く魅力的な事だよ。

全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。
275デフォルトの名無しさん:2008/12/27(土) 23:59:21
>>263

---265氏のプログラム

For n = 1 To 3000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n

---君のプログラム

For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a

---私が265氏と同等と考えるプログラム

For a = 0 To 2
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & a * 1000 + n
Next n
Next a
276デフォルトの名無しさん:2008/12/28(日) 00:09:40
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。

>>260さんの 私の>>268 に対する >>269の返信を見て、
顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの
小規模版データを想像してみました。

また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、
この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。

データ設計例?
 100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。

求めるもの
 2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。

この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。
277デフォルトの名無しさん:2008/12/28(日) 13:15:14
>>275
---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。
278デフォルトの名無しさん:2008/12/28(日) 13:37:14
自分のパソはメモリーが小さいのでかも。260さんではありません。
試しにやってみたものです。
279263:2008/12/28(日) 14:39:49
名前が1208個までしか付けられないのか
280277:2008/12/28(日) 16:44:44
>>279
私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。
281デフォルトの名無しさん:2008/12/28(日) 19:45:07
mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。
誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。
282デフォルトの名無しさん:2008/12/28(日) 20:22:28
283デフォルトの名無しさん:2008/12/29(月) 06:36:24
ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな
効率のいいコードを書くために必要な知識とか教えてくれないか。
284デフォルトの名無しさん:2008/12/29(月) 08:22:46
>>283
そのシステムはExcelで作ったの?
285デフォルトの名無しさん:2008/12/29(月) 08:29:17
>>283
サブルーチンなり関数なりに分けましょう。
286デフォルトの名無しさん:2008/12/29(月) 10:25:34
>>284
うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ

>>285
最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。
287デフォルトの名無しさん:2008/12/29(月) 12:51:23
>>286
ユーザインタフェースのプログラムを何とかしたいということ?
288デフォルトの名無しさん:2008/12/29(月) 13:11:23
>>287
まぁ、そういうことなのかな。

入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。
コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。

運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
289デフォルトの名無しさん:2008/12/29(月) 14:19:59
>>288
UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。
290デフォルトの名無しさん:2008/12/29(月) 15:09:44
>>288
誰もが一度は通る悩み。
モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。

モジュール結合度とかでググってみるといいよ
291デフォルトの名無しさん:2008/12/29(月) 18:53:44
100円  500円  250円

↓ マクロ発動

100円○ 500円  250円


もっとも小さい数字を選んでその数字の横に
○印をつけたいのですが
なかなかうまくいきません

どういった関数を使えばいいでしょう?
292291:2008/12/29(月) 19:08:00
xp
2003
293デフォルトの名無しさん:2008/12/29(月) 21:35:37
>>291さん
こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub
294デフォルトの名無しさん:2008/12/29(月) 22:24:22
約4000のテキストファイルをそれぞれのワークシートにインポートしたいんだけど、
テキスト名が 1001.txt、1002.txt、1004.txt
といった具合に連番じゃないので、下のプログラムだと1003.txtが存在しないので
当然エラーが発生します。都合上、ファイルの名前を連番にすることはできないんです。
理想としては、存在しないファイル番号は無視して次のファイルをインポートするように
したいのですが、イイ案が浮かびません。。
このエラーを回避する手段はありますか?

環境はXPの2003です。

Sub Macro1()
Dim bng As Integer
For bng = 1001 To 9996

ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;D:\Program Files\ootori\data\" & bng & ".txt", Destination:=Range("A1"))
.Name = "1001_1"
.FieldNames = True

中略(マクロの自動登録で書かれた部分)

End With
Next
End Sub
295294:2008/12/29(月) 22:31:54
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね
296デフォルトの名無しさん:2008/12/29(月) 22:34:16
勘違いしてました
訂正です
Sub mini()
Dim mymin
Dim myjuni
Dim datasuu
myjuni = 1
datasuu = 3
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲
For i = 1 To datasuu - 1
If Cells(myjuni, 1) > Cells(i + 1, 1) Then
myjuni = i + 1
End If
Next i
Cells(myjuni, 1) = mymin & "円○"
End Sub
297デフォルトの名無しさん:2008/12/29(月) 22:36:55
296は293の訂正です
298デフォルトの名無しさん:2008/12/29(月) 22:43:48
VBAのステップ実行時に、ウォッチでRangeを見てみました。
すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?

でも、Variant/Object/Range見たいな奴もあるし。。
(これはVariantでObjectでその実態はRangeということかな?)

Worksheet/Sheet1なんていうのもあります。
(これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)

299デフォルトの名無しさん:2008/12/29(月) 23:19:00
ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。
300デフォルトの名無しさん:2008/12/29(月) 23:48:10
別に、エラーをインラインで処理するのはおかしくない。
トラップすれば処理できているとは限らないのと一緒。
論理的破綻はどちらでも起こる。
301296:2008/12/30(火) 00:08:18
>>291さんへ
たびたびすいません
こんなのありました
large関数
(指定された範囲データから大きい方から任意の数字番目を返す)
small関数
(指定された範囲データから小さい方から任意の数字番目を返す)
302デフォルトの名無しさん:2008/12/30(火) 00:58:44
VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明)
をその文字の上に配置して、その文字を囲っているように見せたいと思っています。

そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、
オートシェイプを配置すべき座標を計算することを考えています。
フォントは固定幅で考えております。

今、自分が分からないのは、
(1)文字の幅の単位(cmとかインチ?ピクセル??)
(2)文字列の長さをcmとかインチで正確に取得する方法
(関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!)
(3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??)
(4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式

何方か教えていただけますですか?
(自分でも継続して調べます。)
よろしくお願いします。


303デフォルトの名無しさん:2008/12/30(火) 04:13:54
シェイプの長さは
テキストのFont.Size掛ける文字数で

シェイプの位置は
セルの.Top .Leftで

目的のセルはFindと FindNextで

あとは細かい調整で
いいみたい
304デフォルトの名無しさん:2008/12/30(火) 08:28:53
VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…
305デフォルトの名無しさん:2008/12/30(火) 11:28:03
>>304
同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。
 VBAではやり方は良くわからんのだけど、
"Excel VBAによるWin32 APIプログラミング入門"
この辺を見ればよいと思う。
 タスク複製だのは結構癖があるからがんばって。

 あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。
306302:2008/12/30(火) 17:09:11
>>303
ありがとうございます!!!

自分でも探したんですけどさっぱりその手の情報がなくて(;_;)
非常に助かりました。本当にありがとうございました!
307304:2008/12/30(火) 18:30:26
≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30〜1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?
308291:2008/12/31(水) 14:49:44
>>301
ありがとうごさいます

やってみます
309デフォルトの名無しさん:2008/12/31(水) 22:39:19
Select Case…End SelectってC言語のswitch相当だと思うんですけど、breakって無いんですか?

Select Case exp
Case 0
IF xxx = FALSE THEN
Break  ←これ!!!!
End IF
End Select

みたいな。
310デフォルトの名無しさん:2008/12/31(水) 23:29:23
無い
311デフォルトの名無しさん:2009/01/01(木) 00:31:04
>>309
そもそもbreakしてどこへ行くつもりだ
312デフォルトの名無しさん:2009/01/01(木) 00:36:55
>>310
ありがと

>>311
Selectの外に決まってんじゃん。。。
313デフォルトの名無しさん:2009/01/01(木) 00:41:39
>>312
それがしたいだけなら、どうにでもなるだろと小一時間…
314デフォルトの名無しさん:2009/01/01(木) 00:41:51
仕方なくGotoだな
315デフォルトの名無しさん:2009/01/01(木) 00:44:16
>>314
ちょ、おま、そんな最終手段をっ!
316デフォルトの名無しさん:2009/01/01(木) 00:44:45
>>313
どうすんの?
317デフォルトの名無しさん:2009/01/01(木) 00:46:24
>>316
Select Case exp
  Case 0
    IF xxx THEN
      処理
    End IF
End Select
318デフォルトの名無しさん:2009/01/01(木) 00:48:24
抜ける方法を聞いてんの。
わざわざ論理を逆にして書けば良いじゃんとか
抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか
そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ
あとさぁ
なんで
if()
{
319デフォルトの名無しさん:2009/01/01(木) 00:48:59
はあ〜書いちゃった。。

じゃ、問題。何を書きたかったんでしょうか?
320317:2009/01/01(木) 00:49:51
ちょっと説明不足かな
要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味
Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
321デフォルトの名無しさん:2009/01/01(木) 00:53:31
答え発表!
ヒューヒュー

あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}

みたいにELSE句にIFが書けないんだろう
欠陥だろ。。

でした。

>>320
そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
322デフォルトの名無しさん:2009/01/01(木) 00:53:35
go away
323デフォルトの名無しさん:2009/01/01(木) 00:57:44
>>322
おや?外れたのかな?(^^)
勘がニブいんですねw

324デフォルトの名無しさん:2009/01/01(木) 01:04:13
>>318
アホなのか・・・
325デフォルトの名無しさん:2009/01/01(木) 01:06:26
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
ねーよ。
326デフォルトの名無しさん:2009/01/01(木) 01:09:56
抜ける方法を聞いただけでこの荒れようww
VB厨はばかだなぁww
書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。
高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。
アセンブラじゃないんだからさぁ。
IF THEN
ELSE
 IF THEN
 ELSE
  IF THEN
  ENDIF
 ENDIF
ENDIF

うわっ。だっさ。最悪。

書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
327デフォルトの名無しさん:2009/01/01(木) 01:14:31
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If
328デフォルトの名無しさん:2009/01/01(木) 01:27:43
>>327
あ!ありがとうございます。
あったんだ。
329デフォルトの名無しさん:2009/01/01(木) 01:48:45
>>328
意外と素直w
330デフォルトの名無しさん:2009/01/01(木) 02:10:17
あんまり笑わせるなよ。
VB分かってないやつがVB馬鹿にしてたのかよ。orz
331デフォルトの名無しさん:2009/01/01(木) 02:11:14
明らかに分かってないのに、構造構造言いたがるのなんて、
情報系の一年生くらいだろ。
332デフォルトの名無しさん:2009/01/01(木) 02:21:16
>>330-331
ゴメンね(´・ω・`)
ついイライラしてたから
333デフォルトの名無しさん:2009/01/01(木) 02:30:42
厨とか言っちゃうやつは例外なくアホ
334デフォルトの名無しさん:2009/01/01(木) 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか?

C#への布石ですか?
335デフォルトの名無しさん:2009/01/01(木) 17:12:57
Excel 2008でVBAが使えないのは事実らしいが、
Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3439
336デフォルトの名無しさん:2009/01/02(金) 08:30:00
このスレは、Excel の VBE で作るフォームについての質問はスレ違い?
スレ違いでしたら誘導をお願いします。
337263:2009/01/02(金) 09:22:34
>>336
もしかしてデザインの話か
そんな誘導先ないだろ
338デフォルトの名無しさん:2009/01/02(金) 09:23:06
名前消し忘れた恥ずかしい
339デフォルトの名無しさん:2009/01/02(金) 13:45:39
どうせなら、VSTA2.0の情報とかを書けばいいのに
>>334-335
340デフォルトの名無しさん:2009/01/02(金) 14:03:27
あれ本当にOfficeに乗っけるの?
341デフォルトの名無しさん:2009/01/02(金) 14:17:09
>>335
よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
342デフォルトの名無しさん:2009/01/02(金) 15:03:36
そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。
この先もそれが続くと信じて安穏としているのは間違っているだろうが、
数年でなくなるような存在でもない。
343デフォルトの名無しさん:2009/01/02(金) 16:48:02
Excel VBAによるWin32 APIプログラミング入門
この本って絶版でもう購入不可ですか?
344デフォルトの名無しさん:2009/01/02(金) 16:58:06
絶版です
345336:2009/01/02(金) 18:06:59
>>337
そうですか…了解です。

スレ違いを承知で 1 つだけ質問。
Excel のデザインで使うフォームのコントロールの仕様って VB6 と
同じなんですかね?

(コンボボックスでダブルクリックのイベントが起きないので調べたら、
 VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
 ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
 ダブルクリックのイベント絶対起きないじゃん…。)
346デフォルトの名無しさん:2009/01/03(土) 00:31:02
ダブルクリックのイベントが発生しない が意味不明 
で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている
「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版
に第10章 入力画面を使ってみよう を読んでみたwww
ユーザーホームのデザインという用語が使われているが、この本では
ダブルクリックをする場面は、VBE上コンボボックスのことで、
excelシート上のコンボボックスではないよ。シート上ではダブルクリックは
使わないものと思っている。

347デフォルトの名無しさん:2009/01/03(土) 00:58:20
>>346
セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが
348336:2009/01/03(土) 02:30:30
>>346
コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。

というかワークシート上にもコントロールを置けたんですね。
で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで
ダブルクリックのイベントが発生しました。なんで?

目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを
取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。

方法は下記です。
(1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して
  モジュール変数に退避する。
(2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。
(3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった
  処理を実行する。

コンボボックスでダブルクリックのイベントを拾った後の使い道は、
(1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!)
(2) コンボボックスより詳細なリストが表示できるフォームの呼び出し
を考えていました。

上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。
349デフォルトの名無しさん:2009/01/03(土) 03:55:36
トリプルクリックにまで対応できるのは素晴らしいけど
コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな
350デフォルトの名無しさん:2009/01/03(土) 04:52:18
351デフォルトの名無しさん:2009/01/03(土) 04:53:58
オレのExcel、コンボボックスにダブルクリックイベント有るけど
みんなのには付いてないの?
バージョン Excel2003
352デフォルトの名無しさん:2009/01/03(土) 06:03:46
たぶん
コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
353デフォルトの名無しさん:2009/01/03(土) 13:26:28
オリジナリティ溢れるUIほど迷惑なものはない
354デフォルトの名無しさん:2009/01/03(土) 16:11:29
>トリプルクリックや4回クリックなどにも

何考えてんだ?
355デフォルトの名無しさん:2009/01/03(土) 16:20:56
V2C には6回クリックまであるぜ
356デフォルトの名無しさん:2009/01/03(土) 17:11:00
API使えば、ダブルクリックの認識の間隔を取得できるから、
0.5秒決め打ちよりそれを使ったほうがいいと思う。
そういう話をしている場合でないとは思いつつ。
357デフォルトの名無しさん:2009/01/03(土) 19:44:02
質問です。
セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが
どう設定のマクロを書いたものか、よろしく。
右クリックイベントによってコピーモードにしているのに、余分な作業を
するのを防止したいので。
358デフォルトの名無しさん:2009/01/03(土) 21:18:27
マウスの右ボタンを殺す
359デフォルトの名無しさん:2009/01/04(日) 02:39:56
BeforeRightClickイベントの第二引数にCancelがあるだろ
360デフォルトの名無しさん:2009/01/04(日) 13:15:18
サーバサイドでの帳票の生成にVBAを検討していて、
安定性、処理性能、MSのライセンス違反等を懸念してますが、
何か懸念事項やアドバイス等ありますでしょうか?
361デフォルトの名無しさん:2009/01/04(日) 14:49:46
論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、

列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の

「そうでないなら」はどう書いたものでしょうか?
362デフォルトの名無しさん:2009/01/04(日) 15:11:17
>>361
色々あるだろうけど
普通は
if
elseif
elseif
else

363デフォルトの名無しさん:2009/01/04(日) 15:18:49
>>357
ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
364デフォルトの名無しさん:2009/01/04(日) 15:21:38
>>361
>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf
365デフォルトの名無しさん:2009/01/04(日) 23:41:35
まあOr使っちゃうのが一般的かつ簡単ではあるが
条件1つずつでネストした方が速い

何故なら、例えば列5に一致するならイベント処理は行うので
列6、列9に一致するか否かは判定する必要が無いのに
>>364では毎回全てを判定した上で論理演算してしまう
複数条件でAnd、Orを使わないのは、コード最適化の常套手段

逆に速度気にせず手を抜きたいなら、カンマ区切りで
複数条件指定できるSelect Case使う方がお手軽だろ
Case 列5, 列6, 列9
  イベント処理
Case Else
  Exit

因みに論理演算(>>364)の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ
とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
366デフォルトの名無しさん:2009/01/04(日) 23:56:00
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。
367デフォルトの名無しさん:2009/01/05(月) 00:00:55
ショートサーキットはしないよ
まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
368デフォルトの名無しさん:2009/01/05(月) 12:09:49
>>365
Select Caseが105って一概には言えないだろ?
>Case 列5, 列6, 列9
これショートサーキットだから列5がTrueなら列6と列9は評価しないし。
>>366
ショートサーキットするのはVB.NetのOrElseとかAndAlso
今はVB.Netって言わないんdっけ?
369デフォルトの名無しさん:2009/01/05(月) 13:14:41
>>368
Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値

そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
370デフォルトの名無しさん:2009/01/05(月) 14:13:14
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか?
例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)
371デフォルトの名無しさん:2009/01/05(月) 14:19:16
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
372デフォルトの名無しさん:2009/01/05(月) 14:22:53
>>371
調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。
373デフォルトの名無しさん:2009/01/05(月) 18:24:45
>>369
IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。
実測してみろよ。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo1()
  Dim i&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    Select Case i Mod 10
      Case 5, 6, 9
      Case Else
    End Select
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
Sub foo2()
  Dim i&, j&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    j = i Mod 10
    If j = 5 Or j = 6 Or j = 9 Then
    Else
    End If
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
foo1がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。
374デフォルトの名無しさん:2009/01/05(月) 19:51:47
>>373
・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ

ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな
375373:2009/01/05(月) 21:26:44
>>374
i Mod 10の値を処理で使わないんなら>>373が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?
376デフォルトの名無しさん:2009/01/05(月) 21:35:16
> i Mod 10の値を処理で使わないんなら>>373が平等なコード。
そうでもない

> おめーんとこじゃ遅いのか?
うん
377373:2009/01/05(月) 21:40:10
OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。
おまえは最速のコード書けないんだろ?
378373:2009/01/05(月) 21:41:57
後ろは読んでなかったが、おれのとこと逆になるらしいな。
俺のとこはSelect Caseが速い。
379デフォルトの名無しさん:2009/01/05(月) 22:00:24
実際の処理に置いて必ずModで算出した値を使うというわけではない以上
条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという
同じ状況を作ることが平等になる

Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、
君の言うとおりベストを尽くして最速コードを書くべきだけどね
380デフォルトの名無しさん:2009/01/05(月) 22:12:28
なんか分かってないなぁ。
Modで算出した値を使わないなら>>373になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。
381デフォルトの名無しさん:2009/01/05(月) 22:19:50
>>380
foo1が速かった
382デフォルトの名無しさん:2009/01/05(月) 22:24:07
>>381
トンクス
j = i Mod 10
Select Case j
としても?

おれのとこはそれでもfoo1が速いが。
383デフォルトの名無しさん:2009/01/05(月) 22:26:51
>>382
逆転した
384デフォルトの名無しさん:2009/01/05(月) 22:31:23
>>383
ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?
385デフォルトの名無しさん:2009/01/05(月) 22:33:56
>>384
してなかった

したら差は縮まったけどまだ
foo2が速い
386デフォルトの名無しさん:2009/01/05(月) 22:35:45
>>385
おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。
387デフォルトの名無しさん:2009/01/05(月) 22:36:45
すまん、また後ろ読んでなかった。
388デフォルトの名無しさん:2009/01/05(月) 22:41:46
>>386
&で宣言したよ
30位foo2が速い
389デフォルトの名無しさん:2009/01/05(月) 22:42:49
まぁModで算出した値を使わないなら>>373が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。
390デフォルトの名無しさん:2009/01/05(月) 22:44:22
ちなみに
Excel2002です
391デフォルトの名無しさん:2009/01/05(月) 22:47:06
>>390
トンクス。
392361:2009/01/05(月) 23:18:31
>論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、
>列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
>「そうでないなら」はどう書いたものでしょうか?
訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。

If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub
393デフォルトの名無しさん:2009/01/06(火) 00:21:36
文章だけだと伝わりづらいと思いますが、質問です。


ハイパーリンク │ 転記情報1
ハイパーリンク │ 転記情報2

EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、
それをWEBブラウザでプレビューできるようにしています。

WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?
394デフォルトの名無しさん:2009/01/06(火) 03:38:21
>>392
背中がムズムズする……
395デフォルトの名無しさん:2009/01/06(火) 05:39:55
>>394
気持ちは解る
条件式にnotと=を併用するヤツってもうね…
396デフォルトの名無しさん:2009/01/06(火) 07:33:05
<>
397デフォルトの名無しさん:2009/01/06(火) 09:47:49
>>392
「Aでないか、Bでないか、Cでない」ではなく「Aでもなく、Bでもなく、Cでもない」だろ?
前者だと必ずTrueだからな。
それは置いといて、普通イベント処理ならIntersect使うから列番号では判定しないが、どうしても列番号で判定したいとか基本のお勉強なら
Select Case Trget.Column
  Case 5, 6, 9
    '処理1
  Case Else
    Exit Sub
End Select
’処理2

処理2がなければ、何もわざわざCase Elseで抜ける必要なし。
というか抜ける記述は普通はしない。
398デフォルトの名無しさん:2009/01/06(火) 09:49:54
何、今更?
399デフォルトの名無しさん:2009/01/06(火) 09:59:59
>>392
書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
400デフォルトの名無しさん:2009/01/06(火) 10:02:35
>>398
昨晩のアフォの>>365か?
無視してすまんね。
401デフォルトの名無しさん:2009/01/06(火) 10:29:05
悔しかったの?
402デフォルトの名無しさん:2009/01/06(火) 10:30:29
シートに商品名が20,000件程度入力されている状態で
テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを
リストボックスに追加 という処理を考えていたのですが
下記の方法で試してみるとかなり時間がかかってしまいます
高速に処理をさせるには根本的な方法の見直しが必要でしょうか?

 dSelectForm.ListBox1.Clear
 LastRow = Sheet1.Range("C65536").End(xlUp).Row
 For i = 2 to LastRow
  Ans = 0
  Ans = WorksheetFunction.Find(inputKey, Sheet1.Cells(i, 3))
  If Ans <> 0 Then
   dSelectForm.ListBox1.AddItem Sheet1.Cells(i, 3)
  End If
 Next
403デフォルトの名無しさん:2009/01/06(火) 10:59:47
相変わらずの人がいるなw
404デフォルトの名無しさん:2009/01/06(火) 11:20:39
>>402
ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
405デフォルトの名無しさん:2009/01/06(火) 16:29:31
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。
条件に「合う」場合だけ判定して処理するように書くのが普通だね。

定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし
見た目のわかりやすさと保守のしやすさからCaseをすすめとく。
条件が増えたときに簡単に数字が追加できるから。
406デフォルトの名無しさん:2009/01/07(水) 01:50:36
2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか?
08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。
407デフォルトの名無しさん:2009/01/07(水) 03:34:54
>>406
セルの表示形式で「yy.mm.dd」
408デフォルトの名無しさん:2009/01/07(水) 05:57:34
>>405
俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。
409デフォルトの名無しさん:2009/01/07(水) 06:18:38
>>406
数式でよけれべ普通に=A1-B1なんてやりゃできる。
もし表示形式が日付形式になるようなら、G/標準とか0にすりゃいい。
2007では計算元の表示形式が日付でも普通に1になるが、たしか2003では数式セルは日付にならなかったっけ?

計算元の表示形式が文字列で、VBAでやりたいのなら
MsgBox CDate(Cells(1,1).Value)-CDate(Cells(1,2).Value)
MsgBox DateValue(Cells(1,1).Value)-DateValue(Cells(1,2).Value)
などとやりゃできないか?
410デフォルトの名無しさん:2009/01/07(水) 07:26:12
if not hoge is nothing then

って構文が気持ち悪いんですけど、何か代替えはありませんか?
411デフォルトの名無しさん:2009/01/07(水) 07:53:25
そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?
412デフォルトの名無しさん:2009/01/07(水) 08:23:23
「代替え」なんて変な言葉を使う人に言われたくありません。
もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?
413デフォルトの名無しさん:2009/01/07(水) 08:34:53
>>410
If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。
414デフォルトの名無しさん:2009/01/07(水) 10:38:45
それならもっとシンプルにできる
If ObjPtr(hoge) Then
こういう書き方を知らないと意味がわからなくなるけど
415デフォルトの名無しさん:2009/01/07(水) 12:12:25
416デフォルトの名無しさん:2009/01/07(水) 12:25:38
not 〜 nothingは俺も気持ち悪いと思う
直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って
英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ

俺もまだVBAを勉強中だから知らないだけかもしれないけど、
インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような
構文か関数ってないの?自分で作るしかない?
417デフォルトの名無しさん:2009/01/07(水) 16:19:22
別にこの仕様でおかしくもないと思うけどねぇ
そもそもがNothingのときに何かをするってことの方が多いんだからさ
有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが
どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ
418デフォルトの名無しさん:2009/01/07(水) 17:08:30
if hoge is not nothingと書けるのが一番良い
419デフォルトの名無しさん:2009/01/07(水) 17:21:50
余計変だw
420デフォルトの名無しさん:2009/01/07(水) 18:39:23
>>415
変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。
421デフォルトの名無しさん:2009/01/07(水) 18:42:58
いっそのこと
If hoge = Nothing
If hoge <> Nothing
でいいじゃん。
なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。
422デフォルトの名無しさん:2009/01/07(水) 19:10:25
代替〜(ダイタイ〜)
の同音異義語が有る場合などに
代替え〜(ダイガエ〜)
と重箱読み使うのは昔からあること

変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの
件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない
"代替"の意味で"代変え"を使っているなら完全な誤用だけどね

そもそも、言葉というのは変化していくもの
最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい
頭使うことを知らない人は、誤用と変化の違いを見極めることなく
自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ
423デフォルトの名無しさん:2009/01/07(水) 19:32:33
AndAlsoやOrElseってVBAには無いんだったっけ?
424デフォルトの名無しさん:2009/01/07(水) 19:50:59
>>412
いや、”だいがえ”が正しいんじゃないかな。
もしかして”だいがい”って呼んでるの?
425デフォルトの名無しさん:2009/01/07(水) 19:54:09
CやJavaが長年培ってきた洗練された構文をかなぐり捨ててVBはいったいなにがしたかったのだろう。
なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。
見やすくない上に3文字も打たないといけない。ばっかじゃないか?
426デフォルトの名無しさん:2009/01/07(水) 19:55:49
馬鹿発見。「だいたい」と読むのだよ。つーか、>422に書いてあるだろ。
427デフォルトの名無しさん:2009/01/07(水) 19:56:12
いやいや、オリジナルのBASICはCより古いぞ。
その古臭い構文をVBも引きずっているというだけ。
だからこそBasicを名乗っているわけだが。
428デフォルトの名無しさん:2009/01/07(水) 19:56:28
>>425
CやJavaとbasicはどっちが古いと思っているのかね。
429デフォルトの名無しさん:2009/01/07(水) 20:00:04
オリジナルのベーシックと今のVBはかなり違うじゃん。
古いベーシックから新しいVBになるにあたって
CやJavaで解決されている構文を見習えばよかったのだ。
430デフォルトの名無しさん:2009/01/07(水) 20:00:56
C#でも使ってろ。
431デフォルトの名無しさん:2009/01/07(水) 20:05:32
>>430
エクセルのマクロでC#って使えるの?
432デフォルトの名無しさん:2009/01/07(水) 20:06:30
それよりなんでキーワードの先頭は大文字なんだろう
目がチカチカする
小文字ならまだメリハリが出て読みやすいと思う
433デフォルトの名無しさん:2009/01/07(水) 20:12:55
エクセルのセルに入っている文字列の特定の文字の上にオートシェイプを置きたいって質問した人です。

質問させてください。

エクセルの現在のフォントでの文字列の幅を取得するには、

1.HWNDをNULLでデバイスコンテキストを取得する。
2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。
3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。
4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。
  (DPIはGetDeviceCapで取得)
5.エクセルのシートのズームが80%なら0.8をかける

であっていますか?
434デフォルトの名無しさん:2009/01/07(水) 20:22:18
>>429
VBが登場した頃は、まだパソコン用の高級言語の人気が
CとPascal(これはBegin〜Endって書く言語)で2分していて、
C系の構文が良いという評価が固まっていなかったのだと思う。

>>432
VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
435デフォルトの名無しさん:2009/01/07(水) 20:27:07
変わったと言うより大幅に拡張されてるね。
根っこの部分はN-BASICの時代から変わってないから
昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。
このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。

例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。

For i = 1 To 10
For j = 1 To 10
  (処理)
Next j, i
436デフォルトの名無しさん:2009/01/07(水) 20:31:28
>>435
あったなぁ・・

そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね?
配列とか。あれキモイ。

まともな人間なら数字は0からカウントするものだ。
という言葉を思い出した。
437デフォルトの名無しさん:2009/01/07(水) 20:36:44
fortranなんかは1からだろ
数学も1から
C系で0ベースなのはメモリの配置とか低レベルな理由
438デフォルトの名無しさん:2009/01/07(水) 20:38:03
>>436
配列はN-BASICもVBも0からだろ。
439433:2009/01/07(水) 20:39:17
あのー。少しは私のことも思い出してあげてください。。(^^;)
440デフォルトの名無しさん:2009/01/07(水) 20:40:30
>>439
修飾(ボールドとかイタリックとか)も考慮しないとずれるよ
441デフォルトの名無しさん:2009/01/07(水) 20:43:21
>>440
嗚呼〜。ほんとだ。そうですよね。。

あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?
442デフォルトの名無しさん:2009/01/07(水) 21:25:06
>>407>>409
表示形式色々変えたんですけど、
Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。
なんでなのでしょう。
EXCELのバージョンは2000です。
443デフォルトの名無しさん:2009/01/07(水) 21:27:33
>>441
細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。
すべてに対応するのはけっこうめんどくさそう。
444デフォルトの名無しさん:2009/01/07(水) 21:28:40
>>442
元の日付けデータがシリアル値になってないんでねーの?
445デフォルトの名無しさん:2009/01/07(水) 21:31:48
>>443
そういやそうですね。ちょっとそこらへんも含めて作ってみます。
446デフォルトの名無しさん:2009/01/07(水) 21:50:11
VBAっていつ無くなるんだっけ?次のバージョンから?
447デフォルトの名無しさん:2009/01/07(水) 21:55:32
>>444
そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。
=DATEVALUE("08.02.01")
みたいに表記してもVALUEになるだけですし。
448デフォルトの名無しさん:2009/01/07(水) 22:01:53
>>447
VBA関係ないよな
=DATEVALUE(SUBSTITUTE("08.02.01",".","/"))
次に何かわからないことがあったら総合相談所行ったら?
449デフォルトの名無しさん:2009/01/07(水) 22:03:37
>>446
Mac版の2008ではなくなったけど、その次でまた復活する予定。
Win版はなくならない。
450デフォルトの名無しさん:2009/01/07(水) 22:18:53
>>449
サンクス
本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる
451デフォルトの名無しさん:2009/01/07(水) 23:29:12
てか、事務職でVBAって何に使うんだよw
452デフォルトの名無しさん:2009/01/07(水) 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?

453デフォルトの名無しさん:2009/01/08(木) 00:20:50
うぇー Workbook.Save False すると Wrokbook_Before_Close動かん
454デフォルトの名無しさん:2009/01/08(木) 00:29:40
>>452
オートフィルタの実行はAutoFilterメソッド
結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド

>>451
単純作業をVBAで自動化してやるとけっこう喜ばれるよ
毎日在庫を確認して発注伝票を印刷してFaxで送信するとか
中小だとアバウトな部分が多くて完全な自動化は難しいから
できるところだけやる
455デフォルトの名無しさん:2009/01/08(木) 00:35:23
>>451
どんだけ想像力ねぇの?
456デフォルトの名無しさん:2009/01/08(木) 00:35:29
下記のような感じで、セルに他のセルを参照した値を入力したいのですが、
下記の入力方法だと、絶対参照になってしまいます。
相対参照にする指定方法をご存じないでしょうか?

Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
457デフォルトの名無しさん:2009/01/08(木) 00:43:52
>>451
Officeって言うくらいだから・・・
458デフォルトの名無しさん:2009/01/08(木) 00:53:51
>>456
Cells(i, 9).Address(False, False)
459デフォルトの名無しさん:2009/01/08(木) 01:14:30
OS:WinXP
Ver:Office2000

以下のマクロが意図したとおりに動きません。
aの値によってaddstに入力した値に異なる係数をかけた値を作りたいのですが、
係数をかけたはずのaddをセルに入力してみるとゼロになっています。
参考文献にはCaseの後はコンマで区切って複数条件を入れれるとありますが、
それはできないのでしょうか。。
なおプログラム自体は上記係数を無視する他は問題なく動いています。

Dim a As Integer
(中略:aはFor構文で1から18まで増える)
Dim addstd As Double
Dim add As Double

addstd = 0.3
Select Case a
Case 3, 4, 8, 11, 13, 18
add = addstd
Range("A5").Value = add
Case 2, 6, 7, 10, 15, 17
add = addstd / 2
Range("A5").Value = add
Case 1, 5, 9, 12, 14, 16
add = addstd / 3
Range("A5").Value = add
End Select
460デフォルトの名無しさん:2009/01/08(木) 01:22:28
>>458
ありがとう
461デフォルトの名無しさん:2009/01/08(木) 01:49:40
>>459
表示形式
462デフォルトの名無しさん:2009/01/08(木) 02:57:09
ウォッチやDebug.Printで値を見るくらいは自分でやれよ

ほんと、VBA使いって問題起こるとそこで思考停止してしまい
試行錯誤することが出来ない奴が多いよな

エラー出たらそこで終わりってなら機械と同じだぜ
処理速度では機械に敵わないんだから機械以下とも言える
463デフォルトの名無しさん:2009/01/08(木) 06:24:19
多いって何人だよ
464459:2009/01/08(木) 08:48:02
ありがとうございます。ググってみました。
もしかすると、これに近い問題でしょうか。
http://questionbox.jp.msn.com/qa2390763.html

また、デバッグ方法もありがとうございました。
VBAというか、プログラミング的なものを初めて2日目なもので、まだよく使い方がわかっていませんでした。
今から会社に行っていろいろ試してみようと思います!
465デフォルトの名無しさん:2009/01/08(木) 09:05:06
>>459
計算自体はできてるようなので
書式設定の少数点以下の桁数が0になってるんじゃ?
466デフォルトの名無しさん:2009/01/08(木) 09:52:07
非アクティブシートの選択セルを操作する事は可能ですか?
467デフォルトの名無しさん:2009/01/08(木) 10:48:21
無理
468デフォルトの名無しさん:2009/01/08(木) 15:28:00
VBAを作成してもらいたいのですが
もし作成していただけるようでしたらメールをお願いします。

1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。
469468:2009/01/08(木) 15:30:04
メール入力し忘れてました(´A`)
470デフォルトの名無しさん:2009/01/08(木) 19:05:09
幾ら出すの?
471デフォルトの名無しさん:2009/01/08(木) 19:42:27
カラダで良かったら...
472デフォルトの名無しさん:2009/01/08(木) 20:41:14
>>468
形式を選択して貼り付け→行列を入れ換える
473デフォルトの名無しさん:2009/01/08(木) 23:45:40
EXCELのWebブラウザでプレビューの機能を使って作ったブラウザをVBAで閉じるにはどうしたらいいんですか?
474デフォルトの名無しさん:2009/01/09(金) 00:43:19
Webbrowser.Fuck
475デフォルトの名無しさん:2009/01/09(金) 00:44:26
OS:XP
Version:2003

取得したデータをセルに表示させる処理を作ったのですが
少し処理速度が遅いので、配列を使って処理しようと思っています。
その際、特定データに対してセルの色付けを行っているのですが
配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで
セルに色付けするのがいいんでしょうか?

配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが
どなたか知恵を貸して下さい
476デフォルトの名無しさん:2009/01/09(金) 00:50:04
> 配列に入れる処理中に色付けをする
それでいいじゃん、何か問題有るの?
477デフォルトの名無しさん:2009/01/09(金) 03:10:36
>>473
穴だらけのコードだけど、とりあえず…
環境依存かもしれない

Option Explicit

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const WM_CLOSE = &H10
Public Const ml = 255
Dim wh1 As Long

' コールバック関数
Public Function EnumWindowsProc(ByVal Handle As Long, ByVal lParam As Object) As Long
  Dim strClassName As String * ml
  Dim strCaption As String * ml
  GetClassName Handle, strClassName, ml  ' クラス名取得
  GetWindowText Handle, strCaption, ml    ' キャプション取得
  If Left(strClassName, 7) = "IEFrame" And Mid(strCaption, 4, 22) = "Documents and Settings" Then wh1 = Handle
  EnumWindowsProc = True
End Function

Private Sub test1() '「ブラウザでプレビュー」を閉じる
  wh1 = 0
  Dim Ret As Long
  Ret = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
  If wh1 <> 0 Then Call PostMessage(wh1, WM_CLOSE, 0, 0)
End Sub
478デフォルトの名無しさん:2009/01/09(金) 09:28:53
>>475
とりあえず大雑把なアドバイスをしておく

できる限りセルへのアクセスを減らす

決まった色の取得にRGBを何度も呼ばない
定数を使うか初期化の段階でLong型の変数に入れておいてそれを使う

的外れなアドバイスだったらスマソ
具体的にどんな処理をしてるのか分かればもう少し細かく何か言えるかも知れん
479デフォルトの名無しさん:2009/01/09(金) 16:28:17
名前の定義のリストをシートに作成し、それを変更して一気に登録しています。
そこで困った事が発生しました。

シート名がS1とかだと名前の前後にシングルコーテーションが付きますね。
セルから取り出した値は先頭の1文字が外されます。
仕様だとは思いますが、シングルコーテーションも一緒に取り出す方法等が
あるのでしょうか?

480デフォルトの名無しさん:2009/01/09(金) 16:45:36
>>479
リストを作る時に先頭にシングルコーテーションをもう1つ入れておく
もしくはシート名と名前で列を分ける(使う時に編集する)

この程度しか思いつかないな・・・
481452:2009/01/09(金) 23:15:14
452 :デフォルトの名無しさん:2009/01/07(水) 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?

>454 :デフォルトの名無しさん:2009/01/08(木) 00:29:40
> >>452
> オートフィルタの実行はAutoFilterメソッド
> 結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
との答えをいただき、
いろいろとやってみるのですが、全くのお手上げ状態です。

フィルター後の上2件分の例示マクロをお願いします。
482デフォルトの名無しさん:2009/01/09(金) 23:25:47
>>481
もうちょっと質問を具体的に。
(1)フィルターの条件は?
(2)フィルターかけたあとどうしたい?
483452:2009/01/10(土) 00:31:08
(1) フィルターの条件はデータが1又は0となっているので、1を該当データとしてかけています。
(2) フィルターをかけた後は可視セルを対象に、「A列の各コード(3桁)を取得したい。」
おおよそ、20〜50件程が該当データになります。
取得した後の配列から、その各要素を取り出すことは自分でできると思います。
随分以前ですがやったことはありますので。

484デフォルトの名無しさん:2009/01/10(土) 01:11:17
>>483
1か0か判定するだけなら、わざわざオートフィルタ使わなくてもForループで順に見てけばいいんでない?
要素数も大して多くないんだし。とりあえず…

B列が1の物だけをオートフィルタで抽出
Range("A1").AutoFilter Field:=2, Criteria1:="=1"

A列の可視セルの内容をすべて書き出す
For Each c In Range("A1").CurrentRegion.Columns(1).SpecialCells(xlCellTypeVisible).Cells
  Debug.Print c.Value
Next
485デフォルトの名無しさん:2009/01/10(土) 08:15:13
VBAを用いてプリンタに印刷させようと考えています。
それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。
例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。
486デフォルトの名無しさん:2009/01/10(土) 09:20:27
>>485
出来るよ
手動でトレイの選択などが出来る状態なら
その辺の制御をするドライバやAPIは入ってるわけだから
それをプログラムから叩けば良いだけ

でもそれはVBAではなくVBの分野(>>1参照)
印刷対象がExcelのシートだろうと、プリンタのハード的制御はExcel関係ないのでスレ違い
487452:2009/01/10(土) 10:10:00
>>484
おかげで、所期目的が達成できました。サンクス。
488デフォルトの名無しさん:2009/01/10(土) 11:09:59
>>485
>それ自体はPrintOutメソッドを使えばできると思っているのですが、・・・

484氏の回答を得て、機嫌がいいので (~_~);
そうゆう設定は、PrintOutメソッドでは出来ない。
それで、vbaとしての回答は、印刷ダイアログボックスを呼び出して、選択することになる。
Application.Dialogs(xlDialogPrint).Show

但し、excel4マクロ(vbaではない扱いをされている)の世界だとどうだか知らない。
(xpでは見ていないが、97(たぶん?)と)2007ではマクロの記録で、また、
excel4マクロが記述されている。が、これは、触らない方が無難。
489デフォルトの名無しさん:2009/01/10(土) 11:17:02
xp は2003 の誤記です。
490デフォルトの名無しさん:2009/01/11(日) 16:30:56
↓のようなWindowオブジェクトの用途がよくわかりません。

Dim window1 As Window

workbookでもなくworksheetでもないんですよね??
どなたかご教授お願いします。
491デフォルトの名無しさん:2009/01/11(日) 16:53:34
用途が判らなければ、使わなければいいのでは?
492デフォルトの名無しさん:2009/01/11(日) 17:04:46
>>490
大雑把に説明すると、Windowsというのは画面上に表示された状態の物。
ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。
ブックを開いたらWindowが作られる、みたいに考えておけばいい。
493デフォルトの名無しさん:2009/01/11(日) 17:44:48
>>492
ありがとう。
自分が作るプログラムには特に必要はなさそうです。
自分のPCでは
Set window1 = Workbooks(1) 
でwindow1には”PERSONAL.XLS”が入ります。
勉強になりました。
494デフォルトの名無しさん:2009/01/11(日) 20:05:41
A(伝票番号)B(日付)C(店名)D(金額)
となっていて、C列の店名ごとに並べ替えてあります。
C列の店名が変わるごとに列A〜Dに太線を入れたいので以下のようにしました。

Sub test()
With Range("C1", Range("B65536").End(xlUp)).Offset(, 250)
.Formula = "=IF(C2="""","""",IF(C1<>C2,1,""""))"
.Value = .Value
On Error Resume Next
With Intersect(.SpecialCells(xlCellTypeConstants) _
.EntireRow, Range("A:D")).Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
End With
On Error GoTo 0
.ClearContents
End With
End Sub

これだとデータが1件(1行分)しかない場合線が引けません。
データが1件でも区切り線が引かれるようにするには
どのようにすれば良いですか?
495デフォルトの名無しさん:2009/01/11(日) 20:24:15
>>494
努力だけは認めるが、無駄が多すぎる。
店名が同じかどうか判定するのに、わざわざワークシート関数なんか使わなくてもVBAだけでやればいいだろうに。
Sub test()
  r = 2
  While Cells(r, 3) <> ""
    If Cells(r, 3) <> Cells(r - 1, 3) Then
      With Range(Cells(r, 1), Cells(r, 4)).Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThick
      End With
    End If
    r = r + 1
  Wend
End Sub
496デフォルトの名無しさん:2009/01/11(日) 20:37:40
>>495
考えすぎたみたいです。解決しました。
ありがとうございましたm(_ _)m
497デフォルトの名無しさん:2009/01/11(日) 20:43:27
>>494
オレの知らないテクニック満載で何やってんのか理解できねえ
498デフォルトの名無しさん:2009/01/11(日) 20:46:09
すみませんw
499デフォルトの名無しさん:2009/01/12(月) 07:19:54
2007の質問ですー
図形の操作がらみが「マクロの記録」に残らないんですが
以前のバージョンのように記録させる方法ないでしょうか?
500デフォルトの名無しさん:2009/01/12(月) 08:23:04
>>499
ない
501デフォルトの名無しさん:2009/01/12(月) 17:55:50
初歩的な質問で申し訳ありません。教えていただけますでしょうか。

下図@のように、クラスと番号と氏名が入力されているファイルがあります。
下図Aのように、クラスと番号のみが入力されているファイルがあります。
クラスと番号の2つをキーに、図@からAに氏名をとってきたいのですが、
どのようにしたら良いでしょうか。
キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。
宜しくお願いします。

図@            図A
クラス 番号 氏名     クラス 番号
1   1  相沢      1   1
1   2  加藤      1   2
1   3  佐藤      2   1
1   4  館山      2   2
2   1  安西      2   3
2   2  木村      
2   3  工藤
502デフォルトの名無しさん:2009/01/12(月) 17:57:54
Excel総合相談所 76
http://pc11.2ch.net/test/read.cgi/bsoft/1228655230/942

942 名前:名無しさん@そうだ選挙にいこう[] 投稿日:2009/01/12(月) 17:51:11
【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 いいえ
【4 VBAでの回答の可否】 可
【5 検索キーワード     】 VLOOKUP 値の取り出し

下図@のように、クラスと番号と氏名が入力されているファイルがあります。
下図Aのように、クラスと番号のみが入力されているファイルがあります。
クラスと番号の2つをキーに、図@からAに氏名をとってきたいのですが、
どのようにしたら良いでしょうか。
キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。
宜しくお願いします。

図@            図A
クラス 番号 氏名     クラス 番号
1   1  相沢     1   1
1   2  加藤     1   2
1   3  佐藤     2   1
1   4  館山     2   2
2   1  安西     2   3
2   2  木村      
2   3  工藤

503デフォルトの名無しさん:2009/01/12(月) 21:11:53
こんなスレにホイホイ質問して良かったのか?
俺はマルチポストでも構わず答えちまう男なんだぜ。

俺なら、どっかのセルにクラスと番号を結合させた物を作る。
cells(i,1).value & "-" & cells(i,2).value をforでまわしてどっかに作る。
図1と図2に同じ処理。
後はfindでsetするなり、好きに料理しろ。
504デフォルトの名無しさん:2009/01/12(月) 21:50:33
実行中のマクロより呼び出すことで、実行を中断しデバッグ可能な状態にする
コマンドはありますか?

マクロの自動記録で試しましたが記録されませんでした。
505デフォルトの名無しさん:2009/01/12(月) 21:58:38
>>504
勘違いかも知れんが、Stopとかブレークポイントの事か?
506デフォルトの名無しさん:2009/01/12(月) 22:28:43
>>505
そうです。
ブックを開いてマクロ実行する運用の中で、
一定の条件が成立した時に止めたいのですが、
ブックを開く度にブレークポイントを手動で設定するのは
現実的ではないのでブレークポイントはちょっとNGと思ってます。
イメージとしては以下のような感じです。

if xxxxx then
application.stop ← ここで止めたい
end if

ブレークポイントをマクロより動的に設定できるか、
ブックに保存できる方法でも助かります。
507デフォルトの名無しさん:2009/01/12(月) 22:30:16
>>506
errとerr.number使えばいいんじゃねーの?
508デフォルトの名無しさん:2009/01/12(月) 22:34:30
MsgBoxやInputBox出せばそこで止まるぞ
止まったらEsc押すといい
509デフォルトの名無しさん:2009/01/12(月) 22:37:15
>>508はダメだった、すまね
510デフォルトの名無しさん:2009/01/12(月) 22:53:25
じゃあSTOPでいいんじゃね?
止まったところでイミディエイトウィンドウで変数の内容を見たり書き換えたり自由にできる。

実行再開はCONT (嘘)
511デフォルトの名無しさん:2009/01/12(月) 22:58:17
SendKeys "{Break}"

ごめん嘘
512デフォルトの名無しさん:2009/01/13(火) 01:58:50
debug.assert false じゃダメなん?
513505:2009/01/13(火) 17:18:25
>>506
そのままでいいじゃん
for i=1 to 5
514505:2009/01/13(火) 17:20:27
>>506
途中で送信してしまった

for i=1 to 5
  if i=3 then
    stop
  endif
next i

みたいに。
515デフォルトの名無しさん:2009/01/13(火) 20:24:40
単に止めるだけなら
for i=1 to 5
  if i=3 then stop
next i
って書く。
516デフォルトの名無しさん:2009/01/13(火) 21:12:47
俺は処理が1行でもThenの後ろには書かない
もちろん、If ... Then ... else ...もやらない
517デフォルトの名無しさん:2009/01/13(火) 21:36:38
>>514
>>515
ありがとうございました。
stopで止まりました。
518デフォルトの名無しさん:2009/01/13(火) 21:51:33
>>516
すいません
そのわけを教えてください
519デフォルトの名無しさん:2009/01/13(火) 22:15:21
クラスモジュールについてドップリ勉強できる書籍はないだろうか?
520デフォルトの名無しさん:2009/01/13(火) 22:39:31
勉強するほどのものじゃないんじゃ
521デフォルトの名無しさん:2009/01/13(火) 22:54:17
IPアドレスを
123.456.789.10
からx番目のIPアドレスを求めるような
EXCEL関数かVB関数を探してるのですが、
そんな便利なものありませんか?
522デフォルトの名無しさん:2009/01/13(火) 23:17:28
x番目って何よ?
523デフォルトの名無しさん:2009/01/13(火) 23:23:36
Split("123.456.789.10", ".")(x)でいいんじゃねーの
524デフォルトの名無しさん:2009/01/13(火) 23:25:33
>>522
すみません。
123.254.90.10から
1番目は、123.254.90.11
2番目は、123.254.90.12、

という意味です。
上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。
失礼しました。。。。
525デフォルトの名無しさん:2009/01/13(火) 23:28:29
単なる足し算じゃね
526デフォルトの名無しさん:2009/01/14(水) 00:02:10
うーん
Sub test()
  For x = 1 To 10
    A = Split("169.254.100.10", ".")
    A(3) = A(3) + x
    Debug.Print Join(A, ".")
  Next
End Sub
527デフォルトの名無しさん:2009/01/14(水) 01:48:01
123.254.90.256とかやりそうな奴だな
528デフォルトの名無しさん:2009/01/14(水) 20:38:53
123.54.90.999 とかやってくれたら笑えるんだけど
529デフォルトの名無しさん:2009/01/15(木) 00:29:42
OSはXP
EXCELは2003です。

1.EXCEL上に別のEXCELシートを開くハイパーリンクを貼る
2.リンク先のシートが開くと同時に

Private Sub Workbook_Open()
Workbooks("Book1").Close
End Sub

みたいな感じで処理を走らせ、リンクで開いたシート自体を閉じる

のような処理を入れるとシートが閉じられた後、EXCELがおかしくなります。
アクティブになっているEXCELシート以外のシートがアクティブにできないし、
新たに別のシートも開けなくなります。

ハイパーリンクとリンク先のシートを閉じる処理って同時には行えないんですかね?
530デフォルトの名無しさん:2009/01/15(木) 01:01:19
>>529
イベント処理中でブックを閉じると実行中のインスタンスが開放されて暴走するんだっけ、
なんかそんなのがあったような気がする。
531デフォルトの名無しさん:2009/01/15(木) 03:44:25
開く方に
Book1閉じるって書くしかないんじゃね
532デフォルトの名無しさん:2009/01/15(木) 04:02:02
マクロ専用のブックを1つ用意して、それは閉じないようにするとか
533デフォルトの名無しさん:2009/01/15(木) 18:17:44
すみません。質問させて下さい。

Excel2002のシートにラベルコントロールを貼付けました。
それをクリックすると、マウスカーソルがコントロールから離れるまで
コントロール全体のサイズが若干大きくなってしまいます。
これは仕様でしょうか?
もし対処方がありましたら、御教示下さい。
534デフォルトの名無しさん:2009/01/15(木) 18:20:29
>>533
フォーカス位置を示す点線で囲まれた状態のことを言ってんなら、それは仕様
535デフォルトの名無しさん:2009/01/15(木) 18:37:33
>>534
回答ありがとうございます。

ラベルのキャプションのテキストのサイズも変化するので、
フォーカスの点線ではないと思われます。

キャプションのテキストは通常状態ですと文字が滲んでおり、
クリックしてラベル全体が大きくなると文字がハッキリすることから、
ラベルをクリックしたときのサイズが正しいような気がします。
536デフォルトの名無しさん:2009/01/15(木) 19:37:27
質問です。

book1をアクティブにした状態のまま、book2の特定のセルに書き込みをしたいのです。
で、

Windows("book2.xls").Cells(1, 2) = 1

とやったのですが、エラーが出ます。
正しくはどうやればいいのでしょうか?
537デフォルトの名無しさん:2009/01/15(木) 22:06:50
× ブック.セル = 値
○ ブック.シート.セル = 値
538デフォルトの名無しさん:2009/01/16(金) 18:33:12
すいません質問です。
VBAを使い年賀状を作成しなければならないのですが まず何からどうしたらよいかさえわかりませんm(_ _)m
お願いします。汗
539デフォルトの名無しさん:2009/01/16(金) 18:40:34
まずは作成しなければならない状況に陥らせた人に聞くべきだろう
540デフォルトの名無しさん:2009/01/16(金) 18:48:41
マクロ記録しながらシートで作ればいいよ
541デフォルトの名無しさん:2009/01/16(金) 19:00:27
この時期だと年賀状じゃなくて寒中見舞いだぞ
542536:2009/01/16(金) 19:27:50
>>537
レスありがとうございます。

さっそくやってみました。

Windows("book1.xls").Sheets("Sheet1").Cells(1, 2) = 1

とやったのですが、やはりエラーが出ます。
なぜなのか、さっぱりわかりません。
しつこいようですが、教えて下さい<(_ _)>
543デフォルトの名無しさん:2009/01/16(金) 20:03:41
ちょっとはぐぐれよ。オブジェクト名やメソッド名がおかしいだろ。

Sub test()
  Workbooks("book1.xls").Activate
  Workbooks("book2.xls").Worksheets("Sheet1").Cells(2, 1) = 1
End Sub
544デフォルトの名無しさん:2009/01/16(金) 23:03:00
Excel 2000ですがマクロのステップ数が大きくなると、
ブックのファイルサイズがMB単位で肥大化して困ってますが、
皆さんどうしてますか?
545デフォルトの名無しさん:2009/01/16(金) 23:17:27
そんな現象おきないのでどうもしてないが
546デフォルトの名無しさん:2009/01/16(金) 23:24:57
どんだけ巨大なマクロを作ってるんだか。
ワークシートを操作するマクロを何度も走らせるとファイルが太る可能性はあるが、
それならシートの再構築でダイエットできるかもしれない。
547デフォルトの名無しさん:2009/01/16(金) 23:27:09
以下の構成で、hogeよりfugaにあるクラスを生成(new)しようとすると、
「ユーザ定義型は定義さていません」エラーとなります。
クラスでないモジュールの場合はそのまま呼び出せてます。
名前空間の問題と思われますが解決方法はありますでしょうか?

hoge.xls → fuga.xla(参照設定)
548デフォルトの名無しさん:2009/01/16(金) 23:31:21
>>546
マクロは相当な量です。
再構築は以前試した時は多少は改善しました。
でも、まっさらなブックにマクロのみ貼り付けても、
それ以上は小さくならなかったのでコレが限界かと。
549デフォルトの名無しさん:2009/01/16(金) 23:32:49
>>543
おおおおお、ありがとうございました!!
550デフォルトの名無しさん:2009/01/16(金) 23:34:08
Variant型をできるだけ使わないようにするとか
551デフォルトの名無しさん:2009/01/17(土) 00:30:00
552デフォルトの名無しさん:2009/01/17(土) 10:08:15
シートをそれぞれ別ブックに保存する方法教えて。
保存名はシートの名前で。
553デフォルトの名無しさん:2009/01/17(土) 11:38:51
それを手動でやる方法すら思いつかないの?
思いつくならそれをマクロの記録で録ることすら
思いつかないの?馬鹿なの?死ぬの?
554デフォルトの名無しさん:2009/01/17(土) 11:44:17
>>552
ワークシートコレクションに対するループの中で
(1) シートが1枚のブックを新規作成
(2) そこへシートをコピペ
(3) 名前を付けて保存
(4) 新規ブックを閉じる
を繰り返す

とりあえず>>1の★5の理由によりまずは自分で作ってみれ。方法は★6で。
555デフォルトの名無しさん:2009/01/17(土) 13:44:33
>>551
ありがとうござました。
しかし各クラスごとに生成用のメソッドが必要とは...
これがなければ理想的なんですが。
556デフォルトの名無しさん:2009/01/17(土) 17:44:47
>>555
オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。
というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。
557デフォルトの名無しさん:2009/01/17(土) 17:49:40
>>556
おまい判ってない。
↓ではコンストラクタでなはく生成用のグローバルなメソッドを
クラスの外に定義しろっていってんだよ。
オブジェクト指向以前の問題。

ttp://support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
558デフォルトの名無しさん:2009/01/17(土) 18:00:01
シートの表示倍率の値は取得できます?
559デフォルトの名無しさん:2009/01/17(土) 18:44:18
>>556
Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから
外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。
560デフォルトの名無しさん:2009/01/17(土) 19:30:45
Withっていいな。Withでネストしまくったコード見ると癒される。
561デフォルトの名無しさん:2009/01/17(土) 20:43:17
>>558
出来ますよ
562デフォルトの名無しさん:2009/01/18(日) 11:40:34
すみません、質問です。
エクセル2003のVBAについてです。

フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの)
の貼りつけることってできるのでしょうか?
563デフォルトの名無しさん:2009/01/18(日) 12:15:21
>>562
ググれカス
http://q.hatena.ne.jp/1148568634

これで良い?
564デフォルトの名無しさん:2009/01/18(日) 13:52:10
withを使った方が処理の速度は速くなりますか?
565デフォルトの名無しさん:2009/01/18(日) 13:54:43
はい
566デフォルトの名無しさん:2009/01/18(日) 13:59:02
EXCEL2003です。
VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、
その後シート全体をセルの選択が出来ない形で保護する
つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、
ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。

ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、
何故上のような画面が出来てしまうのでしょうか?
567デフォルトの名無しさん:2009/01/18(日) 14:34:48
> 何故上のような画面が出来てしまうのでしょうか?
保護により選択出来ないセル上で行ったクリック動作は
現在選択状態にあるセル上で行ったものとして扱われる
故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる

君の要望を実現するには、セル上のハイパーリンクではなく、
ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな
まあガンバレ
568デフォルトの名無しさん:2009/01/18(日) 15:07:11
うん!僕がんばるよぉぉぉおおお!!
569デフォルトの名無しさん:2009/01/18(日) 16:35:58
WindowsXP上でEXCEL2003を使用してます。

フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、
マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと
シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…)

マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が
可能になる方法はあるのでしょうか?

よろしくおねがいします
570デフォルトの名無しさん:2009/01/18(日) 17:58:08
>>569
VBEのウィンドウを最大化しなければいい
571デフォルトの名無しさん:2009/01/18(日) 18:31:58
>>569
普通に見れるだろ
572デフォルトの名無しさん:2009/01/18(日) 19:46:29
マクロを手動で実行ではなく、
(例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう?

解説サイト見てもブック起動時実行ってのばかりしか見つからない…
573569:2009/01/18(日) 19:48:39
もう少し作成しているマクロを説明すると、

・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される)
・フォームに入力した内容が反映されるのはsheet2・sheet3

で、
・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない
・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない

という状態です。

>>570
VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。

>>571
マクロがsheet1を編集しているなら普通に見れるとは思いますが、
編集しているのは背面にある他のシートなので…
574デフォルトの名無しさん:2009/01/18(日) 19:48:44
>>572
ワークシート関数と同じ感覚?
それならSelectionChangeで出来る。
シートごとに設定しないといかんけどね。
575デフォルトの名無しさん:2009/01/18(日) 20:11:43
>>569,573
Modelessで呼べば良いだけでは?

>>574
SelectionChangeではなくChangeだろ
SelectionChangeは選択セルが変更されたとき
Changeはセルの値が変更(入力、削除など)されたとき

それと対象セルと処理内容が同じならシート毎に設定する必要も無い
ブック単位、あるいは全ブックを対象に一括処理する方法もある
576デフォルトの名無しさん:2009/01/18(日) 20:20:07
>>575
vbModelessを付けてフォームを開いたところ上手くいきました、
ありがとうございます。
577デフォルトの名無しさん:2009/01/18(日) 21:34:00
>>574
多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない
578デフォルトの名無しさん:2009/01/18(日) 21:36:51
>>577
ヒント
Workbook_SheetChange
Application.EnableEvents = False
579教えてください:2009/01/20(火) 00:51:55
質問です。初心者です。
複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。
msgbox "5"までは表示されるので、次の行がおかしいのだと思います。
「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。
なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。
1行前はrangeの親オブジェクトを記述しても問題ないのに・・・
本当に困っています。よろしくお願いします。

580教えてください:2009/01/20(火) 00:52:34

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False

Dim motobookspath As Variant
Dim motobookpath As Variant
Dim 先ブック入力済み最終行番号 As Long
Dim データ貼り付け開始行番号 As Long
Dim sakirange As Range
Dim motorange As Range
Dim motobook As Workbook
Dim motosheet As Worksheet
Dim 入力済み最終行番号 As Long

motobookspath = Application.GetOpenFilename(filefilter:="Exclブック,*.xls", MultiSelect:=True)
MsgBox "1"

581教えてください:2009/01/20(火) 00:53:00

For Each motobookpath In motobookspath
先ブック入力済み最終行番号 = ThisWorkbook.Worksheets("データ").Range("i1").End(xlDown).Row
データ貼り付け開始行番号 = 先ブック入力済み最終行番号 + 1
MsgBox "2"

Set sakirange = ThisWorkbook.Worksheets("データ").Cells(データ貼り付け開始行番号, 1)
MsgBox "3"

Set motobook = Workbooks.Open(Filename:=motobookpath)
Set motosheet = motobook.Worksheets("データ")
MsgBox "4"

入力済み最終行番号 = motosheet.Range("i1").End(xlDown).Row
MsgBox "5"
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

motorange.Copy Destination:=sakirange
motobook.Close savechanges:=True
Next

Application.ScreenUpdating = ture

End Sub
582デフォルトの名無しさん:2009/01/20(火) 01:06:50
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))
583デフォルトの名無しさん:2009/01/20(火) 06:51:42
巷ではこういうコードが普通にあんのかね。
584デフォルトの名無しさん:2009/01/20(火) 11:38:28
誰もがプログラミングの専門家じゃないからね。
入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。
585デフォルトの名無しさん:2009/01/20(火) 19:28:45
超初心者で申し訳ありませんが・・・
エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。

(エクセル) 
      123,鈴木
      1013,田中
(出力) 番号,名前
     0123,鈴木
     1013,田中

自分で作ってみたところ、下記のように文字列になってしまいます。
(出力) ”番号”,”名前”
     ”0123”,”鈴木”
     ”1013”,”田中”

となってしまいます。
どのようにすれば良いのでしょうか。
よろしくお願い致します。
586579:2009/01/20(火) 21:14:18
>>582
うぉー!! ありがとうございます!!!!
2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて
しまっていたのですね。
でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。

>>583
もっと違った記述方法があるんですかね?教えてください。
587デフォルトの名無しさん:2009/01/20(火) 21:48:51
>>585
どんなプログラムを作ったの?
588デフォルトの名無しさん:2009/01/20(火) 22:07:54
>>579
まず変数名に日本語を使うところからダメだわ。
589デフォルトの名無しさん:2009/01/20(火) 22:14:47
>>588
それは場合によりけりだな
590デフォルトの名無しさん:2009/01/20(火) 22:21:17
場合というか,使われ方とか規模とか書く人とかによるな
どちらかに決めて使い分けはしない
591デフォルトの名無しさん:2009/01/21(水) 00:29:10
俺も変数名に日本語使うの抵抗あるけど
日本語使うとコードが分りやすくなるような気もするから
使おうかなとも思うけど…
でも抵抗あるんだよなー
592デフォルトの名無しさん:2009/01/21(水) 00:39:52
英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、
ローマ字で書くのは嫌いだから日本語で書いちゃう
593デフォルトの名無しさん:2009/01/21(水) 01:02:53
>>592
確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな
594デフォルトの名無しさん:2009/01/21(水) 05:44:10
ActiveXコントロールのテキストボックスをワークシート上で使う場合、
Heightを文字の大きさの2倍以上にしないと、文字が崩れますが
解決法はありますか?
595デフォルトの名無しさん:2009/01/21(水) 07:15:08
日本語は入力が面倒臭いのが難点。
596デフォルトの名無しさん:2009/01/21(水) 20:02:04
Excel2003にて、インターネット上からXMLを取得して利用するツールをつくって
いるところなのですが、文字化けを起こします。

Dim get_xml As Object
Set get_xml = CreateObject("MSXML2.DOMDocument.3.0")
get_xml.async = False
get_xml.Load (src_url)

抜粋するとこのようなコードです。
このときに、 ‖ この文字だけが、半角?に変換されてしまいます。get_xml.Load
した直後で既に?に変わってしまっているのですが、どうすれば解消するでしょうか?
取得するxmlはUTF-8で、IE等のブラウザから見ると正常に‖と見えます。
よろしくおねがいします。
597デフォルトの名無しさん:2009/01/21(水) 20:23:54
>>596
>>1★3,★4
598デフォルトの名無しさん:2009/01/21(水) 22:56:21
>>597

失礼しました。。。
599デフォルトの名無しさん:2009/01/22(木) 17:46:03
日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。
送り仮名が入ると面倒だよね。
あとは、変数名一覧表を作っておく事が絶対条件かも・・・。
600デフォルトの名無しさん:2009/01/22(木) 18:10:08
>>599
Option Explicitは必須だね。
なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。
601デフォルトの名無しさん:2009/01/22(木) 19:03:30
質問です。宜しくお願いします

セルA1には、「8:00」がはいっているとして、

Option Explicit

Sub test1()
UserForm1.TextBox1 = Range("a1").Value
UserForm1.Show
End Sub

これで、テキストボックスに「0.33333333」じゃなく、
きちんと時刻を表示させるにはどうすればよいですか。
602デフォルトの名無しさん:2009/01/22(木) 19:27:06
右辺をRange("A1").TextとかFormat$(range("A1").Value,"h:mm") など。
TextはA列のセル幅が狭いと##とかなるけど。
603質問です:2009/01/22(木) 20:03:19

Sub test()

Cells(1, 1).Activate
Do Until ActiveCell = ""
入力値 = ActiveCell
If 入力値 Like "*[C,CX*,O,OX*,O2,O2X*,Fe]" = True Then
If 入力値 Like "*[O,OX*]" = True Then
If 入力値 Like "*O" = True Then
処理 = 1
ElseIf 入力値 Like "*X2" = True Then
処理 = 2
End If
ElseIf 入力値 Like "*[Fe,Fe*]" = True Then
If 入力値 Like "*Fe" = True Then
処理 = 3
ElseIf 入力値 Like "*X2" = True Then
処理 = 4
End If
Else
If 入力値 Like "*[O2,C]" = True Then
処理 = 5
ElseIf 入力値 Like "*X2" = True Then
処理 = 6
End If
End If
604質問です:2009/01/22(木) 20:04:18
ElseIf 入力値 = "*[Au,AuX*,Ag,AgX*,Pt,PtX*,Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au,AuX*,Ag,AgX*,Pt,PtX*]" = True Then
If 入力値 Like "*[Au,Ag,Pt,]" = True Then
処理 = 7
ElseIf 入力値 Like "*X2" = True Then
処理 = 8
End If
ElseIf 入力値 Like "*[Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au1,Ag1,Pt1]" = True Then
処理 = 9
ElseIf 入力値 Like "*X2" = True Then
処理 = 10
End If
Else
処理 = 11
End If
Else
処理 = 12
End If
ActiveCell.Offset(0, 1).Activate
ActiveCell = 処理
ActiveCell.Offset(1, -1).Activate
Loop
End Sub

どうも分岐がうまくいかないのですが。
605質問です:2009/01/22(木) 20:05:07
以下、その処理文字列です。
対象に[*]があることで違う分岐を選んでいそうですが、
ほかのものも予想外の分岐をするのですがなぜでしょうか。
(説明が下手ですいません)
J0015-1*2
J0015-2*2
J0235-2PtAuX10
H0053-1PtX2
H0036-2C
H0037-1CX2
J0004-1*2-O
J0004-1*3-O1X2
J0004-1*3-OX2
H0053-1Pt1X2
606デフォルトの名無しさん:2009/01/22(木) 21:16:29
NAMAE = Cells(1, 1)
KUMI = Cells(2, 1)
If NAMAE = "" Then
NAMAE = "*"
End If
If KUMI = "" Then
KUMI = "*"
End If

row1 = 3

Do While Cells(row1, 1).Value = ""
Set aaa = Cells(row1, 2).Find(What:=NAMAE, LookAt:=xlPart)

Set bbb = Cells(row1, 3).Find(What:=KUMI, LookAt:=xlPart)

If Not aaa Is Nothing And Not bbb Is Nothing Then
'条件が合ったときの処理
End If
row1 = row1 + 1
Loop

変数のNAMAEとKUMIを検索項目にして目当ての行を見付けるプログラムを作ってます。
例えばNAMAEに入力があればKUMIがスペースでもNAMAEが一致する行をすべて検索できるようにしたいのですが、
上のようにすると検索対象の一覧の中で名前(row1, 2)が一致しているのに、組(row1, 3)がスペースの行が検索に引っかかりません。
一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう?
質問がわかりにくいとは思いますがお願いします。
607606:2009/01/22(木) 21:23:56
すいませんまちがえました。

上の
Do While Cells(row1, 1).Value = ""   



Do While Cells(row1, 1).Value <> ""
の間違えでした。
608デフォルトの名無しさん:2009/01/22(木) 22:23:09
読む気になれない・・・。
609606:2009/01/22(木) 23:37:24
すいません。
最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。
610デフォルトの名無しさん:2009/01/23(金) 00:05:26
特定のEXCELシートが開いている時にはそのシートを閉じ、
開いていなければ何もしないという処理って可能ですか?
611デフォルトの名無しさん:2009/01/23(金) 00:08:50
>>610
ブックじゃなくてシート?
612デフォルトの名無しさん:2009/01/23(金) 00:28:23
>>610
ブックなら可能
やりかたは自分で調べろ
613610:2009/01/23(金) 00:29:16
>>611
間違えました。
シートではなくブックです。
失礼しました。
614デフォルトの名無しさん:2009/01/23(金) 01:04:27
>>613
Workbooks( ).Close
615610:2009/01/23(金) 01:16:51
>>614
それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。
616603: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デフォルトの名無しさん:2009/01/23(金) 01:25:39
>>615
Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け
618デフォルトの名無しさん:2009/01/23(金) 01:37:15
XP SP3 Excel 2002 SP3

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

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

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

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

宜しくお願いします。
619デフォルトの名無しさん:2009/01/23(金) 01:47:47
>>616
色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png
620デフォルトの名無しさん:2009/01/23(金) 01:54:13
>>618
該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。
621618:2009/01/23(金) 02:06:26
>>620

有難う御座います。

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

長いこと調べていたんで、これですっきりしました。
622デフォルトの名無しさん:2009/01/23(金) 02:11:43
>>619
そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。
623デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/23(金) 02:19:54
>>622
こうなったらRightとInstrで1個ずつ調べるしかないと思う
625デフォルトの名無しさん:2009/01/23(金) 02:25:34
>>619
たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?
626デフォルトの名無しさん:2009/01/23(金) 02:26:37
>>623
なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな
627デフォルトの名無しさん:2009/01/23(金) 02:28:49
>>617
ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。
628デフォルトの名無しさん:2009/01/23(金) 02:33:57
>>625
>>626
そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。

長いコードを書くことが確定した。
629623:2009/01/23(金) 02:40:06
>>626,>>628
OfficeTANAKAかな?

まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物
630デフォルトの名無しさん:2009/01/23(金) 02:51:41
>>615
プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ

on error resume next
workbooks("B.xls").close
on error goto 0
631デフォルトの名無しさん:2009/01/23(金) 04:24:46
出来るなら
一度保存して閉じるけど
632デフォルトの名無しさん:2009/01/23(金) 04:26:53
そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。
633デフォルトの名無しさん:2009/01/23(金) 04:46:04
もし
開いていたら
閉じる
634デフォルトの名無しさん:2009/01/23(金) 09:08:26
>>602
ありがとうございます
635デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/24(土) 21:32:44
>>610
開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close
637デフォルトの名無しさん:2009/01/24(土) 21:39:01
>>635
年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す
638デフォルトの名無しさん:2009/01/24(土) 21:43:34
>>636
全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。

どの方法を使うかはケースバイケースだ。
639デフォルトの名無しさん:2009/01/24(土) 21:58:53
>>637
地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。
640デフォルトの名無しさん:2009/01/24(土) 22:06:36
>>639
ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。
641630:2009/01/24(土) 22:09:05
>>638
>エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる

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

Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?
642635:2009/01/24(土) 22:15:04
>>640
639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。

現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
643デフォルトの名無しさん:2009/01/24(土) 22:19:03
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ
644デフォルトの名無しさん:2009/01/24(土) 22:22:37
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな
書式の問題かもしれないし
645デフォルトの名無しさん: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デフォルトの名無しさん: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
647635:2009/01/25(日) 07:49:29
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。
648デフォルトの名無しさん:2009/01/25(日) 17:56:18
Open ファイル名 For 開き方 As #ファイル番号

というコマンドの「#」の意味を調べてみたんですが
言及されてなくてわかりません。
この#にはどんな意味があるのでしょうか?
649デフォルトの名無しさん:2009/01/25(日) 18:08:33
あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?
650デフォルトの名無しさん:2009/01/25(日) 18:25:52
>>648
「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。
651デフォルトの名無しさん:2009/01/25(日) 18:55:24
>>649
Workbook_WindowActivate
652デフォルトの名無しさん:2009/01/25(日) 19:04:08
>>650
ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。

>>649
そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。
653デフォルトの名無しさん:2009/01/25(日) 19:08:00
開くときではなくアクティブにしたときでしょ?
654652:2009/01/25(日) 19:12:30
確かに。読み間違えました。
どうもすみません。
655デフォルトの名無しさん:2009/01/25(日) 19:40:49
>>651
ありがとうございます。

もう一つ質問です。

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

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

のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?
656デフォルトの名無しさん:2009/01/25(日) 20:29:26
そもそも、ちょっと考えてみれば当然のことだが
アクティブじゃないシートにはアクティブなセルなど存在しない

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

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

というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
657デフォルトの名無しさん:2009/01/25(日) 21:02:48
うぜーよ
658デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/25(日) 23:36:15
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"
661デフォルトの名無しさん:2009/01/25(日) 23:51:02
>>656
丁寧にありがとうございます。

>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。
662デフォルトの名無しさん:2009/01/26(月) 16:18:41
ActiveとSelectを混同してると見た
俺がちょっと前までそうだったから
663デフォルトの名無しさん:2009/01/26(月) 19:12:35
質問です。
データをシステムから取り込んだエクセルファイルなんですが、
セル内の数値の先頭に半角スペースがついてしまいます。
たぶんこれが原因で、数値の大小がおかしくなります。

例えば

変数=20.222
if 変数>10.333 then

これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。
664デフォルトの名無しさん:2009/01/26(月) 19:51:29
>>663
変数="20.222 "
if value(trim(変数)) > 10.333 then
665664:2009/01/26(月) 19:58:01
すまん、ワークシート関数と勘違いしました。
val(trim(変数))
666デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/26(月) 21:00:29
>>663
csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
669デフォルトの名無しさん:2009/01/26(月) 21:04:13
>>667
そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。
670667:2009/01/26(月) 21:10:32
>>669
ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…
671デフォルトの名無しさん:2009/01/26(月) 21:11:18
672デフォルトの名無しさん:2009/01/26(月) 21:14:15
>>668
単純なcsvの読み込みなら、たとえ "  123   " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。
673デフォルトの名無しさん:2009/01/26(月) 21:17:18
>>670
そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。
674デフォルトの名無しさん:2009/01/26(月) 21:18:21
664-666
ありがとうございます。
明日試してみます。
675デフォルトの名無しさん:2009/01/26(月) 21:23:52
>>670
10億回程度のループならそんなに多いとは思わんけどな。

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

あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。
676デフォルトの名無しさん:2009/01/26(月) 21:26:21
675の言うことには耳を貸さないのが吉
677667:2009/01/26(月) 21:43:17
いろいろアドバイスありがとうございます。
すいません統計などと洒落たことを言ってしまいましたが、
プログラム自体はパチスロ機のシミュレータです。
自分ひとりでつかうならいいんですが、
プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。
そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、
うまいこと作り直す時間も知識もありません…。
同じ課でたまたまプログラムの知識があった私が任されています…
ので同じ課にはわかる人はいません…。
もちろん実機担当に質問はできますが、手一杯だとは思います…。

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

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

ただ、環境(CPU)による違いがなかったので質問した次第です。
気遣いありがとうございました。
678デフォルトの名無しさん:2009/01/26(月) 22:31:23
会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz
で逆に遅くなるってのは悲しいな
結局クロックが全てか
てか
実機担当って職業プログラマーが居る、その会社は何だろう
気になる
679デフォルトの名無しさん:2009/01/26(月) 22:41:48
パチンコ機屋じゃないの?
680デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/26(月) 23:32:56
質問です。

EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると
ブラウザにもハイパーリンクが表示されるけど
そのブラウザ上のリンクをクリックした時に
Private Sub Workbook_SheetFollowHyperlink
を起動することってやっぱ無理かな?
682デフォルトの名無しさん:2009/01/26(月) 23:38:43
>>680
自宅PCは省電力でクロックダウンしているんじゃないか?
683デフォルトの名無しさん:2009/01/26(月) 23:59:12
>>681
自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。
684デフォルトの名無しさん:2009/01/27(火) 00:37:43
何かにCPUパワーを喰われてるとか
「遅くなった」のが実は0.01秒程度の差だったとか
もし自作ならドライバがちゃんと入ってないとか
685デフォルトの名無しさん:2009/01/27(火) 04:47:10
CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、
よい方法はありませんでしょうか?

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

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

環境:Excel2007

686685:2009/01/27(火) 04:54:33
すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。
どうしたらよいのだろうか
687デフォルトの名無しさん:2009/01/27(火) 05:11:01
>>686
押したボタンのクリックイベントに適当に書くのが普通じゃない?


688デフォルトの名無しさん:2009/01/27(火) 05:23:04
>>685
コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?
689デフォルトの名無しさん:2009/01/27(火) 05:38:13
>>685
「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
  MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub
690デフォルトの名無しさん:2009/01/27(火) 05:43:14
>>688
マクロが登録できるのはフォームコントロールの方だぞ
691デフォルトの名無しさん:2009/01/27(火) 06:11:34
>>686
そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
  Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?
692デフォルトの名無しさん:2009/01/27(火) 07:45:56
>>690
両方出来るぞ
693685:2009/01/27(火) 10:53:06
教えて! Watch Excel VBA Application.caller エラー2023について
http://oshiete1.watch.impress.co.jp/qa4024188.html

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

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

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

>>688
ActiveXの方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・
694685:2009/01/27(火) 10:57:08
URL間違えました。こちらでした。

moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
http://www.moug.net/tech/exvba/0150059.htm
695デフォルトの名無しさん:2009/01/27(火) 16:07:22
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。
696デフォルトの名無しさん:2009/01/27(火) 16:13:46
>>695
いんじゃね
697デフォルトの名無しさん:2009/01/27(火) 16:19:40
ありが十匹!!
698デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/29(木) 09:08:34
>>699
VB初心者スレへどうぞ。
701デフォルトの名無しさん:2009/01/29(木) 11:00:04
>700
すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。
702デフォルトの名無しさん:2009/01/29(木) 12:15:27
>>699
流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ
703デフォルトの名無しさん:2009/01/29(木) 14:29:53
超初心者です。

何個か開いたファイルの中から、特定のファイルを探す。
という単純な事がしたいのですが
ファイル名が例えば「経理ファイル200812.xls」のように、
月によってYYYYMMの部分が変わってしまいます。
開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合
どのようにすればよいでしょうか。
ワイルドカードが使えないかと思ってやってみているのですが
よろしくお願いします。
704デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/29(木) 15:53:30
>>704

できました!!
ありがとうございました。
706デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/29(木) 18:57:21
>>706
最初に見つけた位置のhを保存しといてそこに入れていく
708707:2009/01/29(木) 19:00:08
違ったな
「Deleteしたときはhをインクリメントしない」かな?
709デフォルトの名無しさん:2009/01/29(木) 19:45:32
End Ifの前にh = h - 1で解決しました
ありがとうございます
710デフォルトの名無しさん:2009/01/29(木) 23:41:33
>>701
頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。
711デフォルトの名無しさん:2009/01/29(木) 23:59:42
OS XP
EXCEL2003

dteProductDay=format(date,゙yyyy/m/d゙)
cells(1,1)=dteProductDay
というように、システムの日付を整形してセルに表示させたいのですが、
フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。
712デフォルトの名無しさん:2009/01/30(金) 00:09:19
>>711
書式を変えるか、または文字列で
713デフォルトの名無しさん:2009/01/30(金) 02:12:09
>>711
的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。

たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。
714デフォルトの名無しさん:2009/01/30(金) 12:23:35
OS-XP
Office2003

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

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

キーボードでなら、たとえば上に移動したい場合
ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。
715711:2009/01/30(金) 20:50:12
>>712-713
ありがとん

cells(1,1)= "'" & dteProductDayでうまくいきました。
7167777:2009/01/30(金) 22:31:30
エクセルでシート1で例えばF団体をA列の1で書いてそれを
シート3のD列の3に自動記入させるマクロは分かるんだけど

シート1でF団体がA列の1以外になっても自動記入できるマクロある?
あるなら教えて
717デフォルトの名無しさん:2009/01/30(金) 23:07:32
日本語で質問できない人お断り
718デフォルトの名無しさん:2009/01/30(金) 23:08:56
>>716
Private Sub Worksheet_Change(ByVal Target As Range)
                        ~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる
7197777:2009/01/30(金) 23:13:26
718さん
意味がわかりません
720デフォルトの名無しさん:2009/01/30(金) 23:18:17
日本語読めない人お断り
721デフォルトの名無しさん:2009/01/30(金) 23:31:13
Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1")
みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?
722デフォルトの名無しさん:2009/01/30(金) 23:53:13
F団体ってなんだろ…新しい宗教か?
7237777:2009/01/31(土) 08:51:59
>>721
うん!!そのとおりです
724デフォルトの名無しさん:2009/01/31(土) 09:19:07
>>723
A1とA2の両方に値がある場合はどちらを採用するの?
7257777:2009/01/31(土) 09:52:09
>>724
1月23日 団体名  内容
       F団体
       

このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって
726デフォルトの名無しさん:2009/01/31(土) 10:06:03
>>725
1対1対応ならなんの問題もないでしょう?

それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行
7277777:2009/01/31(土) 10:42:31
A列からD列の10行までの範囲がコピー範囲のときは
どうマクロ組むの?
728デフォルトの名無しさん:2009/01/31(土) 11:15:45
>>727
マクロ記録してみたら?
7297777:2009/01/31(土) 11:34:10
できました!
ありがとうございました。
730デフォルトの名無しさん:2009/01/31(土) 11:39:37
俺が質問を理解できないうちに解決か
731デフォルトの名無しさん:2009/01/31(土) 13:05:52
>>730
VBAを使うやつは問題をミクロにとらえ過ぎている。
もっとマクロなレベルで考えるんだ。
コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?
732デフォルトの名無しさん:2009/01/31(土) 15:18:32
EXCELを使うのは本来はすんごく高度なスキル(=異常な思考様式)が必要
そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、
VBAは最高級のBASICの一つで、これだけでも結構重量物
(VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ
けはやめたほうがいい)
VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作
は遅いはExcelと基本的に合わないわでロクなことないね。
7337777:2009/01/31(土) 15:24:34
いやできてないんだけど
マクロ記録とは?
734デフォルトの名無しさん:2009/01/31(土) 16:13:28
もういいから帰ってくれ!
7357777:2009/01/31(土) 17:09:51
ひどすぎ
736デフォルトの名無しさん:2009/01/31(土) 17:10:34
>>725
マクロの前に日本語を勉強した方が…
でも一応想像してみた

シート1
年月日  団体名  内容
1/23   F団体  陳情
1/26   D団体  年始挨拶
1/27   A団体  予算ヒア
みたいに日付ごとの日報が書いてあって
団体ごとに各シートに抽出したいんじゃないのか?
でもこれだったらわざわざ聞いてこないよな。
737デフォルトの名無しさん:2009/01/31(土) 17:50:16
確かにそれだったらその辺のOL捕まえた方が手っ取り早いな。
738デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/31(土) 20:07:43
Public Property Get TestValue() As String
もしくは
Public Property Let TestValue(ByVal New_Value As Variant)

Getの戻り値の型と、Letの最後の引数の型
つまり、ひとつのプロパティの型は一致させてください
740デフォルトの名無しさん:2009/01/31(土) 21:01:13

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

ありがとうございました。
741デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/02(月) 04:53:09
>>741
ハイパーリンクでは、ブックを非表示で開くことは出来ない
ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう
因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう>>1★5

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

>>743
WorksheetFunction.Sum
中に入る式は、普通にシート上で入力する式と同じだから解るよな?
まあ解らなくてもスレ違いだから自分で調べろってことになるが
745741: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デフォルトの名無しさん:2009/02/03(火) 00:52:18
>>745
作れるよ
ボタンに限らずオブジェクトには配置されてるセルアドレスを返すプロパティがあるから
それが何かくらいは自分で調べようね
747デフォルトの名無しさん:2009/02/03(火) 07:39:03
>>742
Private Sub
Select change
AddItem
748741:2009/02/03(火) 23:43:31
セルを左クリックするとマクロが起動する処理って作れませんかね?
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
というのを使うと目当てのセルをクリックしただけでマクロを起動できるようになったんですけど
エンターを何回か押していたらその目当てのセルまでアクティブが移動してしまって望まないタイミングでマクロが起動されてしまいます。
そうではなくあくまでクリックした時にマクロが起動できるようにしたいんですけど、いい方法ありませんか?
749デフォルトの名無しさん:2009/02/04(水) 00:04:20
>>748
WorkSheetにはクリックイベントがないから、
セルに同じサイズのボタンを貼り付けるぐらいしかないんじゃ
750デフォルトの名無しさん:2009/02/04(水) 00:38:21
ワークブックにWorkbook_SheetBeforeDoubleClickてイベントに有るし
Workbook_SheetBeforeRightClickっていうのも有るし、シート名を取得して実行すれば良いのでは?
751デフォルトの名無しさん:2009/02/04(水) 01:35:00
>>750
普通「クリック」と言えば左シングルクリックのことだろう。
右クリックやダブルクリックイベントでどうしろと。
752デフォルトの名無しさん:2009/02/04(水) 02:43:54
それ言い出すと、>>749
 セルをクリックで処理したいって言ってるのに
 ボタンクリックでどうしろと
ってことになるな。

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

俺の場合、目当てのセルが複数ならダブルクリックイベントで、ひとつならボタンで妥協するかな。
753デフォルトの名無しさん:2009/02/04(水) 02:55:30
ボタンでやってみたけど、色を透明にしておいてもクリックするとなぜか灰色になって
下のセルが見えなくなっちゃうんだな。XPと2003の環境で。
代用案として出すなら、イメージコントロールを貼り付けて透明なGIFを貼った方がよさそう。
754デフォルトの名無しさん:2009/02/04(水) 16:22:39
ボタンの代わりか・・・

つラベル
755デフォルトの名無しさん:2009/02/04(水) 20:43:07
なぜ“左”クソツクなのか。右でいいやん。
756デフォルトの名無しさん:2009/02/04(水) 20:48:34
作った本人が使うんならいいけど、人が使う物なら標準と異なるUIは避けるべきかと
757741:2009/02/04(水) 20:59:06
741です。
皆さん色々とありがとうございました。
とりあえずボタンでやってみようと思いますが、
745でも言ってるように複数張ったボタンの内一つを押した後それに応じたセルを指定する方法が
いまだにわからない状態です。
とりあえずもうちょい調べてみます。
758デフォルトの名無しさん:2009/02/04(水) 21:05:26
>>757
VBAにはコントロール配列が存在しないから、
ボタンをたくさん貼ればボタンの数だけ独立したイベントハンドラが作られる。
だから、ボタンごとに各セルの処理をずらずらっと並べて書けばいい。
冗長だし面倒だけど。

さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。
759デフォルトの名無しさん:2009/02/04(水) 21:30:54
疑似コントロール配列使おうよ
クラスの作り方工夫すれば、疑似コントロール配列にした上で
処理は同じだが対象は違うというようにも出来るし、
そもそもボタンがどのセル上に配置されてるかは取得できるし
760デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/04(水) 22:03:34
Sheets("Sheet2").Range("A1")に入っている値が
Sheets("sheet1")のA列に存在しないとnothingになるけど
762デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/04(水) 23:33:13
Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。
764デフォルトの名無しさん:2009/02/05(木) 00:03:24
質問です。
Dim v(1 To 10) As Long
とするのと
Dim a(1& To 10&) As Long
とするのはどっちがいいですか?
765764:2009/02/05(木) 00:05:42
すいません。
vとaとなりましたが、どっちもvです。
766デフォルトの名無しさん:2009/02/05(木) 00:08:28
Columns("A")もまずいな。
シートモジュールに書いてるかも知らんしな。
ちゃんとシートくらいは指定汁.
767デフォルトの名無しさん:2009/02/05(木) 00:09:34
>>764
この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う
768764:2009/02/05(木) 00:23:21
>>767
そうなんですか。ありがとうございます。
769デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/05(木) 15:33:20
>>769
可能です
773769:2009/02/05(木) 18:35:27
>>772 ご返答ありがとうございます。
もし良かったら何か例文を載せて頂けないでしょうか。
774デフォルトの名無しさん:2009/02/05(木) 19:10:09
フォーム上に配置したWEBブラウザコントロールを印刷したいのですがうまくいきません。
印刷はフォームのPrintFormメソッドを使っています。
コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが
WEBブラウザが配置されているところは空白になってしまいます。

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

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

>>774
>>1★3,4
Excelと直接関係ない汎用コントロールの話はスレ違いです
776デフォルトの名無しさん:2009/02/06(金) 10:08:58
あのさー、何度も言ってるけど>>1はスレの合意じゃないから。
誰かが勝手に書いて、次スレ立てるときにコピペしてるだけ。
気に入らない発言はスルーしろよ。
777デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/06(金) 10:37:42
ちょっとミスった。
>>777の3行目は
Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。
に訂正。
>>771も嘘書いちゃいかん。
ActiveSheetが処理されるとは限らないんだよ。
779デフォルトの名無しさん:2009/02/06(金) 10:42:36
>>776
気に入らない発言はスルーしろよ。
780デフォルトの名無しさん:2009/02/06(金) 10:42:54
フォルダ「A」に
「A」「1」「2」「3」というファイル名のExcelワークシートが4つあります
ファイル「A」のcell(P1:DY1850)の数式をコピーし「1」「2」「3」のcell(P1:DY1850)に自動的に貼り付けていきたいのですが
どのようにすればいいのでしょうか?
よろしくおねがいします
781デフォルトの名無しさん:2009/02/06(金) 10:43:52
>>779
これ言っとかないと、>>1を理由にスレ違い認定したがる奴が増えるかもしれんからな。
782デフォルトの名無しさん:2009/02/06(金) 10:48:13
>>780
まずマクロの記録をやってみろ
783デフォルトの名無しさん:2009/02/06(金) 11:41:22
★使ってるのは多分一人。
気に入らないなら無視すれ。
784デフォルトの名無しさん:2009/02/06(金) 12:32:05
>>1のテンプレが無かった頃から、同じ様な内容の指摘は多々あったので
指摘が>>1★n形式か、毎回文章で書かれるかの違いでしかないんだけどね

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

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

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


と、暇なので長々と書いてみたが、「気に入らないなら無視すれ。」
言ってる本人が出来なかったら恥ずかしいからなw
785769: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デフォルトの名無しさん:2009/02/06(金) 13:15:27
>>784
落ち着けよ
787デフォルトの名無しさん:2009/02/06(金) 13:17:16
>>784
つまり、俺様はスレ違い認定する権利があってそれをするのだが、お前はそれに口出すな、ってことですね。
788デフォルトの名無しさん:2009/02/06(金) 13:20:36
>>786
とりあえず落ち着け
789デフォルトの名無しさん:2009/02/06(金) 13:31:10
>>785
コントロールの前にシートを指定していないせいだ
790デフォルトの名無しさん:2009/02/06(金) 13:34:51
>>784が★使ってスレ違い認定する奴だってことは分かった。
791デフォルトの名無しさん:2009/02/06(金) 13:47:00
>>787
別に口出ししてもいいよ
ただ、本当に>>1が気に入らないなら、スレ違い指摘してる奴に
ムキになって食い付くより、そんなの無視して答えちゃえばいいじゃんと
口出すなと言ってるのは>>776

>>790
もちろん俺も使ってるよ
というか、改めて言うまでもなく解るように書いたんだがw
792デフォルトの名無しさん:2009/02/06(金) 13:50:41
どっちがムキになってんだかw
793デフォルトの名無しさん:2009/02/06(金) 13:55:11
反論できないときは、相手を卑下して優位に立ったつもりになり
精神的安定を図るのが吉です
794769:2009/02/06(金) 13:59:58
>>789 ↓でできました!!ありがとうございます。!!!

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

結局は何かに反抗してみたい年頃なだけで、心底>>1を否定してるわけではないんだよな
796デフォルトの名無しさん:2009/02/06(金) 14:26:17
どうやって教えるかは決まってないし、人それぞれだから。
別にいきなり答えを書いちゃってもいいし、
それだと同じ人が何度も質問してきてウザく感じたりスレが荒れたりする可能性があるから、
できるだけ自分で考えるように誘導してやった方がいいと考える人もいる。
進行中の質問に別の回答者が割り込んで、いきなり答えだけを書いても何も問題はない。
797デフォルトの名無しさん:2009/02/06(金) 14:54:01
質問者だって、いきなり答えだけ書けよって思ってるかもしれないし
まじめにVBAの勉強をしてるかもしれない
798デフォルトの名無しさん:2009/02/06(金) 20:38:01
>>795
いや、俺は否定してるけど何か?
799Excel2003,XP home sp2:2009/02/06(金) 20:42:54
質問です
隠しシートに読み込んだCSVファイルの中身を出力しようとしているんですが元のシートのほうに出力されてしまいます。
シート参照のが仕方マズイのでしょうかヒントをください
800デフォルトの名無しさん:2009/02/06(金) 20:50:52
・どうやって読み込んだのか書け
・「元シート」とは何だ?
・「シートの参照」とは具体的に?
801デフォルトの名無しさん:2009/02/06(金) 20:51:26
追加
・どこに出力しようとしてるのか書け
802Excel2003,XP home sp2:2009/02/06(金) 20:51:33
803デフォルトの名無しさん:2009/02/06(金) 20:54:38
worksheets("隠しシート名").range(hogehoge
804Excel2003,XP home sp2:2009/02/06(金) 20:56:24
>>803
やってみますありがとうございます
805デフォルトの名無しさん:2009/02/06(金) 22:36:38
みんな落ちつけ。
落ち着いてExcelにFlash張りつけろ。
806デフォルトの名無しさん:2009/02/07(土) 00:03:53
>>805
Flashってなぁに??
聞いたことあるけど、、実際どおいうことができちゃうの?
807デフォルトの名無しさん:2009/02/07(土) 00:05:04
ググレカス
808デフォルトの名無しさん:2009/02/07(土) 00:30:12
>>807
カスは>>799
まんま>>777

ちょっとぐらいは過去レス嫁と小一時間(ry
809デフォルトの名無しさん:2009/02/07(土) 00:53:38
お前は過去スレに類似情報があると知ってるから読めと言ってるが、
大抵は類似情報なんかないのである。
810デフォルトの名無しさん:2009/02/07(土) 01:21:59
>>809
大抵のまともな人間はまず自力で何とかしようとするモンだ
それでも行き詰った場合に質問をするのがまともな人間の行動

だからお前みたいなヤツは、まともじゃない平均以下の存在価値の無い人間
811デフォルトの名無しさん:2009/02/07(土) 01:26:40
>>810
質問する奴がいなくなっちゃうね。
このスレもういらないや。
812デフォルトの名無しさん:2009/02/07(土) 01:27:56
おい、ここ2chだぞ。
813デフォルトの名無しさん:2009/02/07(土) 01:29:47
いや落ち着け
>>808
はツンデレだけどちゃんと教えてあげてる優しい人
そして
質問した>>799は学習して次は現スレくらいは読むだろう
814デフォルトの名無しさん:2009/02/07(土) 01:34:41
流れがさっぱりわからん
815807:2009/02/07(土) 01:37:17
>>808
は?
>>807>>806に言ったんだが、何か勘違いしてないか。
816デフォルトの名無しさん:2009/02/07(土) 01:44:11
過去レスなんか読まないのが今は普通なんだよ、オジサン
817デフォルトの名無しさん:2009/02/07(土) 01:54:39
>>816
おばはんですが何か?
818デフォルトの名無しさん:2009/02/07(土) 10:19:16
♪けんかはやめてー
819デフォルトの名無しさん:2009/02/07(土) 12:27:12
↑喧嘩、早めてぇ
820デフォルトの名無しさん:2009/02/07(土) 21:36:24
何これ
821デフォルトの名無しさん:2009/02/08(日) 12:26:13
コレクションのKey値を取得するにはどうすればいいんでしょうか?
具体的には、For Each In でコレクション内を回って、Key値がある値だった場合だけ、処理を実行させる
というコードを作りたいのですが
822デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/08(日) 20:42:26
特定のBookを開いている時に
エンターキーを押すごとにマクロを起動させることってできませんか?
824823:2009/02/08(日) 20:43:22
書き忘れましたが、EXCELは2003です。
825デフォルトの名無しさん:2009/02/08(日) 20:54:06
>>822
おおクラスモジュールとかオブジェクト指向とかってやつですか・・・
やはりそういうのも覚えていかないと駄目ですね
ただ今回は隠しシートを使って済ませることにしました
回答ありがとうございました
826デフォルトの名無しさん:2009/02/08(日) 23:38:45
OSはXP
Excel2000
VB6.0です
ユーザフォームでツールボックスから「ピクチャボックスコントロール」と
いう物を貼り付けたいのですが、ツールボックスに入っておらず、
方法がわかりません。
コントロールを追加しようとしたのですがそれらしいのが見当たらず。

ググってもピクチャボックスが選択できる事が前提のようなので
探すことができませんでした。
どうすれば表示されるのか教えていただけませんか?
827デフォルトの名無しさん:2009/02/09(月) 08:45:49
>VB6.0です

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

しかしVB6使ってる人なら、こんなの簡単に解るはずなんだがな
因みにVB6持って無くて、ランタイムだけ入れてるとかは無しね
それじゃダメだから
829デフォルトの名無しさん:2009/02/09(月) 12:12:54
>>823
キーボードやマウスを使ったイベントはAPI使わないと無理
830デフォルトの名無しさん:2009/02/09(月) 20:41:23
実行しているsub名を取得する事は出来ますでしょうか。

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

よろしくお願いします。
831デフォルトの名無しさん:2009/02/09(月) 20:56:33
>>830
>>1★3,4
832デフォルトの名無しさん:2009/02/10(火) 00:30:35
>>830
実行しているsub名を取得することはできないけど、次のようなことをするのは可能。
sub aaa()
msgbox "placeholder"
end sub
というコードを
sub aaa()
msgbox "aaa"
end sub
というコードに書き換えるようなこと。

ところで、何でそれ知りたいの?
833デフォルトの名無しさん:2009/02/10(火) 00:39:59
subの最初に適当な変数にsub名を入れとけばいいじゃん
834デフォルトの名無しさん:2009/02/10(火) 00:46:13
>>833
たしかに。
そういうの思い付く人と思い付かない人って
何が違うだろね
835デフォルトの名無しさん:2009/02/10(火) 00:51:12
そういう事か?
msgboxは質問時の方便で常時表示させたいんじゃないのか
今何の関数に飛んでますとか
836デフォルトの名無しさん:2009/02/10(火) 00:57:13
質問者のレス待てよ
837デフォルトの名無しさん:2009/02/10(火) 01:30:14
EXCEL2003です。

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

kazu = "*"
Kill "\\フォルダ\テスト" & kazu & ".xls"
だとフォルダ内の3つはすべて消してしまうんですよね。
「テスト」の後に何もつかないブックだけを消さずに残すにはどうしたらいいでしょう?
838デフォルトの名無しさん:2009/02/10(火) 02:03:56
"テスト1*.xls"
839デフォルトの名無しさん:2009/02/10(火) 04:24:49
かなりど素人なのですがEXCELでA列に文字を入力する際、A列の最終行数を
ランダムにしたいのですがどうすればいいでしょうか? 
      わかる方よろしくお願しますm(__)m
840デフォルトの名無しさん: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

どのように直すとよいのでしょうか?よろしくお願いします
844843:2009/02/10(火) 20:12:44
補足です。
For Each を使わずに走らせると、正常に動作する(兵庫県神戸市長田区イカニケイサイガナイバアイ)
と表示されるため、SQL文やデータベースを開くことに失敗している可能性は低いです
845デフォルトの名無しさん:2009/02/10(火) 20:18:39
>>844
まずForの直前でDebug.Print TypeName(dbRes.Field)ってやって、
Fieldメソッドがコレクションを返してるかどうか確認汁。
846デフォルトの名無しさん:2009/02/10(火) 20:21:47
ごめん。今のなし。
よく見たらこの2行が矛盾してる。
Set dbFld = dbRes.Fields
For Each dbFld In dbRes.Fields
setの行を削除してみ。
847デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/10(火) 22:06:52
Option Base 1って邪道ですか?
先々で弊害とか出ます?
849デフォルトの名無しさん:2009/02/10(火) 22:19:30
>>848
昔はちょっとでもメモリを節約するために、用途に合わせて配列の範囲を削ってた。
VBAなら配列の範囲は自由に決められるからあんまり意味はないと思う。
盲腸みたいなもんだな。
850830:2009/02/10(火) 22:23:28
すみません。スレ違いと指摘を受け、昨日はレスできませんでした。レスありがとうございます。

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

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

チェックナンバーをコピペして出力するのは問題無く出来ているのですが、
sub名を取得出来れば、コピペのミスが減ると思い、質問させていただきました。
851デフォルトの名無しさん:2009/02/10(火) 22:44:46
>>850
ExcelのVBAではモジュール名を取得する方法はない。
すでに書かれているように、スクリプトを使ってSubの直後にグローバル変数をセットするように
ソースを書き換えるのが、一番間違いが起こりにくいと思う。
852デフォルトの名無しさん:2009/02/10(火) 22:47:18
エラーナンバー体系と、チェック関数体系は分けたほうがいいと思うんだけど。
エラー内容とチェック関数が1:nやn:1の関係になったりしてない?
仮に1:1の関係だというのなら、チェック関数内に文字列を直接書いといた方がいいとも思う。
(関数名=エラーコードからエラー文字列が正しく対応しているかどうかのチェックが面倒なので)

それはともかく、コピペに勝る方法はまずないのだから、今回有効な手段としては、
後からチェックするコードを書くくらいかな。
853デフォルトの名無しさん:2009/02/10(火) 22:49:51
AccessのVBAなら自分自身の名前が取れるらしいので、Excelに依存しない作業ならAccessを使うという手もある。
854830:2009/02/10(火) 23:15:07
レスありがとうございます。
ExcelVBAで出来ないと言う事が分かったので、大きな収穫でした。
ダミーデータでエラーを出力した結果に対して目視チェックをする際、
1:1でエラーメッセージが取得出来ているかに重きを置く方向で調整したいと思います。

本当にありがとうございました。
855デフォルトの名無しさん:2009/02/10(火) 23:16:14
vba extensibility
http://support.microsoft.com/kb/410621/ja
使い方しらないけど、なんとなく近そうな道具
856デフォルトの名無しさん:2009/02/10(火) 23:36:01
>>855
それ、行番号さえ指定すればプロシージャ名は取得できるけど、
自分自身が何行目に書いてあるかってのは結局わからないのよ。
857843:2009/02/10(火) 23:36:52
>>845
>>846
>>847
動きました!いろいろアドバイス頂き、本当にありがとうございました

>>847
ああ・・・エラーの理由がわからないのでできるだけシンプルにしたかったのと
改行制限に引っかかったのでいろいろ削ってたのでこうなってしまいました。
すいませんでした
858デフォルトの名無しさん:2009/02/10(火) 23:59:30
>>855
マクロでコードを書き換えるとか、コードをマクロでチェックする系のレスは全部それ使うんだよ。
859デフォルトの名無しさん:2009/02/11(水) 00:13:55
ビミョーに方向違いの質問ですがすいません
まだおもちゃ程度にしかVBAいじれないんですが
On Error〜がらみは古いかもと思って避けてたんですよ

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

漠然とした質問すいません
860デフォルトの名無しさん:2009/02/11(水) 00:30:21
VBAで飯食わせてもらうくらいちゃんとしたもの使うならちゃんとエラー処理して、
エラー内容をユーザーにフィードバックする。
ちょっとしたマクロ程度ならOn Errorで十分。てか面倒。
861デフォルトの名無しさん:2009/02/11(水) 00:40:07
On Errorは滅多に使わん。
関数を呼ぶ前にちゃんと変数の値をチェックするとか、最初からエラーが出ないように作ってるから。
862デフォルトの名無しさん:2009/02/11(水) 00:44:27
>>860
えーと飯食わせてもらう作業のなかで利用しつつあるって感じなんですが
ちょっとしたマクロ程度でもあるし「使うな」って程でもないならちょっと安心です
ありがとうございます
863デフォルトの名無しさん:2009/02/11(水) 00:48:34
VBA自体を商品にするんじゃなくて、
業務効率化のためのマクロ使用なら
とにかく目的が達成できればいいんだから早く作れるほうがよい。
864デフォルトの名無しさん:2009/02/11(水) 00:54:33
>>861
あっやっぱりプロの方はそうですか・・・
ちょっと前まではVBAなしでワークシート上でやってたんですが
その時も確かにエラーが出ないように工夫はしてたんです
でも例えばFor〜Nextで回す時とか「結果がエラーになるときは飛ばす」って
ワークシート上でやってた時を思うとすごく斬新に思えてですね
もし初心者の私に気付いてない「ありがちな間違い」があればと思ってここにきました
865デフォルトの名無しさん:2009/02/11(水) 01:00:25
>>863
ですよねー
今のところ私のどんくささのせいでマクロ作るのも時間かかるし作らなくても時間かかるし(涙)
866デフォルトの名無しさん:2009/02/11(水) 01:00:51
事前にチェックするのと、事後にエラー処理するのと、どっちがいいかと言えばケースバイケースだけど、
VBAに限って言えばエラー処理が貧弱だから事前にチェックする方が結果的にコードがすっきり書けることが多い。
867デフォルトの名無しさん:2009/02/11(水) 09:02:47
on error resume next はたまに使います。 
いや、完全にデバッグしてから納品するのが当然なのは分かってる・・・。
分かってはいるんだが、ごく希に納品後にデバッグも止む無し、ってケースが・・・。
とりあえず動けば良い。とにかく早く、今日中に!! みたいな場合には。
868デフォルトの名無しさん:2009/02/11(水) 10:56:14
ネットワーク先が生きてるかどうかってエラーなしで判断できたっけ?
869デフォルトの名無しさん:2009/02/11(水) 11:29:33
「生きてる」の定義が問題だが、まぁスレ違いだわな
870デフォルトの名無しさん:2009/02/11(水) 13:05:13
>>868
ネットワークを介した共有フォルダorファイル?
ネットのURLの有効性?
TMネットワーク?
871デフォルトの名無しさん:2009/02/11(水) 13:36:15
画面描画しないとかカーソルを砂時計にするコマンドを使用している場合には
on errorは便利だよ。
カーソル砂時計になりっぱなしとか避けられるから。
872デフォルトの名無しさん:2009/02/11(水) 14:31:26
>>864
騙されるな。
本当にエラーが出ないほどチェックしてから関数を呼び出すなら、
チェックの部分が無防備なわけないだろ。
873デフォルトの名無しさん:2009/02/11(水) 14:32:30
>>867
インラインで処理するのと、何でもエラーを読み飛ばすのとは違うだろ。
874デフォルトの名無しさん:2009/02/11(水) 14:41:12
チェックするコードと処理するコードはアトミックじゃないから、普通はどんなチェックを行っても
原理的にはエラーが発生する可能性はある。
if dir("hogehoge") <> "" then
'ここでもうファイルが無い可能性がある
end if
875デフォルトの名無しさん:2009/02/11(水) 15:03:16
on errorで飛ばすんじゃなくて、簡単に予測出来るエラーの場合は条件分岐させて当然。
それでも出るのがエラーなのだよ。
876859:2009/02/11(水) 20:39:36
859ですレス頂いた皆さんありがとうございます
人様に売るものでもないんでマクロに産毛が生えたくらいのものしかつくってないんですが
ワークシート上で関数で処理するときはエラーになる時はそのセルを参照するときも意識してないといけないですよね
VBAでワークシート関数使ってから入力するならOn Errorですっ飛ばせば逆に綺麗に計算できるなと思ったんです
エラーになるかどうかの計算をさせる部分が省略できるから返って負荷軽減にはいいかもと勝手に思ってですね
あくまでワークシート関数使うときに限る話なんで皆さんのように複雑なプログラム組んでるときには
当て嵌まらないケースが多いんだと思います
それでもここまで読んでいて参考になりました
877デフォルトの名無しさん:2009/02/12(木) 00:25:55

「firefoxで或るURLを開く」をvbaはどう書くの
878デフォルトの名無しさん:2009/02/12(木) 01:13:31
シェルに渡せ
879デフォルトの名無しさん:2009/02/12(木) 13:33:52
880デフォルトの名無しさん:2009/02/12(木) 17:23:16
firefoxで「或るURL」を開くは、まさにその
URLのシェルへの渡し方がわからないので、聞いているんだが。
881デフォルトの名無しさん:2009/02/12(木) 18:07:32
>>880
firefoxの使い方とか、スレ違いだろ。

普通に。
コマンドラインからやるようにやればいいだろ。
"C:\Program Files\Mozilla Firefox\firefox.exe" www.yahoo.co.jp
とか。
882デフォルトの名無しさん:2009/02/12(木) 18:31:56
たぶん、こういうことだろ?
REM 「firefoxで或るURLを開く」
883880:2009/02/12(木) 19:53:36
>>881
もちろん、VBAの書き方の問題として、"""あたりのことが、気になっていたもので。
大変、参考になりました。所期の目的を達成することが出来ます。サンクス。
いままで、IEでやっていたのをfirefoxでやるにあたって、より難しいとの思い込みが
邪魔してましたw
884デフォルトの名無しさん:2009/02/12(木) 20:33:35
お前は一体何を言ってるんだ・・・
885デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/12(木) 21:12:24
すみませんやっぱりアホでした
標準モジュールでDimで2重に宣言してました・・・
スレ汚しスミマセン
887デフォルトの名無しさん:2009/02/13(金) 01:06:50
>>884
自分で考えるより他人に聞いたほうが早いと、、、
888デフォルトの名無しさん:2009/02/13(金) 18:21:30
質問の文章を書いてると考えがまとまるんだよな。
脳が疑問点を俯瞰するというか。
889デフォルトの名無しさん:2009/02/13(金) 19:33:48
その場合
書き込みボタン押す前に
やめて欲しい
890デフォルトの名無しさん:2009/02/13(金) 20:00:55
ボタンを押した瞬間にひらめくんだよ、これが。
脳のどこかが切り替わるんだろうな。

例えば誰かに質問するために電話をかけて、
つながった瞬間解決するとか、誰でも経験あると思うんだけどなあ。
891デフォルトの名無しさん:2009/02/13(金) 20:58:22
とかいうつまんないやり取りは、くだらん質問よりうざい
892デフォルトの名無しさん:2009/02/13(金) 21:05:19
>>891
うぜー
893デフォルトの名無しさん:2009/02/13(金) 21:25:13
てな感じ
894デフォルトの名無しさん:2009/02/14(土) 06:55:41
携帯からすみません。
一定時間経過したが、何も操作が無かったら、エクセル自体を閉じるコードを考えてます。
これって可能です?
ちなみに、エクセル2003です。
VBAは、ある程度使えます。
895デフォルトの名無しさん:2009/02/14(土) 08:55:09
>>894
Excelに標準で用意されてる関数だけでは無理
APIを使えば可能
896デフォルトの名無しさん:2009/02/14(土) 11:06:14
APIですか〜
それは、手に余ってしまいます。
素直に、作業ブックを閉じるようにします。
ありがとうございました!
897デフォルトの名無しさん:2009/02/14(土) 18:09:38
本で勉強中なのですが

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


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

MsgBox ("こんにちは")

Next Cnt

End Sub


Cntがカウンタ変数って事でよさそうなんですが。
898デフォルトの名無しさん:2009/02/14(土) 18:14:23
そのまんまじゃんか。
Cntが宣言されてないんでしょ。

option explicit外すか、dim cntで宣言すれば良いんじゃない?
899デフォルトの名無しさん:2009/02/14(土) 18:14:57
ためしに
Dim Cnt As Integer
を追加してみたところうまく動作しました。

何度みなおしても本には>>897のコードだけで動くように書いてあるのですが。。
ちなみにEXCEL VBAのコツが面白いほどよくわかるって本です。
900デフォルトの名無しさん:2009/02/14(土) 18:17:39
>>898
ありがとうございます。
option explicitってオプションで「変数の宣言を強制する」って奴と関係してるものですかね?
ちょっと調べてみますが、この設定のせいだったんですね。
別の本だと「変数の宣言を〜」って設定を推奨してたので
チェックしてました。
901デフォルトの名無しさん:2009/02/14(土) 18:19:30
option explicit無しがデフォルト設定じゃなかったっけ?
902デフォルトの名無しさん:2009/02/14(土) 19:17:07
変数の宣言は強制しておけ。
ついでに、きちんと型の概念を持っておくと良いよ。

ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。
型を理解してない奴は、ほぼ100%お遊びマクロ。
903デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/14(土) 21:26:41
何で自分で調べないの?
908デフォルトの名無しさん:2009/02/14(土) 21:29:02
調べたんですけど分からなかったです。スマンコ
909デフォルトの名無しさん:2009/02/14(土) 21:55:56
>>908
Offset()もRange()もRange型オブジェクトを返す。両者の違いは、
Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。
Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。
両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。

この場合に限って言えば、Range("A1")は単なる無駄。
わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?
910デフォルトの名無しさん:2009/02/14(土) 22:23:26
調べてない奴の台詞。> 調べたんですけど分からなかったです。
911デフォルトの名無しさん:2009/02/14(土) 22:29:07
>>909
なるほど!
調べたけど分からなかったことが分かりました!
ありがとうございます!
912デフォルトの名無しさん:2009/02/14(土) 22:50:20
┐(´ー`)┌
913デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/14(土) 23:12:30
マルチすんな
915デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/15(日) 23:04:53
with で囲んでないのに、何でピリオドから始まってるの?
918デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/16(月) 14:20:01
>>918
マクロの記録してから質問しろ
920デフォルトの名無しさん: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
921デフォルトの名無しさん:2009/02/16(月) 22:41:43
日記はやめてください
922デフォルトの名無しさん:2009/02/17(火) 01:28:52
おまんこ Then
923デフォルトの名無しさん:2009/02/17(火) 09:08:00
気持ちよくて End If
924デフォルトの名無しさん:2009/02/17(火) 17:07:37
エラー
存在しないオブジェクトを指定しています
925デフォルトの名無しさん:2009/02/17(火) 20:50:55
ちんこがないのかまんこがないのか
それがもんだいだ
926デフォルトの名無しさん:2009/02/18(水) 21:54:34
include<スタジオ.エッチ>
927デフォルトの名無しさん:2009/02/19(木) 20:46:29
どうしたVBA!
928デフォルトの名無しさん:2009/02/19(木) 21:48:56
もうやだこのスレ
929デフォルトの名無しさん:2009/02/19(木) 23:52:44
じゃあ何で未だにここに居るの?
930デフォルトの名無しさん:2009/02/20(金) 01:05:45
そこにスレがあるから
931デフォルトの名無しさん:2009/02/20(金) 02:49:54
約65万の全てのスレに書き込みしてるのでなければ、その理由はおかしい
932デフォルトの名無しさん:2009/02/20(金) 02:57:38
「そこに山があるから」と言った人も、全世界のすべての山を制覇したわけではない
むしろ登ってない山のほうがはるかに多い
933デフォルトの名無しさん:2009/02/20(金) 03:23:39
「そこに山があるから」という理由で【嫌な】山に登る奴は居ない
故にその例えは間違っている

単純にこのスレに来た理由を聞いてるのではなく
「もうやだ」と言いながらも来る理由を聞いているということをお忘れなく
934デフォルトの名無しさん:2009/02/20(金) 04:10:36
コピペにマジレスする男の人って
935デフォルトの名無しさん:2009/02/20(金) 04:33:19
くやしいのう、くやしいのうwww
936デフォルトの名無しさん:2009/02/20(金) 11:03:35
>>933
嫌な山という風には
普通とらない
つらいのに登る理由が
「そこに山があるから」
937デフォルトの名無しさん:2009/02/20(金) 12:16:50
えらいどーでもいいネタで盛り上がってるな
938デフォルトの名無しさん:2009/02/20(金) 17:08:14
>>920
自分も初心者だけど、書いてみました。こんな感じ?
Option Explicit
Option Base 1
Private Sub FontColorIndex()
Dim varData As Variant
Dim intRow As Integer
Dim intCol As Integer
Dim i As Integer
Dim j As Integer
varData = Cells(1, 1).CurrentRegion.Value
intRow = UBound(varData, 1)
intCol = UBound(varData, 2)
For i = 1 To intRow Step 1
For j = 1 To intCol Step 1
If i = 1 Then
Cells(1, j).Font.ColorIndex = 1
Else
With Cells(i, j)
Select Case .Text
Case Is = "kuro"
.Font.ColorIndex = 1
Case Is = "kimi"
.Font.ColorIndex = 4
Case Else
.Font.ColorIndex = 8 'xlAutomatic
End Select
End With
End If
Next j
Next i
End Sub
939デフォルトの名無しさん:2009/02/20(金) 20:22:06
2chだからインデントは表示されないんだけど、
インデント無いと、マジで可読性って下がるんだな・・・。
940デフォルトの名無しさん:2009/02/20(金) 20:39:04
そういう問題じゃないと思うぞ
941デフォルトの名無しさん:2009/02/20(金) 21:01:40
半角スペース2個を全角スペース1個に置換してから貼るべし
942デフォルトの名無しさん:2009/02/20(金) 21:35:57
いつも手抜きコードばかり作ってるから、
TextプロパティをIsで参照するのがなんか無駄に見えてしまう。
With Cells(i, j)
  Select Case .Value
    Case "kuro": .Font.ColorIndex = 1
    Case "kimi": .Font.ColorIndex = 3
    Case Else: .Font.ColorIndex = 0  'xlAutomatic
  End Select
End With

>>941
単純に置換しちゃうと文字列定数が壊れることがあるから注意な
943デフォルトの名無しさん:2009/02/20(金) 22:09:35
Option Explicitとかいらねーし
944デフォルトの名無しさん:2009/02/20(金) 22:57:16
初歩的な質問なんですが
複数の名前があるとします。

鈴木、木村、田辺、鈴木、林田、村瀬、田中、田辺、室田、田辺
この場合鈴木が2名、田辺が3名と重複してるのですが
これをマクロで同じ名前をひとつにするにはどうすればいよいでしょうか?
鈴木、木村、田辺、林田、村瀬、室田のようにしたいのです。
945デフォルトの名無しさん:2009/02/20(金) 23:18:53
946デフォルトの名無しさん:2009/02/20(金) 23:20:37
ピボットテーブルでええやん
947デフォルトの名無しさん:2009/02/20(金) 23:23:03
どこに名前があって、ひとつにした名前をどうしたいんだ
948デフォルトの名無しさん:2009/02/20(金) 23:24:35
>>944
ぼくなら、まず名前を並び替えて
木村、鈴木、鈴木、田中、田辺、田辺、田辺、林田、村瀬、室田、
こういう風に同じ名前が隣り合うようにした後で
左から右へ選択を一個づつずらしながら、
「今選択されてるセルの内容が、一つ左のセルと同じならそのセルを削除する」っていう風にします
949デフォルトの名無しさん:2009/02/20(金) 23:41:07
VBAスレなんだからVBA使った方法を書こうよ

>>944
Sub test01()
  ' 元データ
  n = Array("鈴木", "木村", "田辺", "鈴木", "林田", "村瀬", "田中", "田辺", "室田", "田辺")
  
  ' 連想配列で重複を取り除く
  Set d = CreateObject("Scripting.Dictionary")
  On Error Resume Next
  For i = 0 To UBound(n)
    d.Add n(i), ""
  Next
  ' 結果を配列に代入
  m = d.Keys
  
  ' 確認
  For i = 0 To UBound(m)
    Debug.Print m(i);
  Next
End Sub
950デフォルトの名無しさん:2009/02/20(金) 23:41:24
collection使え
951デフォルトの名無しさん:2009/02/21(土) 00:00:23
>>950
現時点では処理結果をどうしたいのか元質問に明記されてないのでなんとも言えないが、
Collectionオブジェクトだと一覧を取り出すのにループ回す必要があるから美しくない。
どうしてKeysプロパティを用意しなかったんだろう。
952デフォルトの名無しさん:2009/02/21(土) 06:40:05
配列にpushして行くのが一般的ではなかろうか。
953デフォルトの名無しさん:2009/02/21(土) 09:29:02
pushできる配列など無い
954デフォルトの名無しさん:2009/02/21(土) 09:48:02
配列より素直にシート使った方が早いというか楽というか

'アクティブなシートの引数の列について重複している行を削除します
'引数列が空白の行については削除しません
Sub DuplicationRowsDelete(KeyCol As Integer)
 Cells.Sort key1:=Columns(KeyCol), Order1:=xlAscending, Header:=xlNo, MatchCase:=True
 With Cells(1, KeyCol)
  Dim C As Long
   For C = Cells(65536, KeyCol).End(xlUp).Row To 1 Step -1
    If .Offset(C, 0) = .Offset(C - 1, 0) And .Offset(C, 0) <> "" _
    Then .Offset(C, 0).EntireRow.Delete
   Next C
   If .Value = Cells(2, KeyCol).Value Then Cells(2, KeyCol).Delete
 End With
End Sub
955デフォルトの名無しさん:2009/02/21(土) 10:11:42
削除可能なシート状にデータがあるかどうかわからないから、VBAのコードでやってるんでしょ
956デフォルトの名無しさん:2009/02/21(土) 11:43:41
シートなんてただの二次元配列じゃないか。
シート使うより、プログラム上で配列組んだ方がよっぽどやりやすい。
957デフォルトの名無しさん:2009/02/21(土) 11:50:07
質問です。
コンボボックスのプルダウンリストに5つのデータを表示させたいと思っています。
元のデータは1行5列に記入されています。それを5行1列で表示させることは可能でしょうか?
よろしくお願いします。
958デフォルトの名無しさん:2009/02/21(土) 15:41:47
>>949
On Error Resume Next 必要ないのに使うな
d(n(i))= ""
959デフォルトの名無しさん:2009/02/21(土) 16:01:24
>>957
データはどんな順番で並んでいても大丈夫。一直線じゃなくて完全にバラバラでも。
あとVBA関係ない質問はExcel相談所へ行くこと。
960デフォルトの名無しさん:2009/02/21(土) 18:49:46
>>949
On Error Resume Next しっぱなしすな
961デフォルトの名無しさん:2009/02/21(土) 18:52:23
ほかの場所でOn Error使ってるとこの方法はアウトだから、
どうしても使う必要がある時は別プロシージャに飛ばすしかないな
962デフォルトの名無しさん:2009/02/21(土) 21:58:06
てか、配列内に既に同じ物が入ってるかどうか監査してからpushすりゃいいじゃん。
VBAにはpushないから、redim preserveで増やす事になるだろうけど。

重複取り除くなんてのはスマートじゃない。
配列内の総当たりだろうが、大した負荷掛からんて。
963デフォルトの名無しさん:2009/02/21(土) 22:47:31
>>962
連想配列ってのは、単純に代入するだけで重複チェックが全自動で行われるんだよ。
検索すると、連想配列なのにいちいちIfで重複チェックしたりエラー処理してるサンプルが大量に出てくるけど、
それらはみんな無駄な処理をしてるの。
もちろん>>949のOn Errorも無駄。

単に重複を除いたリストが欲しいだけなら、全データを配列に代入するだけ。
重複データに印を付けるとか個数を数える場合も、ちょっとした工夫だけでできる。
データを追加するたびにいちいち総当たりチェックなんて最悪。
964デフォルトの名無しさん:2009/02/21(土) 22:55:43
お前は何を言ってるんだ
965デフォルトの名無しさん:2009/02/21(土) 23:11:08
連想配列の間違った使い方だな。でも何かと便利なんだよな。
測ったことないけどスピードはどうなんだろう。総当たりよりは間違いなく速そうだけど。
966デフォルトの名無しさん:2009/02/21(土) 23:32:20
>>963
ランタイムエラーや例外が発生する言語・実装が多いから、重複チェックするのは全くおかしくない。妥当。
967デフォルトの名無しさん:2009/02/21(土) 23:39:07
お前は何を言ってるんだ
968デフォルトの名無しさん:2009/02/21(土) 23:40:55
少なくともDictionaryは、重複キーをAddしようとするとランタイムエラーが発生するんだが、
お前は何を言いたいんだ?
969デフォルトの名無しさん:2009/02/21(土) 23:44:41
on error resume nextなんてものが無いまっとうな言語では、存在チェックするのがあたりまえ
970デフォルトの名無しさん:2009/02/21(土) 23:52:13
何言いたいのかわからん奴が一人いるな
971デフォルトの名無しさん:2009/02/21(土) 23:55:31
何かの言語のmapと間違えてるんだろ。
972デフォルトの名無しさん:2009/02/21(土) 23:56:37
シートをソースにしたODBCでselect distinctする。
973デフォルトの名無しさん:2009/02/22(日) 00:02:45
連想配列の仕様を理解していれば、重複チェックもエラーチェックも必要ないんだよ。
これは別に裏技でも言語使用の穴を突いてるわけでもない。
974デフォルトの名無しさん:2009/02/22(日) 00:04:29
まぁまぁ。
Dictionaryでも、mydic(key) = itemという書き方をすれば、重複キーでもランタイムエラーが
発生しないのだよ。Addじゃなくて、代入ね。なければAddされ、あればitemが上書きされる。
だから、この問題に限って言えば、>>958が正しい。
975973:2009/02/22(日) 00:06:33
おっと、書いてる途中にレス入ったな。
だが、存在チェックやエラーチェックをするのが間違い(冗長)だと言い切るのもどうかと思うぞ。
976デフォルトの名無しさん:2009/02/22(日) 00:06:54
>>949を流用して具体的に書くと、こういうこと。
重複チェックもエラートラップも使わずに、きちんと重複を除いたリストが得られる。

Sub test02()
  ' 元データ
  n = Array("鈴木", "木村", "田辺", "鈴木", "林田", "村瀬", "田中", "田辺", "室田", "田辺")
 
  ' 連想配列で重複を取り除く
  Set d = CreateObject("Scripting.Dictionary")
  For i = 0 To UBound(n)
    d(n(i)) = ""
  Next
  ' 結果を配列に代入
  m = d.Keys
 
  ' 確認
  For i = 0 To UBound(m)
    Debug.Print m(i);
  Next
End Sub
977974:2009/02/22(日) 00:07:06
うお、名前間違えた。
973じゃなくて974ね。
978デフォルトの名無しさん:2009/02/22(日) 00:11:42
おまいらもちつけ

複数の有名サイトでもAddメソッドを使ったコードしか紹介してないから、
それしかないと思い込んでるやつもいるんじゃね?
979974:2009/02/22(日) 00:12:18
>>976
ちなみに俺なら「連想配列で重複を取り除く」などという無様なコメントなんか入れずに、
if not d.exist(key) then
  d.add key, ""
end if
と書くけどね。
980デフォルトの名無しさん:2009/02/22(日) 00:13:47
>>973
連想配列を重複チェックに使うこと自体が一種の裏技だよな…
981デフォルトの名無しさん:2009/02/22(日) 00:15:29
>>979
俺も昔は分かったふりして>>958と同じ書き方してたけど、
速度比較してからは意識的に>>979の書き方にしてる
982デフォルトの名無しさん:2009/02/22(日) 00:15:38
まぁ、ArrayクラスにExistメソッドがあって、
If Not Array.Exist(key) Then
Array.PushBack(key)
End If
のように書けた方が気持ちいいんだよな。
983デフォルトの名無しさん:2009/02/22(日) 00:19:37
わざわざPush関数をVBAで自作してるサイトなら見たことある
984デフォルトの名無しさん:2009/02/22(日) 00:21:37
俺は>>962を支持する。
つか、これ白熱するようなことなのか?
985デフォルトの名無しさん:2009/02/22(日) 00:22:37
>>1
>★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
986デフォルトの名無しさん:2009/02/22(日) 01:01:11
987デフォルトの名無しさん:2009/02/22(日) 01:31:45
On Error Resume Nextしっぱなしにするから話が暴走するんだ

On Error GoTo 0でおしまいにしろ
988デフォルトの名無しさん:2009/02/22(日) 02:20:43
End スレ
989デフォルトの名無しさん:2009/02/22(日) 02:40:18
d(n(i)) = ""
の方式って昔はよく使っていたけど、可読性の悪い禁じ手と知ってからは
一度使ったらすぐ消すようなスクリプト以外では使わなくなったな
990デフォルトの名無しさん:2009/02/22(日) 07:39:22
どうでも良いんだが、VBAの配列は貧弱だな・・・。
硬いと言えば硬くて良いんだけどさ。
991デフォルトの名無しさん:2009/02/22(日) 07:48:48
Foe Each ちんこ In まんこ
992デフォルトの名無しさん:2009/02/22(日) 08:10:23
な・・・何てことを仰る!!!
993デフォルトの名無しさん:2009/02/22(日) 08:28:48
994デフォルトの名無しさん:2009/02/22(日) 09:28:19
コレクションの要素がちんこって、どんだヤリマンなんだよ
995デフォルトの名無しさん:2009/02/22(日) 11:41:50
ちんこは変数名なので型はまんこ型になるけどまんこコレクションのメンバーそのものではない
あとForじゃなくてFoeだからVBAにすらなってない
996デフォルトの名無しさん:2009/02/22(日) 13:54:19
マジレスするとまんこも変数
宣言部がないから型も不明
997デフォルトの名無しさん:2009/02/22(日) 18:35:08
998デフォルトの名無しさん:2009/02/22(日) 19:28:16
暴走話のほうがまだましだな
On Error Resume Next
はいどうぞ
999デフォルトの名無しさん:2009/02/22(日) 19:30:12
バリアントナイフの2刀流みだれうちでケフカなんて一撃だぜ
1000デフォルトの名無しさん:2009/02/22(日) 19:52:49
1000 !!!!!!!!!!!!!!!!!!!!!!!!!!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。