Excel VBA質問スレ Part9at TECH
Excel VBA質問スレ Part9 - 暇つぶし2ch1:デフォルトの名無しさん
08/12/04 15:42:51
ExcelのVBAに関する質問スレです

前スレ スレリンク(tech板)

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)


2:デフォルトの名無しさん
08/12/04 15:43:49
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
08 スレリンク(tech板)


3:デフォルトの名無しさん
08/12/04 18:29:10
>>1

前スレ1000立てもせずに埋めやがって
氏ねばいいのに

4:デフォルトの名無しさん
08/12/04 20:11:57
EXCEL VBAで実現可能で
おまいらが一番すごいと思うものって何?
参考までに教えてほしい

5:デフォルトの名無しさん
08/12/04 21:03:29
Shift =シフト
alt =アルト
Delete =デリート
VBA =ブバ

6:デフォルトの名無しさん
08/12/04 21:19:26
アルトw

7:デフォルトの名無しさん
08/12/04 21:35:09
無理やりカタカナ表記するなら、オゥトが近いけどな。

8:デフォルトの名無しさん
08/12/04 21:51:50
近くないし、半可通のスレ違い得意語りはどうでもいいから

9:デフォルトの名無しさん
08/12/04 23:25:22
オルトとか言うオチじゃないよね?

10:デフォルトの名無しさん
08/12/05 10:30:09
スレ違いでごめん・・・。
excel VBAからSAS参照できるんだけど、どこまで使えるのかがリファレンス見てもさっぱり・・・。
他言語とのマッシュアップでお勧めの本ってありますか?
もしくは他スレへ誘導してくれるとありがたいです。

11:デフォルトの名無しさん
08/12/05 10:45:00
WebBrowserの使い方 教えてください

12:デフォルトの名無しさん
08/12/05 11:45:16
>>10
そのSASとやらのスレに行けよ

13:デフォルトの名無しさん
08/12/05 23:14:09
>>11
IEのアイコンをダボークリッ

14:デフォルトの名無しさん
08/12/06 01:23:02
SendKeys "あア"
が「ああ」になるけど、半角カタカナは送れんの?

15:デフォルトの名無しさん
08/12/06 02:05:44
試してみた。ちゃんとVBEのカーソル位置に「あア」と入力された。
Sub a()
  SendKeys "あア"
End Sub

16:デフォルトの名無しさん
08/12/06 15:15:51
excel2007でダメだった
あ「あ」←未確定状態


17:デフォルトの名無しさん
08/12/06 16:18:23
2003でも2007でも問題ないぞ。
うちがATOKだからか?

18:デフォルトの名無しさん
08/12/08 11:59:35
Excel2002 + Microsoft IME Standard 2002 ver.8.1、VBE上で>>15を実行

IME     結果
OFF    :あア
ひらがな :あ「あ」
全角カナ :あ「ア」
全角英数:あ
半角カナ :あ「ア」
半角英数:あ
※「」内は未確定状態

19:デフォルトの名無しさん
08/12/08 15:28:30
XP SP3 + Excel 2007 + Microsoft Office IME 2007

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

メモ帳に
あ「あ」

IME English
?? に

IMEに依存する模様

20:デフォルトの名無しさん
08/12/08 22:25:49
VBA初心者になんかお題をください。

21:デフォルトの名無しさん
08/12/08 23:06:58
>>20
VBAで数独。人に解かせる(GUI)のでもプログラムに解かせるのでもよし。
問題生成もできたらなおよし。

22:デフォルトの名無しさん
08/12/08 23:14:13
100マス計算生成マクロ。
経過秒数、正答率表示機能付き。

23:デフォルトの名無しさん
08/12/09 00:59:28
アドイン化が猿でもわかるサイトor本ってある?

24:デフォルトの名無しさん
08/12/09 11:00:26
VBAを起動し「コードの表示」をクリック(フォームをWクリック)すると「メモリが不足しています。」と表示され、
コードの書き込みが一切できません。
新規で開いたエクセルファイルで、まっさらな状態でも
「メモリが不足しています。」と表示されます。
対処法はありますでしょうか?

Mac OS 9.2.2 Microsoft Office 2001 バージョン9.0(2615)です。あと何か必要な情報はありますか?


25:デフォルトの名無しさん
08/12/09 11:58:26
>>24
URLリンク(support.apple.com)

26:24
08/12/09 12:07:46
>>25
べらぼうに割り当てを増やしてもだめなんだよ。

27:デフォルトの名無しさん
08/12/09 12:55:43
>>26
オマエのいってる「べらぼう」がなんだか知らないけど、
メモリがたりないんだろ?

28:24
08/12/09 14:43:36
>>27
そういう基本的なことじゃないらしいというところまではわかっているんですけどね。
オマエ呼ばわりするオタクがいるところにきたオレがバカだった。

29:デフォルトの名無しさん
08/12/09 14:51:50
>>28
わかってねーじゃん

30:デフォルトの名無しさん
08/12/09 14:53:43
要するにVBEが使い物にならないんだな
再インスコくらいは試してるよな?
2chで質問する前にこんな基本的なこともしてないならマジでバカだな

31:デフォルトの名無しさん
08/12/09 22:21:16
>>24
こちらへどうぞ
URLリンク(pc11.2ch.net)

32:デフォルトの名無しさん
08/12/09 22:48:23
FOMの本で勉強中なんですが
配列について教えてください。

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

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

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

CellsだとR1C1?形式みたいので列も行も数字で指定するってのはわかったのですが
どこで"下方向"ってのを指定してるのか
また、( 8,3 + i) ←列と行を指定してから変数iを入れる感じの、これのほうがしっくり来る気がするのですが
どういうことなんでしょうか?

33:デフォルトの名無しさん
08/12/09 23:11:07
(row,col)ってことです。

34:デフォルトの名無しさん
08/12/10 01:47:18
便乗質問。>>32のサンプルでわからない部分があるのですが
dim As Integer
これはどういう意味ですか?

35:デフォルトの名無しさん
08/12/10 01:48:57
電卓のテンキーと電話のテンキーみたいなもの

36:デフォルトの名無しさん
08/12/10 07:01:07
変数の宣言が判らないレベル?

37:デフォルトの名無しさん
08/12/10 08:18:23
すみません。

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

メンテを楽にする条件で、変数と代入で可能でしょうか。
VBAが初めてなので、ちょこちょこ調べながらなのですが、
方向性がつかめなくて・・・

38:デフォルトの名無しさん
08/12/10 10:44:31
テンプレ読めないやつ多いな・・・

