トップページ⇒tech
1001コメント347KB

Excel VBA質問スレ Part9

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2008/12/04(木) 15:42:51
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)
0002デフォルトの名無しさん2008/12/04(木) 15:43:49
過去スレ
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
0003デフォルトの名無しさん2008/12/04(木) 18:29:10
>>1乙

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

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

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

メモ帳に
あ「あ」

IME English
?? に

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

Mac OS 9.2.2 Microsoft Office 2001 バージョン9.0(2615)です。あと何か必要な情報はありますか?
0025デフォルトの名無しさん2008/12/09(火) 11:58:26
>>24
ttp://support.apple.com/kb/TA25701?viewlocale=ja_JP&locale=ja_JP
0026242008/12/09(火) 12:07:46
>>25
べらぼうに割り当てを増やしてもだめなんだよ。
0027デフォルトの名無しさん2008/12/09(火) 12:55:43
>>26
オマエのいってる「べらぼう」がなんだか知らないけど、
メモリがたりないんだろ?
0028242008/12/09(火) 14:43:36
>>27
そういう基本的なことじゃないらしいというところまではわかっているんですけどね。
オマエ呼ばわりするオタクがいるところにきたオレがバカだった。
0029デフォルトの名無しさん2008/12/09(火) 14:51:50
>>28
わかってねーじゃん
0030デフォルトの名無しさん2008/12/09(火) 14:53:43
要するにVBEが使い物にならないんだな
再インスコくらいは試してるよな?
2chで質問する前にこんな基本的なこともしてないならマジでバカだな
0031デフォルトの名無しさん2008/12/09(火) 22:21:16
>>24
こちらへどうぞ
http://pc11.2ch.net/pcqa/
0032デフォルトの名無しさん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を入れる感じの、これのほうがしっくり来る気がするのですが
どういうことなんでしょうか?
0033デフォルトの名無しさん2008/12/09(火) 23:11:07
(row,col)ってことです。
0034デフォルトの名無しさん2008/12/10(水) 01:47:18
便乗質問。>>32のサンプルでわからない部分があるのですが
dim As Integer
これはどういう意味ですか?
0035デフォルトの名無しさん2008/12/10(水) 01:48:57
電卓のテンキーと電話のテンキーみたいなもの
0036デフォルトの名無しさん2008/12/10(水) 07:01:07
変数の宣言が判らないレベル?
0037デフォルトの名無しさん2008/12/10(水) 08:18:23
すみません。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Private Sub back1_Click() back1はイメージオブジェクトです
If startflag = 1 Then
Call moguratataki
End If
End Sub
コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと
思っていますがそれもまだ分からないので調べ中です。
call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
0104sage2008/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


0105sage2008/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
0106sage2008/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
0107sage2008/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
0108sage2008/12/18(木) 15:30:53
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば
教えてください。
0109デフォルトの名無しさん2008/12/18(木) 15:31:07
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。
っつってもわかんねーかな。
0110デフォルトの名無しさん2008/12/18(木) 15:46:55
<<109 さん
おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!
0111デフォルトの名無しさん2008/12/18(木) 20:25:38
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。

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

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

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

0117デフォルトの名無しさん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
0118デフォルトの名無しさん2008/12/18(木) 22:36:44
i=i+1はEndIfとLoopの間だと思う。

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

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

それでもif文の行にはエラーは出ない。
力になれなくてすまんな。
0120デフォルトの名無しさん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文にオブジェクトはプロパティかメソッドをサポートしてない
ってでてまたエラーになってしまいました
0121デフォルトの名無しさん2008/12/18(木) 22:53:48
ありがとうございます!
columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
0122デフォルトの名無しさん2008/12/18(木) 23:16:55
失礼します


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

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

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

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

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

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

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


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

これではインデックス範囲のエラーがでますorz
0134デフォルトの名無しさん2008/12/19(金) 01:35:00
実際のファイルを作って、アップしろ
0135デフォルトの名無しさん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("テスト")にて実行する方法ということです
今のままじゃエラーがでますので
0136デフォルトの名無しさん2008/12/19(金) 01:46:07
>>135
実際に作ったものをアップしろって
0137デフォルトの名無しさん2008/12/19(金) 02:16:52
まったくわからない・・・
0138デフォルトの名無しさん2008/12/19(金) 02:19:01
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。

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

>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。
0141デフォルトの名無しさん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)
0142デフォルトの名無しさん2008/12/19(金) 02:26:16
>>141
だから、実際のものをアップしないと話にならねーって
0143デフォルトの名無しさん2008/12/19(金) 02:35:29
>>138
デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
0144デフォルトの名無しさん2008/12/19(金) 02:37:35
うーむ、簡単に見えてむずかしいようですね・・・
0145デフォルトの名無しさん2008/12/19(金) 02:41:18
>>144
オマエが単純に間違ってんだよ。
現物をアップしろよ
0146デフォルトの名無しさん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
0147デフォルトの名無しさん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行目のところにエラーが・・・
0148デフォルトの名無しさん2008/12/19(金) 02:45:00
>>147
それはもういいんだよ。
現物上げろよバカ
0149デフォルトの名無しさん2008/12/19(金) 02:45:47
>>146
さすがにこれは長いですね・・・
0150デフォルトの名無しさん2008/12/19(金) 02:46:35
>>148
現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
0151デフォルトの名無しさん2008/12/19(金) 02:47:40
>>150
こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。
0152デフォルトの名無しさん2008/12/19(金) 02:48:58
>>150
概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ
0153デフォルトの名無しさん2008/12/19(金) 03:05:44
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。

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

以上で終了───
0158デフォルトの名無しさん2008/12/19(金) 03:13:43
>>156
rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。
0159デフォルトの名無しさん2008/12/19(金) 03:31:01
おぉ。rangeってrangeなのね。そうなのね。
そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
0160デフォルトの名無しさん2008/12/19(金) 07:04:25
rangeが指定する値を保存する方法って?
0161デフォルトの名無しさん2008/12/19(金) 07:10:54
オブジェクト変数にrangeをセット
0162デフォルトの名無しさん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が書いてるのはこういうこと。
0163デフォルトの名無しさん2008/12/19(金) 13:22:11
>>162
その発言、なんかのギャグ?
0164デフォルトの名無しさん2008/12/19(金) 13:25:02
>>162
流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?
0165デフォルトの名無しさん2008/12/19(金) 14:00:42
日本人はひとつのジョークで3回笑う
1回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき
0166デフォルトの名無しさん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メソッドが失敗しました。

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

普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?
0169デフォルトの名無しさん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
0170デフォルトの名無しさん2008/12/19(金) 14:51:43
>>169
おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。
0171デフォルトの名無しさん2008/12/19(金) 14:56:51
>>169
できたああああ!
ありがとう!!!!
感謝感謝!!!!
0172デフォルトの名無しさん2008/12/19(金) 20:04:42
質問させてください。
指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

文章がわかりにくかったらすいません。
0184デフォルトの名無しさん2008/12/21(日) 02:20:11
>>183
>>167
01851662008/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

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

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

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

そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
0189デフォルトの名無しさん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

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

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

エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)
01941662008/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

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

まぁ、ある程度の量以上になると遅いけど。
0196デフォルトの名無しさん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
0197デフォルトの名無しさん2008/12/22(月) 07:46:08
rangeをvariant型の2次元配列に代入するのもいいね。
0198デフォルトの名無しさん2008/12/22(月) 11:08:13
>>197
>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。
01991662008/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

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

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

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

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

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

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

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

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

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

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

If Obj Is Nothing Then

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

じゃダメなの?

if not obj is nothing then

にしたいって事?
0220デフォルトの名無しさん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になりません・・・一体なぜなのでしょうか?
0221デフォルトの名無しさん2008/12/23(火) 00:46:03
>>220
表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。

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

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

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

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

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

レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
0243デフォルトの名無しさん2008/12/24(水) 21:58:35
>>241
いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。
0244デフォルトの名無しさん2008/12/24(水) 23:50:41
floatよりdoubleの方が速いらしいぜ
0245デフォルトの名無しさん2008/12/25(木) 00:30:23
>>244
マジレスすると、ケースバイケース。
0246デフォルトの名無しさん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と入らなければいけないのですが。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。
0275デフォルトの名無しさん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
0276デフォルトの名無しさん2008/12/28(日) 00:09:40
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。

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

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

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

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

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

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

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

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

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

↓ マクロ発動

100円○ 500円  250円


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

どういった関数を使えばいいでしょう?
02922912008/12/29(月) 19:08:00
xp
2003
0293デフォルトの名無しさん2008/12/29(月) 21:35:37
>>291さん
こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub
0294デフォルトの名無しさん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
02952942008/12/29(月) 22:31:54
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね
0296デフォルトの名無しさん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
0297デフォルトの名無しさん2008/12/29(月) 22:36:55
296は293の訂正です
0298デフォルトの名無しさん2008/12/29(月) 22:43:48
VBAのステップ実行時に、ウォッチでRangeを見てみました。
すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?

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

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

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

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

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

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


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

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

目的のセルはFindと FindNextで

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

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

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

やってみます
0309デフォルトの名無しさん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

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

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

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

あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}
…
みたいにELSE句にIFが書けないんだろう
欠陥だろ。。

でした。

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