>>37
1行目に業務を入れて2行目にその担当を出したい
今はIFでやってるから業務が増えてくると大変なのでどうにかしたい
ってところか?
LOOKUPとかじゃだめなのか?

39:デフォルトの名無しさん
08/12/10 11:48:48
デフォルトの型をバリアントから変更する方法でもあるのかと思ったけど試したらエラーになったから
Dim i As Integerの書き間違い?

コピペすれば間違いようがないと思うんだけど、もしかしてパソコン使わずに本だけで勉強してんのかな。

40:デフォルトの名無しさん
08/12/10 17:03:11
>>37
VBAやったことない人なら、lookup なり作業列なり使って、
考え方から整理し直した方がどう考えてもラク
今の考え方のままだと、VBAでも if でネストしまくったわかりにくいコードになりそう
改行とインデントがある分読みやすいだけみたいな

41:デフォルトの名無しさん
08/12/10 18:46:07
すみません・・・
VLOOKUPであっさり出来ました・・・orz

VBAもちょこちょこ勉強していきます。
スレ汚しすみませんでした

42:デフォルトの名無しさん
08/12/10 19:40:57
WindowsXP&Excel2003で質問です。
印刷された時に、セルに入力されているデータが長すぎて、
全文表示されなかったりしますが、
そういう状態かどうか調べるにはどうしたらいいでしょうか?

43:デフォルトの名無しさん
08/12/10 19:48:51
>>42
文字数や文字バイト数(unicodeだと全部2バイトだから変換しる。)で情報量を調べておいて、、
予め余裕持って設計しましょう。
80バイト毎にheightをX倍してやるとかね。

印刷すると崩れるのは仕方の無い事。
崩したくないならば、excelじゃなくて優秀なドローツールを使うか、ラスタライズしてから印刷するとか。


44:デフォルトの名無しさん
08/12/10 20:48:45
左から6文字が空白ならという条件式は次のでいいですか?
xp 2003 空白文字も含めて全て全角にしています。

if left$(moziretu,6)=space(6) then


45:44
08/12/10 20:50:50
効いていないので効きました。
よろしく


46:デフォルトの名無しさん
08/12/10 21:09:53
if left$(moziretu,6)="      " then

47:デフォルトの名無しさん
08/12/10 21:58:41
>>44
mid関数

48:デフォルトの名無しさん
08/12/10 23:47:47
>>47
左から6文字「目」じゃない

49:デフォルトの名無しさん
08/12/11 10:42:48
>>
それは半角の空白6文字かどうかの判定式。
全角6文字の空白かどうかなら
If Left$(moziretu,6)=String$(6," ") then
混在だとちょっと面倒かな?

50:デフォルトの名無しさん
08/12/11 11:48:18
>>49
全角半角考慮してこんなのはどうかな?
LTrim$(Left$(moziretu, 6)) = ""

51:デフォルトの名無しさん
08/12/11 13:07:48
>>50
なるほどね。
それが一番いいだろうな。

52:デフォルトの名無しさん
08/12/11 16:54:36
StrComp(Left$(moziretu,6),Space(6),vbTextCompare)

53:デフォルトの名無しさん
08/12/11 17:24:22
空白文字も含めて全て全角にしています、って書いてあるし、
数も6個で固定なら>>46で充分でしょ
わざわざ余分な関数使う意味がわからない

54:50
08/12/11 18:16:07
>>53
>>45を読めばその一言が信用できないことくらい分かるだろ?

49だけ読んでレスした漏れが言えた事じゃないがw

55:デフォルトの名無しさん
08/12/11 20:34:08
>>43
ありがとうございました。
バイト数を数える事で対応してみます。

56:デフォルトの名無しさん
08/12/13 03:22:22
VBAフォームに、VBのFlexGridのようなマス目の入ったものを
表示させてEXCELのシートとやりとりしたいのだが、
そういったコントロールってないの?
今使ってるのがEXCEL2000なんだが。。。

57:デフォルトの名無しさん
08/12/13 03:48:02
アホ発見

58:デフォルトの名無しさん
08/12/13 14:45:20
会社でやってる作業を自動化したくてVBAに興味を持ったんですが、よい参考資料が見つかりません。

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

環境はWin2kでExcel 2003です。Cとか弄ったことがあるのでまるっきり初心者ではないです。

59:デフォルトの名無しさん
08/12/13 14:56:02
丸っきりの初心者ではないと言い張るのなら、参考資料など見つからなくても何とかするもんだ。

60:デフォルトの名無しさん
08/12/13 16:22:48
>>56
owc

>>58
msdnのヘルプ

61:デフォルトの名無しさん
08/12/13 18:39:41
本といわれてヘルプを紹介するアホはどうにかならんかね。


62:デフォルトの名無しさん
08/12/13 18:43:12
どうにもならんよ

63:デフォルトの名無しさん
08/12/13 19:36:14
大きな本屋に行って参考書探すくらいの努力したら?

64:デフォルトの名無しさん
08/12/13 20:57:44
経験者なら本なんていらんだろ。
VBAくらい中学生でも使え紆余w

65:デフォルトの名無しさん
08/12/13 22:32:27
折れは、このスレだったか昨年知った次の本を薦める。
「技術評論社 Excel VBA ポケットレファレンス」
成りは小さいが、他のどの本よりも役に立った。
今年、確か、2007対応の改訂版が出たと思うが2003等も使えるように整理してあるはず。


66:デフォルトの名無しさん
08/12/13 22:55:26
ヘルプを見るのは常識として
本なら俺も↑のポケットリファレンスだな。
あとはできる大事典VBAもいい
勉強中なら本のほうがやりやすい所あるし。



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

>65,66で紹介して頂いたポケットリファレンスを購入してきました。
ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。

68:デフォルトの名無しさん
08/12/14 16:42:59
>ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
だったらそれを先に書いておけよ。

69:デフォルトの名無しさん
08/12/14 17:19:15
それくらい読み取れよアホ

70:デフォルトの名無しさん
08/12/15 02:04:11
まあ解決したみたいだからいいじゃないか。

71:デフォルトの名無しさん
08/12/15 16:37:15
2007は関数の追加や仕様の変更が色々あったおかげで説明が増えて少し読みにくくなったので、
もし2003で使うならブックオフあたりで古いやつを探すといいかも。

72:デフォルトの名無しさん
08/12/15 23:15:34
スレチでしょうか…?初心者です。質問させて下さい
WindowsXP、Excel2000です

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

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

長文失礼しました…

73:デフォルトの名無しさん
08/12/16 00:01:40
仕様です。
おとなしくFlashの勉強するのが吉。

74:72
08/12/16 04:33:53
>>73
レスありがとうございます。
仕様ですか…Excelの描写速度が遅いことは知っています。
しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。

コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。
自信はありませんが、Sleepが問題な気がします。どうでしょうか。

75:デフォルトの名無しさん
08/12/16 04:41:10
「否」でなく「非」でした

76:デフォルトの名無しさん
08/12/16 06:08:43
だったらコードを晒したら?
それができないなら自分で勝手に調べて答えを出せばいいよ。

77:デフォルトの名無しさん
08/12/16 10:00:26
データ型について質問です。
エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが
時間の時も日付型(DATE)の方が良いのでしょうか?
それともSingleやDoubleでしょうか?

VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・

78:デフォルトの名無しさん
08/12/16 12:24:26
>>76
やっぱり、コード見ないとどうしようもないですよね…
お騒がせしました

79:デフォルトの名無しさん
08/12/16 13:09:50
そりゃぁ、Sleepが問題だなんて認識している香具師とまともに会話が成立するとは思えないもんねぇ。

80:デフォルトの名無しさん
08/12/16 13:10:45
>>77
勉強を兼ねているんだろ。全部やれ。

81:デフォルトの名無しさん
08/12/16 13:15:49
>>80
試してみてどちらでもできるということは確認済みなんです
でも一般的に、どちらがベターなのかなと思いまして


82:デフォルトの名無しさん
08/12/16 13:27:29
一般的には、シート関数だな。

83:デフォルトの名無しさん
08/12/16 15:03:10
>>79
Sleep関数は問題無いんですね?ありがとうございます!安心しました
Sleepが使えないとなると凄く面倒になるので…

以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、
その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。
自己解決出来るよう、もう少し頑張ってみます

84:デフォルトの名無しさん
08/12/16 15:42:22
エクセルでVBAを使ってじゃんけんゲームを作れと言われたのですがわかりません
教えてください


85:デフォルトの名無しさん
08/12/16 15:50:10
宿題丸投げはご遠慮ください。
VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。

86:デフォルトの名無しさん
08/12/16 21:46:59
VBスレでも宿題はお断りだw

87:デフォルトの名無しさん
08/12/16 23:12:04
V=チョキ
B=グー
A=パー

としてじゃんけんを楽しんでください。

88:デフォルトの名無しさん
08/12/17 07:58:32
意地悪なやつらだな。
逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。
おまえらのご自慢のテクニックを披露できるチャンスだぞ。

89:デフォルトの名無しさん
08/12/17 09:42:52
と学生が申しております
仕事で使うわアホ


90:デフォルトの名無しさん
08/12/17 11:06:52
>>89
VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw

91:デフォルトの名無しさん
08/12/17 12:55:10
>>89>>90
どんなことに使ってるの?

92:デフォルトの名無しさん
08/12/17 13:49:36
ルーチンワークは大体そう
他は資料をデータベースっぽく正規化するために使うことも

・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね

93:デフォルトの名無しさん
08/12/17 13:51:22
SAPのBWなんかはExcelマクロ

94:デフォルトの名無しさん
08/12/17 13:57:12
オフコンからデータ(CSVとか)受け取って
帳票(見積書とか)の形に整えて印刷とか

95:デフォルトの名無しさん
08/12/17 18:51:26
WindowsXP、Excel2002ユーザの質問です。

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

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

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

参考になる情報をご存知の方、教えてください。

96:デフォルトの名無しさん
08/12/17 19:27:43
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]


97:デフォルトの名無しさん
08/12/18 01:52:45
問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで
VBAで整形&正規化してる。なんか>>94とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。

中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。

98:デフォルトの名無しさん
08/12/18 10:56:24
何年前に作ったシステムだよ?

99:デフォルトの名無しさん
08/12/18 11:40:21
wikiによるとPC-9821が入ったのは早くても15年位前らしいな

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

まぁスレ違いだしこの辺で流れ斬ろうか・・・

100:デフォルトの名無しさん
08/12/18 13:42:45
ダム端って言うんだよ

101:sage
08/12/18 15:09:13
いまユーザーフォームを利用してモグラたたきを作っているのですが
じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが
うまく作用せず、モグラの動きのプログラムが終了すると
再びカウントダウンするようになってしまいます。両方とも独立して動くように
したいのですがよい方法はありませんか。

102:sage
08/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

103:sage
08/12/18 15:18:27
ソースの続き

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


104:sage
08/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




105:sage
08/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


106:sage
08/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

107:sage
08/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

108:sage
08/12/18 15:30:53
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば
教えてください。

109:デフォルトの名無しさん
08/12/18 15:31:07
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。
っつってもわかんねーかな。

110:デフォルトの名無しさん
08/12/18 15:46:55
<<109 さん
おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!

111:デフォルトの名無しさん
08/12/18 20:25:38
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。

それをif判定で、試してみたところうまく結果がでませんでした。
プルダウンの選択式だと、"○"として扱われないのでしょうか?

112:デフォルトの名無しさん
08/12/18 20:46:33
>>111
何のプロパティをチェックしてるの?

113:デフォルトの名無しさん
08/12/18 20:48:17
>>112
cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・

114:デフォルトの名無しさん
08/12/18 21:40:37
>>113
実際のif文は?

115:デフォルトの名無しさん
08/12/18 21:41:19
>>113
そもそも、プルダウンじゃなくすれば判定できるの?

116:デフォルトの名無しさん
08/12/18 21:48:14
>>114
do until なんとか =""
with ほにゃらら
if .cells(x, y).value = "○" then
処理
end if
loop

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

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



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

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

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

x = x + 1
i = i + 1

End If
Loop

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

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

どちらもエラーの原因じゃないけど。
というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。
すまんな。

119:デフォルトの名無しさん
08/12/18 22:46:18
あとcolums→columns、だね

それでもif文の行にはエラーは出ない。
力になれなくてすまんな。

120:デフォルトの名無しさん
08/12/18 22:48:29
そうでした^^;
たしかにインクリメントしないといけませんね

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

x = 1
i = 2
y = 4


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

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

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

Loop

End Sub


これでやったらif文にオブジェクトはプロパティかメソッドをサポートしてない
ってでてまたエラーになってしまいました

121:デフォルトの名無しさん
08/12/18 22:53:48
ありがとうございます!
columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです

122:デフォルトの名無しさん
08/12/18 23:16:55
失礼します


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

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

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

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