0324デフォルトの名無しさん2009/01/01(木) 01:04:13
>>318
アホなのか・・・
0325デフォルトの名無しさん2009/01/01(木) 01:06:26
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
ねーよ。
0326デフォルトの名無しさん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
0327デフォルトの名無しさん2009/01/01(木) 01:14:31
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If
0328デフォルトの名無しさん2009/01/01(木) 01:27:43
>>327
あ!ありがとうございます。
あったんだ。
0329デフォルトの名無しさん2009/01/01(木) 01:48:45
>>328
意外と素直w
0330デフォルトの名無しさん2009/01/01(木) 02:10:17
あんまり笑わせるなよ。
VB分かってないやつがVB馬鹿にしてたのかよ。orz
0331デフォルトの名無しさん2009/01/01(木) 02:11:14
明らかに分かってないのに、構造構造言いたがるのなんて、
情報系の一年生くらいだろ。
0332デフォルトの名無しさん2009/01/01(木) 02:21:16
>>330-331
ゴメンね(´・ω・`)
ついイライラしてたから
0333デフォルトの名無しさん2009/01/01(木) 02:30:42
厨とか言っちゃうやつは例外なくアホ
0334デフォルトの名無しさん2009/01/01(木) 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか?

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

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

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

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

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

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

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

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

上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。
0349デフォルトの名無しさん2009/01/03(土) 03:55:36
トリプルクリックにまで対応できるのは素晴らしいけど
コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな
0350デフォルトの名無しさん2009/01/03(土) 04:52:18
http://www.amazon.co.jp/VBAユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1
0351デフォルトの名無しさん2009/01/03(土) 04:53:58
オレのExcel、コンボボックスにダブルクリックイベント有るけど
みんなのには付いてないの?
バージョン Excel2003
0352デフォルトの名無しさん2009/01/03(土) 06:03:46
たぶん
コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
0353デフォルトの名無しさん2009/01/03(土) 13:26:28
オリジナリティ溢れるUIほど迷惑なものはない
0354デフォルトの名無しさん2009/01/03(土) 16:11:29
>トリプルクリックや4回クリックなどにも

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

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

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

0363デフォルトの名無しさん2009/01/04(日) 15:18:49
>>357
ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
0364デフォルトの名無しさん2009/01/04(日) 15:21:38
>>361
>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf
0365デフォルトの名無しさん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なら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
0366デフォルトの名無しさん2009/01/04(日) 23:56:00
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。
0367デフォルトの名無しさん2009/01/05(月) 00:00:55
ショートサーキットはしないよ
まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
0368デフォルトの名無しさん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っけ?
0369デフォルトの名無しさん2009/01/05(月) 13:14:41
>>368
Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値

そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
0370デフォルトの名無しさん2009/01/05(月) 14:13:14
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか?
例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)
0371デフォルトの名無しさん2009/01/05(月) 14:19:16
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
0372デフォルトの名無しさん2009/01/05(月) 14:22:53
>>371
調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。
0373デフォルトの名無しさん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がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。
0374デフォルトの名無しさん2009/01/05(月) 19:51:47
>>373
・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ

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

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

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

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

したら差は縮まったけどまだ
foo2が速い
0386デフォルトの名無しさん2009/01/05(月) 22:35:45
>>385
おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。
0387デフォルトの名無しさん2009/01/05(月) 22:36:45
すまん、また後ろ読んでなかった。
0388デフォルトの名無しさん2009/01/05(月) 22:41:46
>>386
&で宣言したよ
30位foo2が速い
0389デフォルトの名無しさん2009/01/05(月) 22:42:49
まぁModで算出した値を使わないなら>>373が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。
0390デフォルトの名無しさん2009/01/05(月) 22:44:22
ちなみに
Excel2002です
0391デフォルトの名無しさん2009/01/05(月) 22:47:06
>>390
トンクス。
03923612009/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
0393デフォルトの名無しさん2009/01/06(火) 00:21:36
文章だけだと伝わりづらいと思いますが、質問です。


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

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

WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?
0394デフォルトの名無しさん2009/01/06(火) 03:38:21
>>392
背中がムズムズする……
0395デフォルトの名無しさん2009/01/06(火) 05:39:55
>>394
気持ちは解る
条件式にnotと=を併用するヤツってもうね…
0396デフォルトの名無しさん2009/01/06(火) 07:33:05
<>
0397デフォルトの名無しさん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で抜ける必要なし。
というか抜ける記述は普通はしない。
0398デフォルトの名無しさん2009/01/06(火) 09:49:54
何、今更?
0399デフォルトの名無しさん2009/01/06(火) 09:59:59
>>392
書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
0400デフォルトの名無しさん2009/01/06(火) 10:02:35
>>398
昨晩のアフォの>>365か?
無視してすまんね。
0401デフォルトの名無しさん2009/01/06(火) 10:29:05
悔しかったの?
0402デフォルトの名無しさん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
0403デフォルトの名無しさん2009/01/06(火) 10:59:47
相変わらずの人がいるなw
0404デフォルトの名無しさん2009/01/06(火) 11:20:39
>>402
ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
0405デフォルトの名無しさん2009/01/06(火) 16:29:31
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。
条件に「合う」場合だけ判定して処理するように書くのが普通だね。

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

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

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

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

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

質問させてください。

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

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

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

>>432
VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
0435デフォルトの名無しさん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
0436デフォルトの名無しさん2009/01/07(水) 20:31:28
>>435
あったなぁ・・

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

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

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

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

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

Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
0457デフォルトの名無しさん2009/01/08(木) 00:43:52
>>451
Officeって言うくらいだから・・・
0458デフォルトの名無しさん2009/01/08(木) 00:53:51
>>456
Cells(i, 9).Address(False, False)
0459デフォルトの名無しさん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
0460デフォルトの名無しさん2009/01/08(木) 01:22:28
>>458
ありがとう
0461デフォルトの名無しさん2009/01/08(木) 01:49:40
>>459
表示形式
0462デフォルトの名無しさん2009/01/08(木) 02:57:09
ウォッチやDebug.Printで値を見るくらいは自分でやれよ

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

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

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

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

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

配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが
どなたか知恵を貸して下さい
0476デフォルトの名無しさん2009/01/09(金) 00:50:04
> 配列に入れる処理中に色付けをする
それでいいじゃん、何か問題有るの?
0477デフォルトの名無しさん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
0478デフォルトの名無しさん2009/01/09(金) 09:28:53
>>475
とりあえず大雑把なアドバイスをしておく

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

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

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

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

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

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

0484デフォルトの名無しさん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
0485デフォルトの名無しさん2009/01/10(土) 08:15:13
VBAを用いてプリンタに印刷させようと考えています。
それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。
例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。
0486デフォルトの名無しさん2009/01/10(土) 09:20:27
>>485
出来るよ
手動でトレイの選択などが出来る状態なら
その辺の制御をするドライバやAPIは入ってるわけだから
それをプログラムから叩けば良いだけ

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

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

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

Dim window1 As Window

workbookでもなくworksheetでもないんですよね??
どなたかご教授お願いします。
0491デフォルトの名無しさん2009/01/11(日) 16:53:34
用途が判らなければ、使わなければいいのでは?
0492デフォルトの名無しさん2009/01/11(日) 17:04:46
>>490
大雑把に説明すると、Windowsというのは画面上に表示された状態の物。
ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。
ブックを開いたらWindowが作られる、みたいに考えておけばいい。
0493デフォルトの名無しさん2009/01/11(日) 17:44:48
>>492
ありがとう。
自分が作るプログラムには特に必要はなさそうです。
自分のPCでは
Set window1 = Workbooks(1) 
でwindow1には”PERSONAL.XLS”が入ります。
勉強になりました。
0494デフォルトの名無しさん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件でも区切り線が引かれるようにするには
どのようにすれば良いですか?
0495デフォルトの名無しさん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
0496デフォルトの名無しさん2009/01/11(日) 20:37:40
>>495
考えすぎたみたいです。解決しました。
ありがとうございましたm(_ _)m
0497デフォルトの名無しさん2009/01/11(日) 20:43:27
>>494
オレの知らないテクニック満載で何やってんのか理解できねえ
0498デフォルトの名無しさん2009/01/11(日) 20:46:09
すみませんw
0499デフォルトの名無しさん2009/01/12(月) 07:19:54
2007の質問ですー
図形の操作がらみが「マクロの記録」に残らないんですが
以前のバージョンのように記録させる方法ないでしょうか?
0500デフォルトの名無しさん2009/01/12(月) 08:23:04
>>499
ない
0501デフォルトの名無しさん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  工藤
0502デフォルトの名無しさん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  工藤

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

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

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

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

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

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

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

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

みたいに。
0515デフォルトの名無しさん2009/01/13(火) 20:24:40
単に止めるだけなら
for i=1 to 5
  if i=3 then stop
next i
って書く。
0516デフォルトの名無しさん2009/01/13(火) 21:12:47
俺は処理が1行でもThenの後ろには書かない
もちろん、If ... Then ... else ...もやらない
0517デフォルトの名無しさん2009/01/13(火) 21:36:38
>>514
>>515
ありがとうございました。
stopで止まりました。
0518デフォルトの名無しさん2009/01/13(火) 21:51:33
>>516
すいません
そのわけを教えてください
0519デフォルトの名無しさん2009/01/13(火) 22:15:21
クラスモジュールについてドップリ勉強できる書籍はないだろうか?
0520デフォルトの名無しさん2009/01/13(火) 22:39:31
勉強するほどのものじゃないんじゃ
0521デフォルトの名無しさん2009/01/13(火) 22:54:17
IPアドレスを
123.456.789.10
からx番目のIPアドレスを求めるような
EXCEL関数かVB関数を探してるのですが、
そんな便利なものありませんか?
0522デフォルトの名無しさん2009/01/13(火) 23:17:28
x番目って何よ?
0523デフォルトの名無しさん2009/01/13(火) 23:23:36
Split("123.456.789.10", ".")(x)でいいんじゃねーの
0524デフォルトの名無しさん2009/01/13(火) 23:25:33
>>522
すみません。
123.254.90.10から
1番目は、123.254.90.11
2番目は、123.254.90.12、
…
という意味です。
上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。
失礼しました。。。。
0525デフォルトの名無しさん2009/01/13(火) 23:28:29
単なる足し算じゃね
0526デフォルトの名無しさん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
0527デフォルトの名無しさん2009/01/14(水) 01:48:01
123.254.90.256とかやりそうな奴だな
0528デフォルトの名無しさん2009/01/14(水) 20:38:53
123.54.90.999 とかやってくれたら笑えるんだけど
0529デフォルトの名無しさん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シート以外のシートがアクティブにできないし、
新たに別のシートも開けなくなります。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

という状態です。

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

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

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

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

0580教えてください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"

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

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

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

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

>>583
もっと違った記述方法があるんですかね?教えてください。
0587デフォルトの名無しさん2009/01/20(火) 21:48:51
>>585
どんなプログラムを作ったの?
0588デフォルトの名無しさん2009/01/20(火) 22:07:54
>>579
まず変数名に日本語を使うところからダメだわ。
0589デフォルトの名無しさん2009/01/20(火) 22:14:47
>>588
それは場合によりけりだな
0590デフォルトの名無しさん2009/01/20(火) 22:21:17
場合というか,使われ方とか規模とか書く人とかによるな
どちらかに決めて使い分けはしない
0591デフォルトの名無しさん2009/01/21(水) 00:29:10
俺も変数名に日本語使うの抵抗あるけど
日本語使うとコードが分りやすくなるような気もするから
使おうかなとも思うけど…
でも抵抗あるんだよなー
0592デフォルトの名無しさん2009/01/21(水) 00:39:52
英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、
ローマ字で書くのは嫌いだから日本語で書いちゃう
0593デフォルトの名無しさん2009/01/21(水) 01:02:53
>>592
確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな
0594デフォルトの名無しさん2009/01/21(水) 05:44:10
ActiveXコントロールのテキストボックスをワークシート上で使う場合、
Heightを文字の大きさの2倍以上にしないと、文字が崩れますが
解決法はありますか?
0595デフォルトの名無しさん2009/01/21(水) 07:15:08
日本語は入力が面倒臭いのが難点。
0596デフォルトの名無しさん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等のブラウザから見ると正常に‖と見えます。
よろしくおねがいします。
0597デフォルトの名無しさん2009/01/21(水) 20:23:54
>>596
>>1★3,★4
0598デフォルトの名無しさん2009/01/21(水) 22:56:21
>>597

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

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

Option Explicit

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

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

どうも分岐がうまくいかないのですが。
0605質問です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
0606デフォルトの名無しさん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)がスペースの行が検索に引っかかりません。
一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう?
質問がわかりにくいとは思いますがお願いします。
06076062009/01/22(木) 21:23:56
すいませんまちがえました。

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

は

Do While Cells(row1, 1).Value <> ""
の間違えでした。
0608デフォルトの名無しさん2009/01/22(木) 22:23:09
読む気になれない・・・。
06096062009/01/22(木) 23:37:24
すいません。
最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。
0610デフォルトの名無しさん2009/01/23(金) 00:05:26
特定のEXCELシートが開いている時にはそのシートを閉じ、
開いていなければ何もしないという処理って可能ですか?
0611デフォルトの名無しさん2009/01/23(金) 00:08:50
>>610
ブックじゃなくてシート?
0612デフォルトの名無しさん2009/01/23(金) 00:28:23
>>610
ブックなら可能
やりかたは自分で調べろ
06136102009/01/23(金) 00:29:16
>>611
間違えました。
シートではなくブックです。
失礼しました。
0614デフォルトの名無しさん2009/01/23(金) 01:04:27
>>613
Workbooks( ).Close
06156102009/01/23(金) 01:16:51
>>614
それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。
06166032009/01/23(金) 01:22:49
長かったので問題の箇所まとめました。

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

この分岐で(入力値)
J0235-2PtAuX10
H0053-1PtX2
を拾ってしまうんですが、何が原因でしょうか。
0617デフォルトの名無しさん2009/01/23(金) 01:25:39
>>615
Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け
0618デフォルトの名無しさん2009/01/23(金) 01:37:15
XP SP3 Excel 2002 SP3

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

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

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

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

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

有難う御座います。

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

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

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

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

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

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

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

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

現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
0643デフォルトの名無しさん2009/01/24(土) 22:19:03
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ
0644デフォルトの名無しさん2009/01/24(土) 22:22:37
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな
書式の問題かもしれないし
0645デフォルトの名無しさん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でした。

この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。
0646デフォルトの名無しさん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
06476352009/01/25(日) 07:49:29
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。
0648デフォルトの名無しさん2009/01/25(日) 17:56:18
Open ファイル名 For 開き方 As #ファイル番号

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

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

もう一つ質問です。

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

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

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

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

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

というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
0657デフォルトの名無しさん2009/01/25(日) 21:02:48
うぜーよ
0658デフォルトの名無しさん2009/01/25(日) 22:30:01
べつにうざくはないが、よくそこまで親切にレスできるのかと関心する
職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで
0659デフォルトの名無しさん2009/01/25(日) 23:23:32
EXCEL97です
ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A"
このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか
0660デフォルトの名無しさん2009/01/25(日) 23:36:15
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"
0661デフォルトの名無しさん2009/01/25(日) 23:51:02
>>656
丁寧にありがとうございます。

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

例えば

変数=20.222
if 変数>10.333 then

これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。
0664デフォルトの名無しさん2009/01/26(月) 19:51:29
>>663
変数="20.222 "
if value(trim(変数)) > 10.333 then
06656642009/01/26(月) 19:58:01
すまん、ワークシート関数と勘違いしました。
val(trim(変数))
0666デフォルトの名無しさん2009/01/26(月) 20:58:54
>>663
元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」
0667デフォルトの名無しさん2009/01/26(月) 20:58:56
質問よろしいでしょうか。
乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。
会社のPCで結果が出るまでに2時間はざらなのですが、

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

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

しかし、前の乱数値の結果が次に影響するような演算なので、
追い越してなにかを処理しておくというのは意味なさそうです。
0668デフォルトの名無しさん2009/01/26(月) 21:00:29
>>663
csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
0669デフォルトの名無しさん2009/01/26(月) 21:04:13
>>667
そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。
06706672009/01/26(月) 21:10:32
>>669
ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…
0671デフォルトの名無しさん2009/01/26(月) 21:11:18
http://www.nicovideo.jp/watch/sm5947975
0672デフォルトの名無しさん2009/01/26(月) 21:14:15
>>668
単純なcsvの読み込みなら、たとえ "  123   " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。
0673デフォルトの名無しさん2009/01/26(月) 21:17:18
>>670
そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。
0674デフォルトの名無しさん2009/01/26(月) 21:18:21
664-666
ありがとうございます。
明日試してみます。
0675デフォルトの名無しさん2009/01/26(月) 21:23:52
>>670
10億回程度のループならそんなに多いとは思わんけどな。

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

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

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

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

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

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

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

環境:Excel2007

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


0688デフォルトの名無しさん2009/01/27(火) 05:23:04
>>685
コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?
0689デフォルトの名無しさん2009/01/27(火) 05:38:13
>>685
「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
  MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub
0690デフォルトの名無しさん2009/01/27(火) 05:43:14
>>688
マクロが登録できるのはフォームコントロールの方だぞ
0691デフォルトの名無しさん2009/01/27(火) 06:11:34
>>686
そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
  Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?
0692デフォルトの名無しさん2009/01/27(火) 07:45:56
>>690
両方出来るぞ
06936852009/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の方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・
06946852009/01/27(火) 10:57:08
URL間違えました。こちらでした。

moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
http://www.moug.net/tech/exvba/0150059.htm
0695デフォルトの名無しさん2009/01/27(火) 16:07:22
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。
0696デフォルトの名無しさん2009/01/27(火) 16:13:46
>>695
いんじゃね
0697デフォルトの名無しさん2009/01/27(火) 16:19:40
ありが十匹!!
0698デフォルトの名無しさん2009/01/27(火) 20:14:57
>>693
一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから
0699デフォルトの名無しさん2009/01/29(木) 09:07:22
すみません初心者ですが質問です。
Msgboxに「月度を入力してください」と表示
→インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、
1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」
というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と
表示するにはどう組めばいいでしょうか。
○には入力した月数を出したいのですがよろしくお願い致します。
0700デフォルトの名無しさん2009/01/29(木) 09:08:34
>>699
VB初心者スレへどうぞ。
0701デフォルトの名無しさん2009/01/29(木) 11:00:04
>700
すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。
0702デフォルトの名無しさん2009/01/29(木) 12:15:27
>>699
流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ
0703デフォルトの名無しさん2009/01/29(木) 14:29:53
超初心者です。

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

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

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

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

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

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

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

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

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

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

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

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

として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。
これはなぜでしょうか?
0739デフォルトの名無しさん2009/01/31(土) 20:07:43
Public Property Get TestValue() As String
もしくは
Public Property Let TestValue(ByVal New_Value As Variant)

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

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

ありがとうございました。
0741デフォルトの名無しさん2009/02/02(月) 00:36:34
ブックAにブックBへのハイパーリンクを張って、ブックBの
Private Sub Workbook_Open()
内で色々と処理をしているのですが、
ブックA内のハイパーリンクをクリックした時にブックBを表示させずにその後の処理を実行する方法はありませんか?
0742デフォルトの名無しさん2009/02/02(月) 00:57:32
初心者です。教えてください。
今フォームを使ってデータの抽出をするプログラムを作っています。
データは階層構造になっています。
仮に3階層あるとして、フォームにその3階層をプルダウンで指定してやると条件に一致したデータが表示されるようにしたいのです。
その際、上位階層をプルダウンで指定すると、その上位階層が包含する下位階層のみが
プルダウンで表示されるようにしたいのですが、どうしたらいいのでしょうか。
フィルタオプションを使用しようと思うのですが、可能でしょうか?
困っています。教えてください。
0743デフォルトの名無しさん2009/02/02(月) 01:47:00
こんばんは。すみません、エクセルの質問させてください。

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

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

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

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

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

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

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

さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。
0759デフォルトの名無しさん2009/02/04(水) 21:30:54
疑似コントロール配列使おうよ
クラスの作り方工夫すれば、疑似コントロール配列にした上で
処理は同じだが対象は違うというようにも出来るし、
そもそもボタンがどのセル上に配置されてるかは取得できるし
0760デフォルトの名無しさん2009/02/04(水) 21:53:42
質問です
Sheets("sheet1").Select
Dim MyRange As Range
Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1"))
いくらやっても検索値がnothingになってしまいます
どこを変えればうまく検索できますか
0761デフォルトの名無しさん2009/02/04(水) 22:03:34
Sheets("Sheet2").Range("A1")に入っている値が
Sheets("sheet1")のA列に存在しないとnothingになるけど
0762デフォルトの名無しさん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)
0763デフォルトの名無しさん2009/02/04(水) 23:33:13
Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。
0764デフォルトの名無しさん2009/02/05(木) 00:03:24
質問です。
Dim v(1 To 10) As Long
とするのと
Dim a(1& To 10&) As Long
とするのはどっちがいいですか?
07657642009/02/05(木) 00:05:42
すいません。
vとaとなりましたが、どっちもvです。
0766デフォルトの名無しさん2009/02/05(木) 00:08:28
Columns("A")もまずいな。
シートモジュールに書いてるかも知らんしな。
ちゃんとシートくらいは指定汁.
0767デフォルトの名無しさん2009/02/05(木) 00:09:34
>>764
この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う
07687642009/02/05(木) 00:23:21
>>767
そうなんですか。ありがとうございます。
0769デフォルトの名無しさん2009/02/05(木) 11:43:29
OS XP / EXCEL2003 です。
仮に「A」というファイルがあったとして「A」のVBAから、
別のファイル「B」の「ActiveX コントールのコンボボックス」の値を参照することは可能でしょうか?
0770デフォルトの名無しさん2009/02/05(木) 15:25:43
sheet1を選択している状態で以下のマクロを実行しても
sheet2のAAAという文字列がBBBに置換されません

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

Worksheets("Sheet2").Select
Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
0771デフォルトの名無しさん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
みたいな感じにしなきゃいけない。
確認してないからオブジェクトのエラーが出るかもしれないけど、基本的な考え方としてはこんなところ。
0772デフォルトの名無しさん2009/02/05(木) 15:33:20
>>769
可能です
07737692009/02/05(木) 18:35:27
>>772 ご返答ありがとうございます。
もし良かったら何か例文を載せて頂けないでしょうか。
0774デフォルトの名無しさん2009/02/05(木) 19:10:09
フォーム上に配置したWEBブラウザコントロールを印刷したいのですがうまくいきません。
印刷はフォームのPrintFormメソッドを使っています。
コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが
WEBブラウザが配置されているところは空白になってしまいます。

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

乱数 = Int(Rnd(1) * 65536) + 1
セル = "A" & 乱数
Range(セル) = "文字"
0841デフォルトの名無しさん2009/02/10(火) 04:31:48
ありがとうございます●〜*
0842デフォルトの名無しさん2009/02/10(火) 04:40:29
>>840
できました〜。 ホント感謝です(^−^)
0843デフォルトの名無しさん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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

MsgBox ("こんにちは")

Next Cnt

End Sub


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

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

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

ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。
型を理解してない奴は、ほぼ100%お遊びマクロ。
0903デフォルトの名無しさん2009/02/14(土) 19:21:32
javascriptもお遊びですね
0904名無しという名無し2009/02/14(土) 19:21:39
質問なんですけど
ExcelってXLSのことなんですか?
だとしたらここで質問したいんですけど
間違ってたらいってください

今、Excel viewer2003で
XLSのファイルを見ようとしてるんですけど
「コマンドラインオプションの構文エラーです
 Command /?を入力するとヘルプが表示できます」
とか出てきて訳わかんないんですけど詳しい人がいたら教えてください。
お願いします。
(一応、ググって見ましたが、僕の見る限りなかったと思います)
0905名無しという名無し2009/02/14(土) 19:24:16
すみません上のやつ
書くとこミスりました
すいませんがスルーでお願いします
本当にすいませんでした
0906デフォルトの名無しさん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")」が無いと正しく動作しないのでしょうか?
0907デフォルトの名無しさん2009/02/14(土) 21:26:41
何で自分で調べないの?
0908デフォルトの名無しさん2009/02/14(土) 21:29:02
調べたんですけど分からなかったです。スマンコ
0909デフォルトの名無しさん2009/02/14(土) 21:55:56
>>908
Offset()もRange()もRange型オブジェクトを返す。両者の違いは、
Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。
Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。
両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。

この場合に限って言えば、Range("A1")は単なる無駄。
わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?
0910デフォルトの名無しさん2009/02/14(土) 22:23:26
調べてない奴の台詞。> 調べたんですけど分からなかったです。
0911デフォルトの名無しさん2009/02/14(土) 22:29:07
>>909
なるほど!
調べたけど分からなかったことが分かりました!
ありがとうございます!
0912デフォルトの名無しさん2009/02/14(土) 22:50:20
┐(´ー`)┌
0913デフォルトの名無しさん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