const で指定したセルが参照する値を格納することはできないのでしょうか?

123:デフォルトの名無しさん
08/12/18 23:19:36
セル参照だけならrangeオブジェクト使いなさい。
シートまで含むならまずconstの値を工夫しなさい。

124:デフォルトの名無しさん
08/12/18 23:21:20
>>122
const mojicell as string = "B2"
worksheets(range(mojicell).value).cells(...

125:デフォルトの名無しさん
08/12/18 23:50:23
>>124
これだと
シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが
シート2からこのマクロを実行してシート1にあるセルを参照するとなると、
できなくなるのでは?

126:デフォルトの名無しさん
08/12/19 00:50:28
>>124
これだとエラーでます・・・

127:デフォルトの名無しさん
08/12/19 00:59:34
A17にテストという文字をセットしておくとします

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

これだと下の文がインデックスが有効範囲にないとエラーでます

128:デフォルトの名無しさん
08/12/19 01:03:33
>>127
"A17"は、シート名じゃねーだろ

129:デフォルトの名無しさん
08/12/19 01:06:10
>>128
これの意味するところは
range("A17").value = テスト   という所なのでは?
よって
sheets("テスト")  と>>124さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz

130:デフォルトの名無しさん
08/12/19 01:16:52
>>129
どのシートの"A17"で
どこのマクロだよ

131:デフォルトの名無しさん
08/12/19 01:18:18
>>129
右辺を書け!

132:デフォルトの名無しさん
08/12/19 01:23:35
sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております

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


でも、なぜか
print Range(moji).value
テスト
とは表示されるのに、先ほどの下の文では表示されません


133:デフォルトの名無しさん
08/12/19 01:26:27
Sheets(Range(moji).Value).Cells(3, 1).Value

これではインデックス範囲のエラーがでますorz

134:デフォルトの名無しさん
08/12/19 01:35:00
実際のファイルを作って、アップしろ

135:デフォルトの名無しさん
08/12/19 01:42:37
Sub tes2()
Const moji As String = "A17"
Sheets("Range(moji).Value").Cells(3, 1).Value
End Sub

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

このマクロをsheet("テスト")にて実行する方法ということです
今のままじゃエラーがでますので

136:デフォルトの名無しさん
08/12/19 01:46:07
>>135
実際に作ったものをアップしろって

137:デフォルトの名無しさん
08/12/19 02:16:52
まったくわからない・・・

138:デフォルトの名無しさん
08/12/19 02:19:01
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。

質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。
const moji as string = "A17"
debug.print worksheets(sheet(1).range(moji)).cells(3,1)

139:デフォルトの名無しさん
08/12/19 02:22:16
>>138
それを実行してみたところ型が一致していません。とでました。

140:デフォルトの名無しさん
08/12/19 02:23:02
>>138

>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。

141:デフォルトの名無しさん
08/12/19 02:24:54
シートの名前は
1がSheet1
2がテスト
です。

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

で、お教え頂いたマクロを実行したところ>>139のエラーがでました。
const moji as string = "A17"
debug.print worksheets(sheets(1).range(moji)).cells(3,1)

142:デフォルトの名無しさん
08/12/19 02:26:16
>>141
だから、実際のものをアップしないと話にならねーって

143:デフォルトの名無しさん
08/12/19 02:35:29
>>138
デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・

144:デフォルトの名無しさん
08/12/19 02:37:35
うーむ、簡単に見えてむずかしいようですね・・・

145:デフォルトの名無しさん
08/12/19 02:41:18
>>144
オマエが単純に間違ってんだよ。
現物をアップしろよ

146:デフォルトの名無しさん
08/12/19 02:43:48
ごめんよ、テストなんてしてなかったからさ。

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

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

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

End Sub

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

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

これでエラーがでてしまうということです。下から2行目のところにエラーが・・・

148:デフォルトの名無しさん
08/12/19 02:45:00
>>147
それはもういいんだよ。
現物上げろよバカ

149:デフォルトの名無しさん
08/12/19 02:45:47
>>146
さすがにこれは長いですね・・・

150:デフォルトの名無しさん
08/12/19 02:46:35
>>148
現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・


151:デフォルトの名無しさん
08/12/19 02:47:40
>>150
こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。

152:デフォルトの名無しさん
08/12/19 02:48:58
>>150
概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ


153:デフォルトの名無しさん
08/12/19 03:05:44
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。

>>149
長いのが気になるだけなら別関数にしてね^^

154:デフォルトの名無しさん
08/12/19 03:06:30
でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね

155:デフォルトの名無しさん
08/12/19 03:10:01
>>154
オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。

156:デフォルトの名無しさん
08/12/19 03:11:19
>>155
先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・

157:デフォルトの名無しさん
08/12/19 03:13:36
ごめん。それは俺のミス。

以上で終了──

158:デフォルトの名無しさん
08/12/19 03:13:43
>>156
rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。

159:デフォルトの名無しさん
08/12/19 03:31:01
おぉ。rangeってrangeなのね。そうなのね。
そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz

160:デフォルトの名無しさん
08/12/19 07:04:25
rangeが指定する値を保存する方法って?

161:デフォルトの名無しさん
08/12/19 07:10:54
オブジェクト変数にrangeをセット

162:デフォルトの名無しさん
08/12/19 13:17:19
>>147
質問するとき小文字でコードアップするんじゃねーよ。
実際にVBEからコピペしろ。
回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。

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

と.Valueが抜けてるから型が一致しないとなるんだよ。
最後の.Valueはなくても動くが途中のは必須。
>>158が書いてるのはこういうこと。

163:デフォルトの名無しさん
08/12/19 13:22:11
>>162
その発言、なんかのギャグ?

164:デフォルトの名無しさん
08/12/19 13:25:02
>>162
流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?

165:デフォルトの名無しさん
08/12/19 14:00:42
日本人はひとつのジョークで3回笑う
1回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき


166:デフォルトの名無しさん
08/12/19 14:09:44
excel2002 SP3を使っています。

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

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

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

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

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

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

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

何がいけないのか教えていただけますでしょうか。お願いします。

167:デフォルトの名無しさん
08/12/19 14:13:32
>>166
アクティブにしないとセレクトできないんじゃないの?


168:デフォルトの名無しさん
08/12/19 14:24:07
>>167
そうなんですか。困ったな。。。

普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?

169:デフォルトの名無しさん
08/12/19 14:40:39
Worksheets("IV").Range("B2:B96").Copy
Worksheets("IV").Range("C2").Insert Shift:=xlToRight
Worksheets("IV").Range("C2").PasteSpecial ...
Application.CutCopyMode = False


170:デフォルトの名無しさん
08/12/19 14:51:43
>>169
おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。

171:デフォルトの名無しさん
08/12/19 14:56:51
>>169
できたああああ!
ありがとう!!!!
感謝感謝!!!!

172:デフォルトの名無しさん
08/12/19 20:04:42
質問させてください。
指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。

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

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

よろしくお願いします。

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

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

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

ファイルは以下のやつをみていただければわかりやすいかとおもいます
URLリンク(www.dotup.org)

174:デフォルトの名無しさん
08/12/19 22:38:02
101で質問したものです。
もぐらたたきが大まかですがだいたいできたので
UPします 
URLリンク(www.mediafire.com)
URLリンク(www.mediafire.com)

まだもんだいはありますがよろしければ批評してください

175:デフォルトの名無しさん
08/12/19 23:33:05
>172
配列数式でも良ければ
{=SUM(1/COUNTIF(A1:C3,A1:C3))}

176:デフォルトの名無しさん
08/12/20 00:54:59
>>172
配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。

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




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

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

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

削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。

178:デフォルトの名無しさん
08/12/20 08:34:25
>タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。

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

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

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

追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?

179:デフォルトの名無しさん
08/12/20 12:23:58
すみません。CLASSモジュールの書き方がわからないんですが
どこかに説明しているサイトないですか?

180:デフォルトの名無しさん
08/12/20 12:29:58
>>178
元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。

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

いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。

181:デフォルトの名無しさん
08/12/20 19:32:18
Excel2003を使ってます。
VBAの勉強をしたいのですが、良い本や教材はありますでしょうか?
バカでもわかるようなのでいいです。

182:デフォルトの名無しさん
08/12/20 22:48:34
VBAで何やりたいの?


183:デフォルトの名無しさん
08/12/21 00:50:07
質問です。

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

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

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

文章がわかりにくかったらすいません。

184:デフォルトの名無しさん
08/12/21 02:20:11
>>183
>>167


185:166
08/12/21 12:41:12
>>166です。先日はありがとうございました。
動作のたびに画面がフラッシュして非常にストレスを感じます。

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

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


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

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

Private Sub Macro1()

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

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

End Sub

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


186:デフォルトの名無しさん
08/12/21 13:44:32
>>185
画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)

187:デフォルトの名無しさん
08/12/21 13:53:12
>>185
細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。

188:デフォルトの名無しさん
08/12/21 14:27:42
>>186>>187

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

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

そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。

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

一次元配列に移してからソートして数える方法もあるが。

190:183
08/12/21 16:15:46
>>184
少し意味がわかりませんが。
PCが違うときに同じマクロでもエラーが出るんです・・・。
自宅PC>動く
会社PC>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。

191:デフォルトの名無しさん
08/12/21 16:34:38
>>190
単純に考えて、同じマクロではないのだろう。

192:デフォルトの名無しさん
08/12/21 16:46:37
VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか?
VBとかcとかはあるんだけど、VBAのやつは見つからない。


193:183
08/12/21 17:33:42
>>191
すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。

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

エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)


194:166
08/12/21 17:49:37
>>187
Copy Destinationですと値貼り付けできないようなので、
PasteSpecial Paste使ってデータをとることにしました。

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

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

Private Sub Macro1()

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

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

End Sub

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


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

まぁ、ある程度の量以上になると遅いけど。

196:デフォルトの名無しさん
08/12/21 20:18:24
>>195
For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。
Set r = Range("IV1").End(xlToLeft).Offset(0, 1)
Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value

197:デフォルトの名無しさん
08/12/22 07:46:08
rangeをvariant型の2次元配列に代入するのもいいね。

198:デフォルトの名無しさん
08/12/22 11:08:13
>>197
>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。

199:166
08/12/22 17:36:11
>>195->>198
ありがとうございます。
>>196さんのVBAを使わせてもらってます。

あと3分間に3回も4回も動作を繰り返す症状があり、
以下のサイトを参考にしてexcelを強制リロード
させるようにしたところ安定動作するようになりました。
URLリンク(www.efcit.co.jp)

お礼まで。

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

これを実行すると (月) ってなるんだけど
両側の括弧を消したい場合は文字を操作するしかないですか?

201:デフォルトの名無しさん
08/12/22 21:49:23
>>200
replaceで括弧取り除くユーザ関数でも作れば?

202:デフォルトの名無しさん
08/12/22 21:51:41
>>200
ならないよ

203:デフォルトの名無しさん
08/12/22 22:04:30
>>202
申し訳ない、環境書きます
osx excel 2004

この環境特有の処理かな?

204:デフォルトの名無しさん
08/12/22 22:18:23
st = "個"
Range("d5").NumberFormatLocal = "0.0""個"""

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

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

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



205:デフォルトの名無しさん
08/12/22 22:46:05
>>203
mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)


206:205
08/12/22 23:05:03
>>203
すいません
こうですね
Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1)
若しくは
Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)


207:デフォルトの名無しさん
08/12/22 23:05:49
IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか?
もしくは小数点を含まないといった指定はどうやればできるのでしょうか?

208:デフォルトの名無しさん
08/12/22 23:11:10
>>204
st = "個"
Range("d5").NumberFormatLocal = "0.0" & st

209:デフォルトの名無しさん
08/12/22 23:15:04
>>196 198さんのに関して、横レスですが、是非、教えてください。

>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?


210:デフォルトの名無しさん
08/12/22 23:18:10
>>208
それでもエラーでましたorz

211:デフォルトの名無しさん
08/12/22 23:29:43
>>207
今思いついたのは

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

>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね

212:デフォルトの名無しさん
08/12/22 23:34:53
>>211
2.0も小数点扱いしたいです・・・

213:デフォルトの名無しさん
08/12/22 23:40:40
>>212
書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね


214:デフォルトの名無しさん
08/12/22 23:46:52
文字列にして"."をFind

215:デフォルトの名無しさん
08/12/22 23:50:59
>>210
こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st

216:デフォルトの名無しさん
08/12/22 23:58:08
>>209
調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。

217:デフォルトの名無しさん
08/12/23 00:18:33
find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか?

If Obj Is Nothing Then

これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね
その逆の順番にしたいのです

218:デフォルトの名無しさん
08/12/23 00:20:50
>>209
んな難しく考えんでも、行/列 って2次元じゃん。
2次元配列を視覚的に見えるようにしたのがシートってだけだよ。