で動きません。

よろしくお願いします。
0914デフォルトの名無しさん2009/02/14(土) 23:12:30
マルチすんな
0915デフォルトの名無しさん2009/02/15(日) 01:10:16
定数戦隊
vbRed
vbBlue
vbGreen
vbYellow
vbPink

敵か味方か、謎の戦士
vbBlack
0916デフォルトの名無しさん2009/02/15(日) 22:38:43
エクセルで、全シートに同様の処理を反映させたいのですが

Worksheets.Select

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

Next 行番号

と書くと「.cellsが不正」と言われます。
どのあたりがおかしいのでしょうか。
0917デフォルトの名無しさん2009/02/15(日) 23:04:53
with で囲んでないのに、何でピリオドから始まってるの?
0918デフォルトの名無しさん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
0919デフォルトの名無しさん2009/02/16(月) 14:20:01
>>918
マクロの記録してから質問しろ
0920デフォルトの名無しさん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
0921デフォルトの名無しさん2009/02/16(月) 22:41:43
日記はやめてください
0922デフォルトの名無しさん2009/02/17(火) 01:28:52
おまんこ Then
0923デフォルトの名無しさん2009/02/17(火) 09:08:00
気持ちよくて End If
0924デフォルトの名無しさん2009/02/17(火) 17:07:37
エラー
存在しないオブジェクトを指定しています
0925デフォルトの名無しさん2009/02/17(火) 20:50:55
ちんこがないのかまんこがないのか
それがもんだいだ
0926デフォルトの名無しさん2009/02/18(水) 21:54:34
include<スタジオ.エッチ>
0927デフォルトの名無しさん2009/02/19(木) 20:46:29
どうしたVBA!
0928デフォルトの名無しさん2009/02/19(木) 21:48:56
もうやだこのスレ
0929デフォルトの名無しさん2009/02/19(木) 23:52:44
じゃあ何で未だにここに居るの?
0930デフォルトの名無しさん2009/02/20(金) 01:05:45
そこにスレがあるから
0931デフォルトの名無しさん2009/02/20(金) 02:49:54
約65万の全てのスレに書き込みしてるのでなければ、その理由はおかしい
0932デフォルトの名無しさん2009/02/20(金) 02:57:38
「そこに山があるから」と言った人も、全世界のすべての山を制覇したわけではない
むしろ登ってない山のほうがはるかに多い
0933デフォルトの名無しさん2009/02/20(金) 03:23:39
「そこに山があるから」という理由で【嫌な】山に登る奴は居ない
故にその例えは間違っている