219:デフォルトの名無しさん
08/12/23 00:22:03
>>217
if obj is nothing then
else
~~

じゃダメなの?

if not obj is nothing then

にしたいって事?

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

If not Obj Is Nothing Then

セル1,1に値を入力しました。5と入力したところ
objはnothingになりません・・・一体なぜなのでしょうか?

221:デフォルトの名無しさん
08/12/23 00:46:03
>>220
表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。

値=Cells(1,1)..Value
If Int(値) = 値 Then
とかで判定した方がいいと思う。

222:デフォルトの名無しさん
08/12/23 00:47:32
Sub test()
Dim a As Range
Set a = Cells(1, 1).Find(".")
If Not a Is Nothing Then
MsgBox a.Address
Else
MsgBox "nothing"
End If
End Sub

普通にnothingだけどねえ。


223:デフォルトの名無しさん
08/12/23 00:50:45
>>222
LookInがxlValuesなんだろ?
デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。

224:220
08/12/23 00:53:43
どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。
無事、解決いたしました。ありがとうございます。

225:デフォルトの名無しさん
08/12/23 00:56:00
セルの値が文字列かどうかって判定できますでしょうか?
数値か文字列かを判定したいだけなのですが、
この場合、どうしたらよいでしょうか?

226:デフォルトの名無しさん
08/12/23 00:56:31
完全一致検索とかも考えられるか。
Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。

227:デフォルトの名無しさん
08/12/23 01:00:41
>>225
VarType関数で調べる。
いまいちな人はWorksheetFUnction.IsNumberで調べる。

228:デフォルトの名無しさん
08/12/23 01:08:34
>>227
If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、
何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。
これは回避できないのでしょうか?

229:デフォルトの名無しさん
08/12/23 01:16:35
>>228
釣りか?
"Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?

230:デフォルトの名無しさん
08/12/23 01:20:55
流石に釣りだろ・・・。

231:デフォルトの名無しさん
08/12/23 01:37:50
セルに値入力をして、たとえば整数を入力します77とか8とか
その入力したセルに対してvartypeやtypenameで調べてみると
vartype=5 typaname=double と表示されます。
なぜ整数扱いではないのでしょうか?

232:デフォルトの名無しさん
08/12/23 01:48:55
>>231
EXcelの仕様。
Long型とかInteger型はありえない。

233:デフォルトの名無しさん
08/12/23 01:52:44
>>232
こんな仕様にした理由は何かあるのでしょうか?
普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが
わかりやすい?

いや、絶対値とるためにdoubleにしてるのかな
でも、typenameやvartypeをそのまま使えないってのは面倒かも

234:デフォルトの名無しさん
08/12/23 08:12:18
熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。

235:デフォルトの名無しさん
08/12/23 08:13:11
間違えた…キニスルナ!

236:デフォルトの名無しさん
08/12/23 09:46:16
ディズニーランドは東京、でも浦安は千葉。
みたいな感じ?
どうでもいいわw

237:デフォルトの名無しさん
08/12/23 12:38:37
>>233
実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?


238:デフォルトの名無しさん
08/12/23 13:30:07
singleの方が使用バイト数少ないしね!

239:デフォルトの名無しさん
08/12/23 21:24:42
>>233
0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。

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

それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。

240:デフォルトの名無しさん
08/12/24 14:01:15
>>239
良く分からんけど
Excelが普通なんでしょ


241:デフォルトの名無しさん
08/12/24 19:50:07
>>239
てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。

変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。

242:デフォルトの名無しさん
08/12/24 20:35:29
んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。
ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。

レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。

243:デフォルトの名無しさん
08/12/24 21:58:35
>>241
いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。

244:デフォルトの名無しさん
08/12/24 23:50:41
floatよりdoubleの方が速いらしいぜ

245:デフォルトの名無しさん
08/12/25 00:30:23
>>244
マジレスすると、ケースバイケース。

246:デフォルトの名無しさん
08/12/26 00:36:57
質問です。

windowsXPでExcelは2007。

Dim lastRow As Long '最終行数

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

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

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

どこが間違っているか、御教示ください。


247:デフォルトの名無しさん
08/12/26 01:42:25
>>246
xlUpはどう言う意味?

248:デフォルトの名無しさん
08/12/26 01:49:04
たまたまこのスレ開いた俺が適当に答えてみる
Rows.Countって選択してるRowの数返すんじゃないの?

249:デフォルトの名無しさん
08/12/26 01:56:21
>>246
lastRow = Range("A1048576").End(xlUp).Row

250:デフォルトの名無しさん
08/12/26 02:04:26
シートを指定していないから
関係無いシートがアクティブになってるんじゃない?
一度シートが1つのBookで試してみ

251:デフォルトの名無しさん
08/12/26 02:06:54
おそらく、アクティブなシートを勘違いしている。

252:デフォルトの名無しさん
08/12/26 02:07:27
リロードすればよかった・・・

253:246
08/12/26 09:15:59
皆様ありがとうございます。
シートを1つにしてもlastRowには1しか入りませんでした。
最終行の取り方自体は合っているようなので、 シート関係を見直してみます。
ありがとうございます。

254:デフォルトの名無しさん
08/12/26 11:39:51
>>253
「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。

255:デフォルトの名無しさん
08/12/26 12:51:43
A列にデータが無いとかじゃないよな

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

まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい

256:デフォルトの名無しさん
08/12/26 12:58:20
>>255
> 普通Bookを開いたら、そのBookがアクティブになるから
> 問題は無いはず
ねーよ

257:デフォルトの名無しさん
08/12/26 15:30:49

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

sample1
sample2
sample3

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

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

For i = 1 To 3

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

j2.Text = j1

Next i

という形でコードを組みましたがうまくいきません。
オブジェクト名を変数で定義することはできないのでしょうか?
稚拙な質問で申し訳ありませんが、よろしくお願いします。


258:デフォルトの名無しさん
08/12/26 15:42:33
>>257
Me.Controls("sample" & Cstr(i)).Text
でできないか?

259:デフォルトの名無しさん
08/12/26 15:49:02
>>258さん

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

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

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

裏技的な方法でも良いので教えて頂ければ
ありがたいので宜しくお願いします。

261:デフォルトの名無しさん
08/12/26 22:13:21
>>260
Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?

262:デフォルトの名無しさん
08/12/26 22:27:44
>とりあえず、3000+αのコンボボックスを1シートに

ユーザーも大変だ w

263:デフォルトの名無しさん
08/12/27 01:03:57
良く分からないけど
一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど
1000作るを3回繰り返すと3000個出来た
For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a

264:デフォルトの名無しさん
08/12/27 01:51:37
失敗したときのコードを張ってみそ

265:263
08/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を見て
試してみたら解るだろと思ってやってみただけだから
質問主じゃないよ

266:260
08/12/27 02:33:26
263氏の方法でなんとかなりそうです
ありがとうございました

267:デフォルトの名無しさん
08/12/27 07:25:59
いや、出来る出来ないはどうでも良いんだよ。
コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?

268:デフォルトの名無しさん
08/12/27 09:32:05
>>260
コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・


269:260
08/12/27 12:40:11
>>268 
項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。

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

こんなところでしょうか

270:デフォルトの名無しさん
08/12/27 13:10:26
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。
バカな物は作ってはいけない。


271:デフォルトの名無しさん
08/12/27 17:51:01
>>269
データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。

3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。

272:268
08/12/27 20:20:28
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。


273:デフォルトの名無しさん
08/12/27 20:34:24
>>272
こらこらw


274:デフォルトの名無しさん
08/12/27 20:47:59
>>272
DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。

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

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

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

全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。


275:デフォルトの名無しさん
08/12/27 23:59:21
>>263

---265氏のプログラム

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

---君のプログラム

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

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

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


276:デフォルトの名無しさん
08/12/28 00:09:40
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。

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

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

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

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

この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。


277:デフォルトの名無しさん
08/12/28 13:15:14
>>275
---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。


278:デフォルトの名無しさん
08/12/28 13:37:14
自分のパソはメモリーが小さいのでかも。260さんではありません。
試しにやってみたものです。


279:263
08/12/28 14:39:49
名前が1208個までしか付けられないのか

280:277
08/12/28 16:44:44
>>279
私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。


281:デフォルトの名無しさん
08/12/28 19:45:07
mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。
誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。

282:デフォルトの名無しさん
08/12/28 20:22:28


283:デフォルトの名無しさん
08/12/29 06:36:24
ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな
効率のいいコードを書くために必要な知識とか教えてくれないか。

284:デフォルトの名無しさん
08/12/29 08:22:46
>>283
そのシステムはExcelで作ったの?

285:デフォルトの名無しさん
08/12/29 08:29:17
>>283
サブルーチンなり関数なりに分けましょう。

286:デフォルトの名無しさん
08/12/29 10:25:34
>>284
うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ

>>285
最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。

287:デフォルトの名無しさん
08/12/29 12:51:23
>>286
ユーザインタフェースのプログラムを何とかしたいということ?


288:デフォルトの名無しさん
08/12/29 13:11:23
>>287
まぁ、そういうことなのかな。

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

運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。


289:デフォルトの名無しさん
08/12/29 14:19:59
>>288
UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。

290:デフォルトの名無しさん
08/12/29 15:09:44
>>288
誰もが一度は通る悩み。
モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。

モジュール結合度とかでググってみるといいよ

291:デフォルトの名無しさん
08/12/29 18:53:44
100円  500円  250円

↓ マクロ発動

100円○ 500円  250円


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

どういった関数を使えばいいでしょう?


292:291
08/12/29 19:08:00
xp
2003

293:デフォルトの名無しさん
08/12/29 21:35:37
>>291さん
こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub


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


295:294
08/12/29 22:31:54
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね

296:デフォルトの名無しさん
08/12/29 22:34:16
勘違いしてました
訂正です
Sub mini()
Dim mymin
Dim myjuni
Dim datasuu
myjuni = 1
datasuu = 3
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲
For i = 1 To datasuu - 1
If Cells(myjuni, 1) > Cells(i + 1, 1) Then
myjuni = i + 1
End If
Next i
Cells(myjuni, 1) = mymin & "円○"
End Sub


297:デフォルトの名無しさん
08/12/29 22:36:55
296は293の訂正です

298:デフォルトの名無しさん
08/12/29 22:43:48
VBAのステップ実行時に、ウォッチでRangeを見てみました。
すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?

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

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



299:デフォルトの名無しさん
08/12/29 23:19:00
ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。

300:デフォルトの名無しさん
08/12/29 23:48:10
別に、エラーをインラインで処理するのはおかしくない。
トラップすれば処理できているとは限らないのと一緒。
論理的破綻はどちらでも起こる。

301:296
08/12/30 00:08:18
>>291さんへ
たびたびすいません
こんなのありました
large関数
(指定された範囲データから大きい方から任意の数字番目を返す)
small関数
(指定された範囲データから小さい方から任意の数字番目を返す)


302:デフォルトの名無しさん
08/12/30 00:58:44
VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明)
をその文字の上に配置して、その文字を囲っているように見せたいと思っています。

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

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

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




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

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

目的のセルはFindと FindNextで

あとは細かい調整で
いいみたい

304:デフォルトの名無しさん
08/12/30 08:28:53
VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…

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

 あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。

306:302
08/12/30 17:09:11
>>303
ありがとうございます!!!

自分でも探したんですけどさっぱりその手の情報がなくて(;_;)
非常に助かりました。本当にありがとうございました!

307:304
08/12/30 18:30:26
≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30~1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?

308:291
08/12/31 14:49:44
>>301
ありがとうごさいます

やってみます

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

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

みたいな。

310:デフォルトの名無しさん
08/12/31 23:29:23
無い

311:デフォルトの名無しさん
09/01/01 00:31:04
>>309
そもそもbreakしてどこへ行くつもりだ

312:デフォルトの名無しさん
09/01/01 00:36:55
>>310
ありがと

>>311
Selectの外に決まってんじゃん。。。

313:デフォルトの名無しさん
09/01/01 00:41:39
>>312
それがしたいだけなら、どうにでもなるだろと小一時間…

314:デフォルトの名無しさん
09/01/01 00:41:51
仕方なくGotoだな

315:デフォルトの名無しさん
09/01/01 00:44:16
>>314
ちょ、おま、そんな最終手段をっ!

316:デフォルトの名無しさん
09/01/01 00:44:45
>>313
どうすんの?

317:デフォルトの名無しさん
09/01/01 00:46:24
>>316
Select Case exp
  Case 0
    IF xxx THEN
      処理
    End IF
End Select