単純にこのスレに来た理由を聞いてるのではなく
「もうやだ」と言いながらも来る理由を聞いているということをお忘れなく
0934デフォルトの名無しさん2009/02/20(金) 04:10:36
コピペにマジレスする男の人って
0935デフォルトの名無しさん2009/02/20(金) 04:33:19
くやしいのう、くやしいのうwww
0936デフォルトの名無しさん2009/02/20(金) 11:03:35
>>933
嫌な山という風には
普通とらない
つらいのに登る理由が
「そこに山があるから」
0937デフォルトの名無しさん2009/02/20(金) 12:16:50
えらいどーでもいいネタで盛り上がってるな
0938デフォルトの名無しさん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
0939デフォルトの名無しさん2009/02/20(金) 20:22:06
2chだからインデントは表示されないんだけど、
インデント無いと、マジで可読性って下がるんだな・・・。
0940デフォルトの名無しさん2009/02/20(金) 20:39:04
そういう問題じゃないと思うぞ
0941デフォルトの名無しさん2009/02/20(金) 21:01:40
半角スペース2個を全角スペース1個に置換してから貼るべし
0942デフォルトの名無しさん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
単純に置換しちゃうと文字列定数が壊れることがあるから注意な
0943デフォルトの名無しさん2009/02/20(金) 22:09:35
Option Explicitとかいらねーし
0944デフォルトの名無しさん2009/02/20(金) 22:57:16
初歩的な質問なんですが
複数の名前があるとします。
例
鈴木、木村、田辺、鈴木、林田、村瀬、田中、田辺、室田、田辺
この場合鈴木が2名、田辺が3名と重複してるのですが
これをマクロで同じ名前をひとつにするにはどうすればいよいでしょうか?
鈴木、木村、田辺、林田、村瀬、室田のようにしたいのです。
0945デフォルトの名無しさん2009/02/20(金) 23:18:53
>>936
0946デフォルトの名無しさん2009/02/20(金) 23:20:37
ピボットテーブルでええやん
0947デフォルトの名無しさん2009/02/20(金) 23:23:03
どこに名前があって、ひとつにした名前をどうしたいんだ
0948デフォルトの名無しさん2009/02/20(金) 23:24:35
>>944
ぼくなら、まず名前を並び替えて
木村、鈴木、鈴木、田中、田辺、田辺、田辺、林田、村瀬、室田、
こういう風に同じ名前が隣り合うようにした後で
左から右へ選択を一個づつずらしながら、
「今選択されてるセルの内容が、一つ左のセルと同じならそのセルを削除する」っていう風にします
0949デフォルトの名無しさん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
0950デフォルトの名無しさん2009/02/20(金) 23:41:24
collection使え
0951デフォルトの名無しさん2009/02/21(土) 00:00:23
>>950
現時点では処理結果をどうしたいのか元質問に明記されてないのでなんとも言えないが、
Collectionオブジェクトだと一覧を取り出すのにループ回す必要があるから美しくない。
どうしてKeysプロパティを用意しなかったんだろう。
0952デフォルトの名無しさん2009/02/21(土) 06:40:05
配列にpushして行くのが一般的ではなかろうか。
0953デフォルトの名無しさん2009/02/21(土) 09:29:02
pushできる配列など無い
0954デフォルトの名無しさん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
0955デフォルトの名無しさん2009/02/21(土) 10:11:42
削除可能なシート状にデータがあるかどうかわからないから、VBAのコードでやってるんでしょ
0956デフォルトの名無しさん2009/02/21(土) 11:43:41
シートなんてただの二次元配列じゃないか。
シート使うより、プログラム上で配列組んだ方がよっぽどやりやすい。
0957デフォルトの名無しさん2009/02/21(土) 11:50:07
質問です。
コンボボックスのプルダウンリストに5つのデータを表示させたいと思っています。
元のデータは1行5列に記入されています。それを5行1列で表示させることは可能でしょうか?
よろしくお願いします。
0958デフォルトの名無しさん2009/02/21(土) 15:41:47
>>949
On Error Resume Next 必要ないのに使うな
d(n(i))= ""
0959デフォルトの名無しさん2009/02/21(土) 16:01:24
>>957
データはどんな順番で並んでいても大丈夫。一直線じゃなくて完全にバラバラでも。
あとVBA関係ない質問はExcel相談所へ行くこと。
0960デフォルトの名無しさん2009/02/21(土) 18:49:46
>>949
On Error Resume Next しっぱなしすな
0961デフォルトの名無しさん2009/02/21(土) 18:52:23
ほかの場所でOn Error使ってるとこの方法はアウトだから、
どうしても使う必要がある時は別プロシージャに飛ばすしかないな
0962デフォルトの名無しさん2009/02/21(土) 21:58:06
てか、配列内に既に同じ物が入ってるかどうか監査してからpushすりゃいいじゃん。
VBAにはpushないから、redim preserveで増やす事になるだろうけど。

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

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

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

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