318:デフォルトの名無しさん
09/01/01 00:48:24
抜ける方法を聞いてんの。
わざわざ論理を逆にして書けば良いじゃんとか
抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか
そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ
あとさぁ
なんで
if()
{

319:デフォルトの名無しさん
09/01/01 00:48:59
はあ~書いちゃった。。

じゃ、問題。何を書きたかったんでしょうか?


320:317
09/01/01 00:49:51
ちょっと説明不足かな
要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味
Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい

321:デフォルトの名無しさん
09/01/01 00:53:31
答え発表!
ヒューヒュー

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

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

でした。

>>320
そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。


322:デフォルトの名無しさん
09/01/01 00:53:35
go away

323:デフォルトの名無しさん
09/01/01 00:57:44
>>322
おや?外れたのかな?(^^)
勘がニブいんですねw



324:デフォルトの名無しさん
09/01/01 01:04:13
>>318
アホなのか・・・

325:デフォルトの名無しさん
09/01/01 01:06:26
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
ねーよ。

326:デフォルトの名無しさん
09/01/01 01:09:56
抜ける方法を聞いただけでこの荒れようww
VB厨はばかだなぁww
書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。
高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。
アセンブラじゃないんだからさぁ。
IF THEN
ELSE
 IF THEN
 ELSE
  IF THEN
  ENDIF
 ENDIF
ENDIF

うわっ。だっさ。最悪。

書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww

327:デフォルトの名無しさん
09/01/01 01:14:31
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If

328:デフォルトの名無しさん
09/01/01 01:27:43
>>327
あ!ありがとうございます。
あったんだ。

329:デフォルトの名無しさん
09/01/01 01:48:45
>>328
意外と素直w

330:デフォルトの名無しさん
09/01/01 02:10:17
あんまり笑わせるなよ。
VB分かってないやつがVB馬鹿にしてたのかよ。orz

331:デフォルトの名無しさん
09/01/01 02:11:14
明らかに分かってないのに、構造構造言いたがるのなんて、
情報系の一年生くらいだろ。

332:デフォルトの名無しさん
09/01/01 02:21:16
>>330-331
ゴメンね(´・ω・`)
ついイライラしてたから


333:デフォルトの名無しさん
09/01/01 02:30:42
厨とか言っちゃうやつは例外なくアホ

334:デフォルトの名無しさん
09/01/01 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか?

C#への布石ですか?

335:デフォルトの名無しさん
09/01/01 17:12:57
Excel 2008でVBAが使えないのは事実らしいが、
Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
URLリンク(www.microsoft.com)

336:デフォルトの名無しさん
09/01/02 08:30:00
このスレは、Excel の VBE で作るフォームについての質問はスレ違い?
スレ違いでしたら誘導をお願いします。

337:263
09/01/02 09:22:34
>>336
もしかしてデザインの話か
そんな誘導先ないだろ

338:デフォルトの名無しさん
09/01/02 09:23:06
名前消し忘れた恥ずかしい

339:デフォルトの名無しさん
09/01/02 13:45:39
どうせなら、VSTA2.0の情報とかを書けばいいのに
>>334-335


340:デフォルトの名無しさん
09/01/02 14:03:27
あれ本当にOfficeに乗っけるの?

341:デフォルトの名無しさん
09/01/02 14:17:09
>>335
よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?


342:デフォルトの名無しさん
09/01/02 15:03:36
そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。
この先もそれが続くと信じて安穏としているのは間違っているだろうが、
数年でなくなるような存在でもない。

343:デフォルトの名無しさん
09/01/02 16:48:02
Excel VBAによるWin32 APIプログラミング入門
この本って絶版でもう購入不可ですか?

344:デフォルトの名無しさん
09/01/02 16:58:06
絶版です

345:336
09/01/02 18:06:59
>>337
そうですか…了解です。

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

(コンボボックスでダブルクリックのイベントが起きないので調べたら、
 VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
 ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
 ダブルクリックのイベント絶対起きないじゃん…。)

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



347:デフォルトの名無しさん
09/01/03 00:58:20
>>346
セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが

348:336
09/01/03 02:30:30
>>346
コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。

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

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

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

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

上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。

349:デフォルトの名無しさん
09/01/03 03:55:36
トリプルクリックにまで対応できるのは素晴らしいけど
コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな

350:デフォルトの名無しさん
09/01/03 04:52:18
URLリンク(www.amazon.co.jp)ユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1

351:デフォルトの名無しさん
09/01/03 04:53:58
オレのExcel、コンボボックスにダブルクリックイベント有るけど
みんなのには付いてないの?
バージョン Excel2003

352:デフォルトの名無しさん
09/01/03 06:03:46
たぶん
コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う

353:デフォルトの名無しさん
09/01/03 13:26:28
オリジナリティ溢れるUIほど迷惑なものはない

354:デフォルトの名無しさん
09/01/03 16:11:29
>トリプルクリックや4回クリックなどにも

何考えてんだ?

355:デフォルトの名無しさん
09/01/03 16:20:56
V2C には6回クリックまであるぜ

356:デフォルトの名無しさん
09/01/03 17:11:00
API使えば、ダブルクリックの認識の間隔を取得できるから、
0.5秒決め打ちよりそれを使ったほうがいいと思う。
そういう話をしている場合でないとは思いつつ。

357:デフォルトの名無しさん
09/01/03 19:44:02
質問です。
セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが
どう設定のマクロを書いたものか、よろしく。
右クリックイベントによってコピーモードにしているのに、余分な作業を
するのを防止したいので。

358:デフォルトの名無しさん
09/01/03 21:18:27
マウスの右ボタンを殺す

359:デフォルトの名無しさん
09/01/04 02:39:56
BeforeRightClickイベントの第二引数にCancelがあるだろ

360:デフォルトの名無しさん
09/01/04 13:15:18
サーバサイドでの帳票の生成にVBAを検討していて、
安定性、処理性能、MSのライセンス違反等を懸念してますが、
何か懸念事項やアドバイス等ありますでしょうか?

361:デフォルトの名無しさん
09/01/04 14:49:46
論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、

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

「そうでないなら」はどう書いたものでしょうか?


362:デフォルトの名無しさん
09/01/04 15:11:17
>>361
色々あるだろうけど
普通は
if
elseif
elseif
else



363:デフォルトの名無しさん
09/01/04 15:18:49
>>357
ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ

364:デフォルトの名無しさん
09/01/04 15:21:38
>>361
>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf

365:デフォルトの名無しさん
09/01/04 23:41:35
まあOr使っちゃうのが一般的かつ簡単ではあるが
条件1つずつでネストした方が速い

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

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

因みに論理演算(>>364)の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ
とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな

366:デフォルトの名無しさん
09/01/04 23:56:00
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。

367:デフォルトの名無しさん
09/01/05 00:00:55
ショートサーキットはしないよ
まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど


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