5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA質問スレ Part8

1 :デフォルトの名無しさん:2008/08/25(月) 23:16:33
ExcelのVBAに関する質問スレです

前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/

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

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

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

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

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

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

2 :デフォルトの名無しさん:2008/08/25(月) 23:18:54
過去スレ
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/

3 :デフォルトの名無しさん:2008/08/25(月) 23:28:51
>>1


4 :デフォルトの名無しさん:2008/08/25(月) 23:31:24
>>995
入力文字列の書式が「999-9999-9999」か「9999-99-9999」だけなら、

x = split(入力文字列,"-")
x(0)="(" & x(0) & ")"
debug.print join(x,"-")


5 :デフォルトの名無しさん:2008/08/25(月) 23:32:46
あと>>1otu

6 :デフォルトの名無しさん:2008/08/25(月) 23:51:55
VBEってかなりイカスよな。なんていっても使いやすい。
これだけコンパクトに洗練されたIDEってほかにないだろ?
しかもお手頃。Excelに最初からついてくるんだぜ。
そんでExcelからマクロの記録とかやれば馬鹿でもチョンでもコードがかけるの。
こんな素晴らしい機能は他に類をみないよね。
もうビルゲイツさまさまってかんじ?
ろくにシェルスクリプトもかけないのにわざわざLinuxとか使ってる奴もったいねーw
とりあえずビルゲイツさまが提供してくださるOSとソフトウェアを使っていればいいんだよ。


7 :デフォルトの名無しさん:2008/08/26(火) 00:00:04
釣りも乙

8 :デフォルトの名無しさん:2008/08/26(火) 20:56:28
>前スレ985
ならんぞ。どういうパターンの話?
もしかして型変換起こしてるとか?

9 :デフォルトの名無しさん:2008/08/26(火) 22:43:02
>970
です。
いろいろなことを教えていただきありがとうございます。

ひとつひとつやってみます。

またなにか聞くかもしれませんそのときはお願いいたします。

10 :デフォルトの名無しさん:2008/08/27(水) 12:59:04
VBAで、構造体をTypeで定義する場合、変数を持たせることができるのは理解しています。
関数も持たせたいのですが可能でしょうか?

11 :デフォルトの名無しさん:2008/08/27(水) 13:56:15
クラスじゃだめなの?

12 :デフォルトの名無しさん:2008/08/27(水) 15:18:29
なるほど、クラスがありましたか!
ちょっと調べてみます。

13 :デフォルトの名無しさん:2008/08/27(水) 22:06:17
シート上の特定の列にオートシェイプを1行ずつ(1セルずつ)表示したりすべて消したりするマクロを作りたいと思っています。
並べて表示させるのはなんとなくわかるのですが、すべて削除するマクロがわかりません。

その列以外にもオートシェイプがあるのでDrawingObjects.Delete は使えないと思いますし、
マクロを記録しながら、オブジェクトの選択を選んで消したい箇所をドラッグしてDELしても
ActiveSheet.Shapes.Range(Array("AutoShape 260", "AutoShape 261")).Select
Selection.Delete
とオートシェイプの番号を指定して削除しているのでマクロには使えなさそうです。
マクロで使えるオートシェイプの削除方ってありませんか?

14 :デフォルトの名無しさん:2008/08/27(水) 22:19:54
key使えばよくね

15 :デフォルトの名無しさん:2008/08/27(水) 22:50:39
>>14
もう少し詳しくお願いします。

16 :デフォルトの名無しさん:2008/08/28(木) 00:40:08
座標をセルの幅と高さから計算してとりあえずシェイプの作成はできるよな。
んで作成時にkeyプロパティに座標(行,列)を文字列で格納しておくんだ。
あとはActiveSheet内のシェイプを走査して、特定の座標のシェイプを指定
して削除できると思うよ。
ActiveSheetの行or列orセルが削除されたらシェイプのkeyプロパティに格納
されている座標を更新する処理を加えれば完璧じゃね?

17 :デフォルトの名無しさん:2008/08/28(木) 20:54:48
ページの書式設定をVBAでやると遅いですよね。
ExecuteExcel4macroでやると速いんですが、
書式が通常と全く異なるので記述が難しい。
順番が決まってるし、""で囲む部分とかどうやったら良いのやら。
誰か上手いこと解説して下さい。

18 :デフォルトの名無しさん:2008/08/28(木) 22:37:59
subとfunctionについて教えてください。

何度も同じ処理をcallする場合に、処理を記述するのは、
sub と function、どちらにすべきでしょうか。
引数無しの記述なので、どちらで記述して呼び出しても同じ結果が出るのですが、
正しい使い方を覚えたいと思います。

よろしくお願いします。

19 :デフォルトの名無しさん:2008/08/28(木) 22:39:39
戻り値があればFunction、なければSub以外にやり方があるのか?

20 :デフォルトの名無しさん:2008/08/28(木) 22:40:42
subがいいよ

21 :デフォルトの名無しさん:2008/08/29(金) 08:38:25
初めての投稿です。よろしくお願いします。

Excel でコンマおよび引用符を区切り文字としてデータをテキスト ファイルにエクスポートするマクロ
http://support.microsoft.com/kb/123183/ja

上記のようなマクロを求めています。
例えばexcel上に、
1 2 3
4 5 6
という表があれば、
"1","2","3"
"4","5","6"
というテキストファイルに吐き出したいのです。
例では、囲い文字='"' 、 区切り文字=',' としましたが、両方とも簡単に変更出来るとなお良いです。

どなたかとっかかりでも良いですからアドバイスを下さい。よろしくお願いします。

22 :デフォルトの名無しさん:2008/08/29(金) 08:43:20
>>21
釣りじゃないなら、「名前をつけて保存」のcsvを飽きるほど試してみるんだ。

23 :デフォルトの名無しさん:2008/08/29(金) 08:54:11
>>22
回答ありがとうございます。

保存形式にcsvを選べばカンマ区切りのテキストファイルが得られるのは知っていますが、
それでは囲い文字までは指定できないと思います・・・。
それとも私の知らない機能があるのでしょうか?

24 :デフォルトの名無しさん:2008/08/29(金) 09:33:10
セルが文字列なら括られるべ。

25 :デフォルトの名無しさん:2008/08/29(金) 10:27:01
>>24
セルの書式を文字列に変更してcsv形式で保存しましたが、
""で括られることはありませんでした。ごめんなさい。

ちなみにセルの内容自体を"1"などとしてcsvで保存すると、
なぜか"が増えて"""1"""となってしまいます。

EXCELの機能のみで実現できるのならばそれにこしたことはないのですが、
色々調べた結果、これはマクロを組まなければ実現できないみたいなんです。
どうか、マクロを使った方法を教えていただけないでしょうか?

私の足りない頭では、まずベタにcsvで吐き出した後、
テキストエディタを使って正規表現で , や先頭を置換していく方法しか分かりません。
1ファイルだけならそんなに手間はかかりませんが、大量のファイルを処理したい場合、
マクロを使えたら便利だと思い質問させて頂いてます。

26 :24:2008/08/29(金) 10:46:51
ありゃ、ダメだっけ。そりゃ失敬。
んじゃ、1を'1にしたらどう?
# つーか、理由が判らんから喰い付きが悪いんじゃないだろか。

27 :デフォルトの名無しさん:2008/08/29(金) 11:30:21
>>26
>んじゃ、1を'1にしたらどう?
書式を文字列にしたのと同じ結果で、""では括られませんでした。

># つーか、理由が判らんから喰い付きが悪いんじゃないだろか。
理由をお話ししますと。
仕事上、囲い文字付きのcsvファイルを良く扱うんです。
それはoracleデータベースから吐き出されたテキストデータなんですね。
"00","123","789"
"01","456","098"
上記のような形式のものです。

それを修正する時、テキストエディタで直接編集するのが難しい場合、
一旦excelに読み込ませてexcel上で編集するんです。
そのデータを再び上記のような形式に保存し、データベースに取り込むということをするんです。
その際、単にexcelでcsv形式で保存すると、囲い文字""が無くなってしまいます。
囲い文字""がないとうまくツールでデータベースにロード出来ないので困っているわけです。

単にただのcsvから囲い文字付きcsvに変換したいなら、
そのようなシェルスクリプトを作るなり、手動で置換するなり出来るのですが、
今回excelを使用しているので、マクロを使って自動化することに挑戦したいのです。

ヒントでもリンクでも構いません。とっかかりをどなたかご教示願います。

28 :デフォルトの名無しさん:2008/08/29(金) 12:04:25
>>27
ファイル保存のコードを流用しているみたいですけど、すべての値を'"'で囲んで、,'で連結してファイルに書き出すコードを書けばいいですよ
囲い文字や区切り文字は変数にしとくと変更も簡単にできます

会社として問題がないならファイルを経由せずに直接DBを更新するとよいかもしれません
「excel oo4o」とかでぐぐれば参考ページが出てきたと思います

29 :デフォルトの名無しさん:2008/08/29(金) 12:55:59
シート上のセルではなく、プロシージャ内で宣言したRange型変数の書式を
組込ダイアログボックスから操作することは可能でしょうか?

やりたいことは、
[書式]>[条件付き書式]で表示されるダイアログの
[書式(F)]ボタンをクリックしたときの動作を自作フォーム上で再現したいです。

よろしくお願いします


30 :デフォルトの名無しさん:2008/08/29(金) 13:22:28
Excel2003からOutlook20033の
予定表に書き込む事はできます
でしょうか。

予定をExcelでガーッと書いて、
ポチッとOutlookに流し込みたいです。

MS Exchange serverを使ってます。
VBAについては初心者で、
「Excel Outlook VBA 予定」等でググってみたのですが
見つける事ができず・・・
もしサンプルコードがあればそれをもとに勉強させていただきたいと思っています。


31 :デフォルトの名無しさん:2008/08/29(金) 20:20:33
>>30
Outlook20033はできない

32 :デフォルトの名無しさん:2008/08/29(金) 21:38:52
エクセルスレから移動してきました。

【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2003
【3 VBAが使えるか    .】 多少
【4 VBAでの回答の可否】 可
【5 検索キーワード     】 シート作成 ファイル名 付与

原本となるブックがあり
それを元に
Book1
Book2
Book3
Book4
・・・

と任意の数だけブックを任意のフォルダに作成し
かつブック名に日付(8月1日、8月2日・・)と付けて作成する方法を
教えてください。 
参考になりそうなサイトでも構わないです。
よろしくお願いします。

33 :デフォルトの名無しさん:2008/08/29(金) 21:45:36
>>31

あぁ!?そうなんですか!?
ほかのバージョンではできるんでしょうか?!
かいかえようかなぁ・・・

34 ::2008/08/29(金) 22:05:49
>>32
「FileCopyステートメント」で検索してみてください。


35 ::2008/08/29(金) 22:39:09
>>29
「プロシージャ内で宣言したRange型変数の書式」とありますが、
宣言された時点でのRange型変数は、まだどこのセルを指すか
決まっていないため、書式を設定することはできません。

Range型変数に任意のセル範囲をSetした上で、そのセル範囲の
条件付書式の書式をVBAで設定する方法を、ということでしたら、
まずは条件付書式設定の作業を「マクロの記録」(>>1 ★6)を
使ってコード化し、「Selection」となっているところを任意のセル範囲
に対する操作になるよう書き換えてください。そうして出来上がった
コードを、自作フォーム上のコントロールのイベントプロシージャから
呼び出すようにすれば、自作フォームから操作できます。

始めに「組込ダイアログボックスから操作する」とあり、
後で「自作フォーム上で再現したい」とありますが、
組み込みダイアログボックスと自作フォームは別物です。
おそらく「自作フォーム」のつもりだと思いますが、
混同しないよう気をつけてください。


36 :デフォルトの名無しさん:2008/08/29(金) 22:49:23
>>32
マクロを記録して、やりたいことやってみろ

37 :デフォルトの名無しさん:2008/08/29(金) 23:36:33
>>33
そもそもOutlook20033なんてない。

38 :デフォルトの名無しさん:2008/08/30(土) 19:44:37
Excel20033はあるよ

39 ::2008/08/30(土) 21:14:32
Outlook20033の検索結果 5 件中 1 - 5 件目 (0.39 秒)
Excel20033の検索結果 8 件中 1 - 8 件目 (0.15 秒)

40 :デフォルトの名無しさん:2008/08/30(土) 23:17:12
うちはExcel2003.3だけど

41 :デフォルトの名無しさん:2008/08/31(日) 02:30:40
>>15はできたの?

42 :デフォルトの名無しさん:2008/08/31(日) 03:15:03
【1 OSの種類       】 WindowsXP
【2 Excelのバージョン 】 Excel2000
【3 VBAが使えるか  】 皆無
【4 VBAでの回答の可否 】 可
【5 検索キーワード   】 VBA プログラム

現在VBAを勉強し始めたばかりなのですが、9/1までに提出しなければいけない問題があり困ってます。
丸投げとなってしまうのですが、もしよろしければお知恵をお貸しください;

EXCEL名:テンプレート  Sheet名:[Sheet1][Sheet2]
CommandButton:[Cmd]  補足:三行目以降にデータが入っている。

ACCESS名:ユーザー   テーブル名:T_TOUROKU
フィールド名:[No.][Name][Adr][Tel]
補足:データは数百件入っている。 SELECT文があるとまとめやすいようです。

VBAのDAOを使用して、テンプレ−ト上の[Cmd]ボタンを押すと、
@Sheet1のCell(B)列に書かれた内容と[Name]を比較、
 A一致すれば次にCell(A)列と[No.]と比較し,変更のある箇所をSheet1の内容へと更新。
 B見つからなければ、新規として追加する。
C又、変更があったものは[Sheet2]へコピーもする。

簡潔に言えば、
名前を主キーとして、EXCELの内容をACCESSへ書き込み・更新をして変更ログを
Sheet2へ書き込みたいのですが、自分の知識ではどのようにコーディングすればいいのか
全然判らないので、よろしくお願いします。。。

43 :デフォルトの名無しさん:2008/08/31(日) 06:07:21
>>42
>>1★5

「なつやすみのしゅくだい」はじぶんでやりましょう

44 :デフォルトの名無しさん:2008/08/31(日) 07:18:59
ぎりぎりまで放っておくのが悪い

45 :デフォルトの名無しさん:2008/08/31(日) 08:56:12
グループ化されたオートシェイプを解除して
テキスト変更して再グループをして終了させたいのですが
これだとその都度グループ番号が変わっちゃって使えません><;
他にいい指定方法ありませんか?

ActiveSheet.Shapes("Group 526").Select
Selection.ShapeRange.Ungroup.Select

ActiveSheet.Shapes("Rectangle 101").Select
Selection.Characters.Text = "ほげ1"

ActiveSheet.Shapes("Rectangle 126").Select
Selection.Characters.Text = "ほげ2"

ActiveSheet.Shapes("Rectangle 127").Select
Selection.ShapeRange.Regroup.Select
Selection.Characters.Text = "ほげ3"

46 :デフォルトの名無しさん:2008/08/31(日) 10:28:55
>>42

http://www.amazon.co.jp/s/ref=nb_ss_gw?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=Excel+access+

47 ::2008/08/31(日) 11:07:20
VBA経験が「皆無」という生徒に、ExcelVBAでDAOを用いMDBに接続してデータを取得・更新する、
という課題は荷が重すぎるような...。>>42の学校ではどういうカリキュラムでVBAを教えているのか
わかりませんが、最低限その課題を解くために必要な授業を受けるか、必要な説明が書かれた
テキストが配布されているなら、とにかくそれらを参考に自分で何かコードを書いて、
再度質問してみてください。


48 :デフォルトの名無しさん:2008/08/31(日) 11:36:11
んな、難しいもんでもないような。
1日ぐぐって、サンプル試すだけでできるようなるっしょ。

49 :デフォルトの名無しさん:2008/08/31(日) 11:43:56
>>47
あんた優しいな。
経験皆無なわけないじゃん。
>>42が授業聞いてないだけだよ。


50 ::2008/08/31(日) 11:48:33
>>45
GroupItemsプロパティから、そのグループに含まれているすべてのシェイプのコレクションを取得できます。
グループを解除する前に、その情報をCollection型変数にでも保管しておいて、
それぞれのテキストを書き換えた後、その情報をもとに再びグループ化すれば、グループ名を使わずに実現できます。

>>48, >>49
情報系の学生で、ちょっとでも他の言語の経験があれば何とかなるかも
あとは>>42の頑張り次第ですね。

51 :デフォルトの名無しさん:2008/08/31(日) 12:28:05
参考書とか期限みたら意味ないことくらいわかるでしょ
コードくれよ

52 :デフォルトの名無しさん:2008/08/31(日) 12:32:00
納期〆切寸前の苦しみを自力できりぬけんのが一番の経験だからな。
おまえのことをおもって、今後誰もレスをせんだろうな。

53 :デフォルトの名無しさん:2008/08/31(日) 13:11:22
yウゼー

54 ::2008/08/31(日) 13:46:53
>>41
それについて私も気になってました。>>16に書いてある方法を自分でも
調べていたんですが、シェイプに「keyプロパティ」ってあるんでしたっけ? 
オブジェクトブラウザで探しても見つかりません。


55 :45:2008/08/31(日) 15:17:38
質問を変えます。
複数のグループ化されたオートシェイプのうちの一つを指定するのに
ActiveSheet.Shapes("Group 526").Select のようにではなく、例えばRange("B5")の上に掛かってるグループを指定する、
というような方法はありますか?
シートもどんどん複写して使いますので名前やインデックスだと手に負えない気がします。

56 :デフォルトの名無しさん:2008/08/31(日) 15:59:55
>>53
役に立ちそうで立たないからな。

57 :デフォルトの名無しさん:2008/08/31(日) 17:56:34
コテつけてくれてるんだから見たくない奴はNG指定しろ
それすらできないなら文句言うな

58 :デフォルトの名無しさん:2008/08/31(日) 22:36:57
>>16
>>54
keyプロパティはないけどidプロパティでシェイプを特定できるから、(id,座標)のような配列や
コレクションを用意しておいて座標<->シェイプの関連づけをすれば解決するんじゃないかな。

59 :デフォルトの名無しさん:2008/09/01(月) 03:45:00
>>55
TopLeftCell プロパティとか BottomRightCell プロパティを利用するのだと思います

60 :デフォルトの名無しさん:2008/09/02(火) 00:34:42
Excel.Excel.Excel

61 :デフォルトの名無しさん:2008/09/02(火) 00:49:54
顧客名簿を作ったのですが、2000件近くなり電話番号で検索できるようにしたいと思っています
で、ユーザーフォームで「電話番号入力」欄を作り、そこに電話番号を入れて「検索」ボタンを押すと、
電話番号が一致した「顧客名」、「住所」を同じユーザーフォームに表示するようにしたいのですが、
どんなコードを使うと良いのかヒントを教えていただけませんか?

シートには、

     A         B            C       D
    顧客名    電話番号        住所1    住所2
1   あいだ     090xxxxxxxxx    東京都    杉並区
2   いとう      080xxxxxxxx    北海道    札幌市

という風に記入しています

B1の電話番号「090xxxxxxxx」を「電話番号入力」欄に入れて「検索」ボタンを押すと
「顧客名」 あいだ
「住所1」 東京都
「住所2」 杉並区
という風に表示できるようにしたいのです。

Excelは、2000
OSは、Winddows XP SP3です



62 :デフォルトの名無しさん:2008/09/02(火) 00:51:35
いちおうユーザーフォームを使って形だけは作って、
「検索」ボタンを押すと該当するデータがない場合にメッセージが出るようにはしたのですが、
そこから先が(というか、ほとんど進んでいないのですが)見当がつきません



63 :デフォルトの名無しさん:2008/09/02(火) 02:35:21
Findで電話番号を検索して行位置を取得
あとはCellsでデータを取ればいい

64 :デフォルトの名無しさん:2008/09/02(火) 18:47:07
ChDir ThisWorkbook.Path
Chdrive ThisWorkbook.Path とやって作成した奴を
他人のPCで実行させても同じフォルダ内のファイルを探せなくてエラーが出ます。
デスクトップのフォルダで動作させても
msgbox ThisWorkbook.Pathでは〜¥Tempとなっています。
ユーザー設定のカレントは空白にしても変わりません。
XPの2003で作成し、会社の2007では動作しましたが他のPCのXP、2003で発生します。
どのように対処すべきですか?

65 :デフォルトの名無しさん:2008/09/02(火) 20:52:52
日本語でおk

66 :64:2008/09/02(火) 22:13:35
要は、デスクトップで起動させたブックのThisWorkbook.Pathが
なぜ関係ないC:\〜¥〜¥Tempになってしまうのか?ってことです。

67 :デフォルトの名無しさん:2008/09/02(火) 23:44:42
>>64
OfficeXP・2003からOffice2007にアップグレードすればおk

68 :デフォルトの名無しさん:2008/09/03(水) 19:41:38
EXCEL2007です。
以下のコードで、実行時エラー1004「アプリケーション定義または
オブジェクト定義のエラーです」になります。
何が原因でしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim o16 As Integer
Dim o1 As Integer
Dim rgbnum As Integer
r = Target.Row
c = Target.Column

  省略

rgbnum = o16 * 16 + o1
Range(Cells(r, c - 1), Cells(r, c - 1)).Value = rgbnum ←ここでエラー
End Sub



69 :デフォルトの名無しさん:2008/09/03(水) 21:50:31
cがゼロになってるとか

70 :デフォルトの名無しさん:2008/09/03(水) 21:51:17
cがゼロじゃなくて、cが1だからCells(r, c - 1)が存在しないとこを参照してるってことね

71 :デフォルトの名無しさん:2008/09/03(水) 23:46:30
VBAを1週間前から勉強していて、すごーく簡単なプログラムは作れるようになったのですが、
いまいち理解しているのかどうかがわかりません。
勉強の仕方はネットで調べながら・・・なのですが、
みなさんはどのように勉強してましたか?
課題をもらえるとやりやすいのですが、一人でやってると自分が何をしているのか
わからなくなります。覚えるコツなどありましたら教えてください。


72 :デフォルトの名無しさん:2008/09/03(水) 23:53:34
>>71
興味あるものを作るところから始めたら?

仕事なら、覚えるしかないからかえってそういう事を悩まずにすむけど。

73 :デフォルトの名無しさん:2008/09/03(水) 23:57:43
>>71
おれはシューティングゲーム→ギャルゲー→RPGと作って
無駄な時間をすごした。

74 :デフォルトの名無しさん:2008/09/04(木) 03:13:53
俺はVB→ExcelVBAだったから特に勉強とかしてないけど、
VBは最初はいろんな小物ツールとかつくって覚えたなぁ。

75 :デフォルトの名無しさん:2008/09/04(木) 03:29:37
ExcelVBAだったらExcelオブジェクトを理解することが重要だけど、
VBA全体を勉強したいならWin32APIやWindowsCOMオブジェクト
についても勉強する必要があると思うなぁ。
最初はコードが公開されているサンプルを眺めたり流用して何か
役に立つものを作ったらいいと思う。その内にコードが公開されて
いないけど実現したい機能とかも自力で作成できるようになるよ。
Officeだったらコードが公開されていなくてもパスワードクラックの
ツールがあるからそれ使ってちょっと高度なコードにも目を通すと
いいかも。

76 :デフォルトの名無しさん:2008/09/04(木) 03:57:22
結局ダジャレかよ

77 :デフォルトの名無しさん:2008/09/04(木) 11:53:25
>>71
質問掲示板の「回答者」になるのが良いでしょう。
どの掲示板が良いかは自分で判断して下さい。

別に書き込まなくても良いので、色々な方のコードと自分のコードを比較する事が勉強になる。

78 :デフォルトの名無しさん:2008/09/04(木) 16:15:58
VBAでオブジェクト指向プログラミングできるの?

79 :デフォルトの名無しさん:2008/09/04(木) 18:43:38
むしろ、VBAはOO言語だろ

80 :デフォルトの名無しさん:2008/09/04(木) 19:18:16
まあOO言語としてはかなり不完全だけど
分類的にはOO言語寄りではあるな

81 :68:2008/09/04(木) 19:49:36
>>69,70
レスありがとうございます。
cはゼロにも1にもなっていないですが・・・。


82 :デフォルトの名無しさん:2008/09/04(木) 20:41:23
1つのセルが対象なのにrangeで範囲選択してんの?


83 :デフォルトの名無しさん:2008/09/04(木) 20:45:17
いいじゃまいか

84 :デフォルトの名無しさん:2008/09/04(木) 21:56:37
うーん。出先なんで確認取れないんだけど、
sheets(hoge).range(
の形でどうかな?
sheet changeイベントで、rangeオブジェクトが保持してるシート名が対象rangeと異なるからエラー出してるとか。

適当だけどw

85 :デフォルトの名無しさん:2008/09/04(木) 22:23:24
>>71
体系だった入門書を通読しろよ、糞ゆとりが

86 :デフォルトの名無しさん:2008/09/04(木) 22:44:22
cellsに修飾が足りないな、きっと

87 :デフォルトの名無しさん:2008/09/04(木) 23:45:43
>>68
cに1が入った場合の処理をしていないから
Changeイベントループして最終的に >>70の言う事になってるだけ

88 :デフォルトの名無しさん:2008/09/05(金) 00:09:51
toggleMerge("A1:A5")
という命令でA1:A5の範囲のセルを結合させたり結合解除させたいのですが、
実行させても何も起こりません。エラーすら起こりません。
ばらして同様のことをやるとちゃんと動きます。何が悪いのでしょうか。

以下そのコード
Sub toggling(ByRef obj As Variant)
obj = Not obj
End Sub
Sub toggleMerge(ByVal str$)
toggling Range(str).mergeCells
End Sub

89 :デフォルトの名無しさん:2008/09/05(金) 00:35:04
スレ違いとは思うのですが助けてください
モジュールで有効な変数宣言しようとすると
Dimとか打ってたらエラーダイアログが0.2秒ぐらいで6連続くらい連発して打ち切れない
Excel2008なんだけど構文チェックスピード早すぎて打てない
どうしたらいいのか教えて頂けないでしょうか

90 :デフォルトの名無しさん:2008/09/05(金) 00:46:23
>>68
"c"にミスがないのであれば

Sheets(hoge).Range((Sheets(hoge).Cells(r, c - 1), Sheets(hoge).Cells(r, c - 1)).Value = rgbnum
↑のようにしてみてはいかがか

91 :デフォルトの名無しさん:2008/09/05(金) 00:50:36
すみませんが
http://namidame.2ch.net/test/read.cgi/slotj/1216400588/
のスレで確率についてバトルしています

問題はサイコロで1が8回連続して出る確率です
バカが多すぎて疲れました
頭の良い皆様、論破してください
お願いします

92 :デフォルトの名無しさん:2008/09/05(金) 01:15:08
>>90
Worksheet_Changeイベントに記述しているから
セルに値を入れる前にイベント発生を止める処理を入れるか

cが0にならないようにする処理を入れないと
Changeイベントが連鎖してエラーになる

93 :デフォルトの名無しさん:2008/09/05(金) 01:20:01
>>89
めっちゃ早く打つ

94 :デフォルトの名無しさん:2008/09/05(金) 01:28:59
質問するのは全然かまわないんだけどさ、質問スレだからな。
でもさ、質問する前に日本語で質問できるようになってから来いよな。
たのむから。

95 :デフォルトの名無しさん:2008/09/05(金) 02:00:19
>>92
なるほど。ちょっと賢くなりました。

96 :68:2008/09/05(金) 08:57:53
みなさん、レスありがとうございます。
cが特定の値の時にしか、
セルに値を入れないようにしたら
うまくいきましたm(__)m


97 :y:2008/09/05(金) 17:45:41
>>88

おやっ、と思うようなコードですね。
たぶん、MergeCellsプロパティの「実体」を、togglingプロシージャに
参照渡しして、そこからプロパティを操作しようと考えたのでしょうか。
偶然かもしれませんが、なかなか珍しい間違い方をしていると思います。

toggling Range(str).MergeCells

というコードは、
@MergeCellsプロパティを読み出した結果得られた値について、
Aその値をtogglingプロシージャに渡す、
という2段階の処理として実行されます。単純に
「MergeCellsプロパティを、togglingプロシージャに渡す」
わけではありません。

Range(str).MergeCells で取得できるのは、プロパティの実体ではなく、
実体を読み出した結果であり、"True"もしくは"False"というただの値です。
この時点で、実体との関係は断たれてしまっているので、
その値をtogglingに参照渡しして、それを反転させても、
プロパティそのものを操作することにはなりません。

プロパティを操作する場合は、次のように直接操作するようにしてください。

Sub toggleMerge(ByVal str$)
 Range(str).MergeCells = Not (Range(str).MergeCells)
End Sub


98 :y:2008/09/05(金) 18:04:43
>>89
何をした瞬間エラーメッセージが出た、というあたりをもう少し詳しく。>93w

>>58
ありがとうございます。やっぱりKeyプロパティはないんですね。


99 :デフォルトの名無しさん:2008/09/05(金) 20:14:32
何言ってんだこいつ

100 :デフォルトの名無しさん:2008/09/05(金) 23:31:49
>>97
どうもありがとうございます。
Boolean型のオブジェクトを渡していたからだったのですね。
でもできれば、汎用的にtoggleプロシージャをつかって実装したいです。
Sub toggle(ByRef obj As Variant, ByVal propertyName$)
obj.propertyName = Not obj.PropertyName
End Sub

という感じです。

そこで、新たに質問なのですが、”.”を使わずにプロパティを参照するには
どのようにすればいいのでしょうか。
たとえば、Javascriptだとobj["PropertyName"]でプロパティ参照できるのですが、
VBAには類似の呼び出し方法は存在しているのでしょうか。

101 :デフォルトの名無しさん:2008/09/05(金) 23:43:02
ちょっと早めに知りたいので、
http://pc11.2ch.net/test/read.cgi/bsoft/1219830884/l50x
こちらのほうでも同様の質問をしようと思います。

マルチポストはするな、といわれたくないため、先に宣言しておきます。

102 :デフォルトの名無しさん:2008/09/05(金) 23:50:31
VBAではインクリメントは a = a+1 と記述するしかないですか?
a += 1
a ++
はだめでした。
(下は別言語なので当然ですが・・・。)

103 :デフォルトの名無しさん:2008/09/06(土) 00:39:09
>>100
CallByName

>>102
諦めろ。

104 :デフォルトの名無しさん:2008/09/06(土) 01:25:11
hint : overload

105 :デフォルトの名無しさん:2008/09/06(土) 02:05:01
A列のセルに入力があればA列の中で同じ入力がないか検索する
というマクロを作ろうと思っているのですが、セルの入力判定の方法を教えていただけないでしょうか?
宜しくお願いします。

106 :デフォルトの名無しさん:2008/09/06(土) 03:17:52
もっと具体的に

107 :105:2008/09/06(土) 07:39:52
説明が抽象的になってしまいすいません。
A列からF列までそれぞれの列に情報を入力してリストを作っているのですが、
既に何百行も情報を入力していて、都合上同じ情報を追加で入力してしまう恐れがあり、
現在は毎回入力の前にCtrl+Fの検索で既に入力された情報かどうか調べています。
そこでA列のセルに入力があれば入力されたセルより上の既に入力された全てのセルの文字列と比較して、
既に同じ入力があればエラーメッセージを出すというマクロを作りたい次第です。

マクロを作成するにあたって、「A列に入力があれば」という部分をどう書けばいいかわからなかった為質問させていただきました。

A列に同じ情報が入力されるという事は都合上絶対に有り得ない事なのでA列のセルを比較しようと考えています。
・A列には1行目から空白なく順番に情報が入力されている。
・新規に入力する際は現在のリストの最終行の次の行に情報を入力している。
という条件があるので、A列に入力があればというよりA列の最終行の次の行に文字が入力されればという方が正しいかもしれません。

説明が下手で申し訳ありません。
宜しくお願いします。

108 :デフォルトの名無しさん:2008/09/06(土) 09:22:13
>>107
Worksheet_SelectionChange

109 :デフォルトの名無しさん:2008/09/06(土) 09:27:52
リアルタイムのイベントハンドラかぁ・・・。
VBAって自分でイベントの作成は出来るのかな。あまり詳しくないんで分からないや:(

若干重くなるけど、sheetのchangeイベントで、セルを移動した時に、A列の最終行の内容と同じ物をチェックするとか。
うーん・・・あまり美しくないよね。

自分でイベント作成出来るのか、私も知りたいです。
詳しい人お願いします。


110 :デフォルトの名無しさん:2008/09/06(土) 10:56:04
>>103
ありがとうございました。

111 :105:2008/09/06(土) 14:30:52
>>108,109
アドバイスをくださってありがとうございます。
参考にマクロを組んでみようと思います。

112 :デフォルトの名無しさん:2008/09/06(土) 14:45:53
>>107

重複データがあるかないかを調べるだけでよければ
VBA使わなくても条件付き書式でできる。

113 :デフォルトの名無しさん:2008/09/06(土) 16:14:55
Excelの VBA の関数の呼び出し方法が分かりませんので、誰か教えて戴けませんでしょうか?
 C では
// 関数の定義
void abc(void)
// メインルーチン
void main(void)
{
// 関数名
abc();
}
void abc(void)
{
---
}

上記の方法で関数を呼び出そうとして、
Sub 名前()
abc()
End Sub

:abc()
---
return
上記記載の方法では動きませんでした。
素人な問い合わせで申し訳ありませんが宜しくお願いします。


114 :デフォルトの名無しさん:2008/09/06(土) 16:25:59
関数なんだからなんらか値を返す
仮にintegerの型でパラメータを受取ってintegerの何かを返すとして
Sub 名前()
Dim a as integer
Dim param as integer
param=100 ←何かの数字(integerの範囲内)
a = abc(param)

End Sub

Function abc(param as integer) as inetger


abc = **** ←何か処理した結果のintegerの数字
End Function


115 :デフォルトの名無しさん:2008/09/06(土) 17:04:48
<<114
113 です。早速のお教え有難う御座います。
なんらか値を返す様に変更します。


116 :デフォルトの名無しさん:2008/09/06(土) 17:10:04
>>113のCのコードを何も考えずにVBAにするとこうだぞ。
Sub main()
    Call abc()
End Sub

Sub abc()
    ---
End Sub
戻り値の型がvoidの関数はSub、それ以外はFunction。
戻り値を受け取らない場合、Sub/FunctionにかかわらずCallを付ける(Call使わない記法もあるけど)。

117 :デフォルトの名無しさん:2008/09/06(土) 17:30:42
>>116
113 です。いろいろお教え戴き有難う御座います。
この方法が簡単なので採用させて戴きます。



118 :デフォルトの名無しさん:2008/09/06(土) 18:07:40
>>114
>>116
113 です。プログラム作成途中ですが、両方とも必要になりましたので、
共に採用させて戴きます。いろいろと、有難う御座いました。


119 :デフォルトの名無しさん:2008/09/06(土) 21:14:05
http://pc11.2ch.net/test/read.cgi/tech/1204552981/878

120 :デフォルトの名無しさん:2008/09/06(土) 23:37:07
関数は、なんらかの値をかえすべきであるという考えた方が
身に染み付いてるから、SubとVoid関数は非常にきもちわるい。

121 :デフォルトの名無しさん:2008/09/06(土) 23:38:23
要するに時代遅れですね

122 :デフォルトの名無しさん:2008/09/07(日) 00:36:46
かえり値もたない関数は、デバッグがむずかしくなるから、医療系の俺の会社じゃ
よほどのことがないかぎり作らない。むしろ121がしろうと

123 :デフォルトの名無しさん:2008/09/07(日) 00:52:19
>>122
VBAスレで恥ずかしい事いうなよおっさん。

124 :デフォルトの名無しさん:2008/09/07(日) 01:49:03
LispとかMLでの話なら>>120>>122も分かるが、
VBAで純粋関数型プログラミングは無茶があるだろ、常識的に考えて。

125 :89:2008/09/07(日) 03:31:47
むっちゃ早く打つ案に似た解決策で自己解決しました。
必殺コピペです。
グローバルエリアに変数定義しようとしたらDimと打った時点でエラーメッセージが頻発
変数書こうとしても打っている途中でメッセージ頻発して書けない。
どこかにエラーチェックのタイミングプロパティがあると思うがコピペで解決したから諦めようかと思います

126 :デフォルトの名無しさん:2008/09/07(日) 07:55:30
そういや、functionしか存在しない言語もあるな。

127 :デフォルトの名無しさん:2008/09/07(日) 10:23:41
よくいるんだよね。VBにしかVariant型がないと思ってる自称上級者

128 :デフォルトの名無しさん:2008/09/07(日) 14:27:52
ファイルを開かずにアクティブシートを変更するにはどうしたら良いでしょうか。

AccessのTransferSpreadsheetでエクセルの任意シートへデータを出力していますが、
エクセルファイルを開いた時に、値を出力したシートがアクティブになっているようにしたいのです。

129 :128:2008/09/07(日) 14:30:04
ついでに読み取り専用属性の操作もできればサイコーです

130 :デフォルトの名無しさん:2008/09/07(日) 14:45:07
please tell ass in Japanese...

Sheets("hoge").Activate
Sheets("hoge").SaveAs "c:\hoge.xlsx", xlWorkbookNormal, , , True


131 :128:2008/09/07(日) 15:15:51
えー、ファイルを開かない状態でアクティブシートを変更したいのです。
そのやり方だとインデックスエラーになっちゃうんですけど。

132 :デフォルトの名無しさん:2008/09/07(日) 15:26:27
Excelオブジェクト生成
ファイルオープン(非表示)
シートをアクティブにする
保存




133 :デフォルトの名無しさん:2008/09/07(日) 15:30:41
ここっていちいち一から百まで説明しないといけないから疲れるな
結局ファイルを開かなきゃいけないってことですね。どうもありがとうございました。

134 :デフォルトの名無しさん:2008/09/07(日) 15:39:47
偉そうに言ってますな w

135 :デフォルトの名無しさん:2008/09/07(日) 15:45:40
そりゃそうだ。エスパーなんてここにはいない。

136 :デフォルトの名無しさん:2008/09/07(日) 15:46:46
ここの奴らほとんど、ろくな知識も無いのに
知ったか振っててうざいんだもん
これぐらい言わせなよ

137 :デフォルトの名無しさん:2008/09/07(日) 15:51:18
うわぁ・・・低脳すぎて煽るきにもならない

138 :128:2008/09/07(日) 15:52:01
あと別におまえらがエスパーである必要はねーけど
言われた事から、相手がなぜそうしたいのか、ではどういう方法が適切かくらい想像しろよ、と思うね
おまえら自分の知ってることが唯一の回答であるようにこじつけてるだけだろ。
そういうのをバカの一つ覚えって言うんだよ。
でも回答ありがとう。じゃね。

139 :デフォルトの名無しさん:2008/09/07(日) 15:52:32
っていうかxlsファイルを開くのとExcelのGUIを開くのを同じことだと思っている低脳っているんだね

140 :>137:2008/09/07(日) 15:53:30
じゃあ書くなよウスノロw

141 :デフォルトの名無しさん:2008/09/07(日) 15:53:47
うわぁ・・・ひどい池沼ですね・・・

142 :デフォルトの名無しさん:2008/09/07(日) 15:55:07
日本語で質問できるようになったら書き込みしような。

143 :デフォルトの名無しさん:2008/09/07(日) 15:56:22
高卒とかFランは書き込みできないようなフィルタかけてくれよ

144 :デフォルトの名無しさん:2008/09/07(日) 15:59:21
盛り上がってますね

145 :デフォルトの名無しさん:2008/09/07(日) 16:01:56
>>133
最低限1から5くらいまで説明しようぜ。
俺らお前のお母さんじゃないんだからよ。

146 :デフォルトの名無しさん:2008/09/07(日) 16:02:48
というより、
出来ないことは出来ないと説明した上で代替案を示すなら
ここまで荒れないと思うのだが。
条件に反することを回答するからこうなる

147 :デフォルトの名無しさん:2008/09/07(日) 16:03:39
>>132
でできると思うぜ。

148 :デフォルトの名無しさん:2008/09/07(日) 16:10:34
>>145
えっ?
>128を1から5くらいの説明で理解できるのか?
最近のお母さんてスペック高いんだな!

149 :デフォルトの名無しさん:2008/09/07(日) 16:11:33
OBJ.FileOpenは知ってたけどコードがごちゃごちゃするから嫌いなのよ。
他にもっとシンプルなやり方が無いのかな、って思っただけ。

150 :デフォルトの名無しさん:2008/09/07(日) 16:12:30
>>147
非表示だけど、ファイル開いてるからNGだろ。
想像力のない俺からすれば、元の質問自体がNGだけどな。


151 :デフォルトの名無しさん:2008/09/07(日) 16:13:04
変な知ったかいいわけ始めたぞ

152 :デフォルトの名無しさん:2008/09/07(日) 16:14:32

ファイル開かずにファイルを変更するなんて方法があったら俺が知りたいな

153 :デフォルトの名無しさん:2008/09/07(日) 16:16:31
128ってそんなに難しいか
まさかとは思うがプログラム板なのにAccessのVBAを知らん奴がいるのか

154 :デフォルトの名無しさん:2008/09/07(日) 16:20:31
簡単だぞ。質問がヘタなだけ。で質問の答えに対して実装できるスキルもないだけ。

155 :デフォルトの名無しさん:2008/09/07(日) 16:23:38
要するに低脳というわけですね。分かります。

156 :デフォルトの名無しさん:2008/09/07(日) 16:24:49
盛り上がってますなあ

157 :128:2008/09/07(日) 16:38:58
結局お前らAccessVBAが理解できなかっただけ佳代w
低能エクセル厨乙w

158 :デフォルトの名無しさん:2008/09/07(日) 16:49:47
スレタイ100回音読してみろ。
それから自分の質問と回答を100回音読しろ。

159 :デフォルトの名無しさん:2008/09/07(日) 16:56:43
下手な釣りだなあ。次の質問どうぞ。

160 :デフォルトの名無しさん:2008/09/07(日) 18:49:05
>>128
が見えない

161 :デフォルトの名無しさん:2008/09/07(日) 20:20:00
excel vba 極めたいのですけど
お勧めの参考書はありますか?元制御系プログラマで
プログラミングの基本は充分できています。
技術評論社のポケットリファレンスはどうですか?

162 :デフォルトの名無しさん:2008/09/07(日) 20:25:06
便乗質問・・・。

win32APIを勉強したいのですが、お勧めの本ってありますか?
使用目的はExcel VBAで呼び出す事です。

163 :デフォルトの名無しさん:2008/09/07(日) 20:29:47
Excel VBAによるWin32 APIプログラミング入門 (単行本)

ぐぐることも出来ないの?

164 :デフォルトの名無しさん:2008/09/07(日) 23:32:31
質問者も回答者もバカが多いな

165 :デフォルトの名無しさん:2008/09/08(月) 00:05:08
お前ほどじゃないがな

166 :デフォルトの名無しさん:2008/09/08(月) 03:03:14
だな

167 :デフォルトの名無しさん:2008/09/08(月) 03:08:05
157 名前:128[] 投稿日:2008/09/07(日) 16:38:58
結局お前らAccessVBAが理解できなかっただけ佳代w
低能エクセル厨乙w

こいつリアルでもこんな感じなんだろうな

168 :デフォルトの名無しさん:2008/09/08(月) 07:45:44
>>162
マジレスするとWin32APIの為に本を買うのはもったいない。
MSDNとネット上のAPIサンプル集とかで十分。

169 :デフォルトの名無しさん:2008/09/08(月) 19:00:04
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112704276
上のようなことの逆は可能ですか?
 
 例えば、セルAに映画のタイトルが縦に並んでて、
セルBにはその映画の詳細が見れるHPアドレスが沢山並んでます。
 セルBのそれぞれのアドレスを、セルAに一括でハイパーリンクさせる(埋め込む)
方法が知りたいです。
 ご教授、宜しくお願い致します。

170 :デフォルトの名無しさん:2008/09/08(月) 19:41:35
http://pc11.2ch.net/test/read.cgi/bsoft/1219830884/238

171 :デフォルトの名無しさん:2008/09/08(月) 20:08:18
>>170
循環参照になってる

172 :デフォルトの名無しさん:2008/09/08(月) 20:09:26
笑!

173 :y:2008/09/08(月) 20:21:47
>>169

セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、
次のようにすればできます。

Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _
 Address:=Range(1, "b"), _
 TextToDisplay:=Cells(1, "a").Value

(マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です)

これをループで括って、「1」となっているところ(これは行番号にあたります)を
変えていけば、お好みの行数分操作できます。



174 :y:2008/09/08(月) 20:25:13
あ! すみません。
169はマルチポストだったんですね。
気づかずに答えてしまいました。

>>169
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
一度ここを読んでおいてください。

175 :デフォルトの名無しさん:2008/09/08(月) 20:29:35
> Range(1, "b")


176 :y:2008/09/08(月) 20:29:41
さらに自分のレスの間違いに気づきました。
Address:=Range(1,"b") → Address:=Cells(1,"b")

177 :169:2008/09/08(月) 21:03:00
>>173 マルチ悪かった。
 ツール→マクロ→VBA→標準モジュールに保存した後、
マクロ実行してみたけどできません。
初心者なんでもう少し詳しく教えていただけませんか?

178 :169:2008/09/08(月) 21:54:01
1行だけできましたけど、
行数分操作ができません。
Cells(1, "a"),
1の部分の範囲指定はどうすればいいの?

179 :169:2008/09/08(月) 21:55:21
できればセルを範囲指定して、マクロ実行で
一括で変更できると助かります

180 :デフォルトの名無しさん:2008/09/08(月) 22:01:32
ググレ

181 :デフォルトの名無しさん:2008/09/08(月) 22:27:39
>>180
いろいろ調べてもわからねぇよ
質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。
 その気がないなら返信するな

182 :デフォルトの名無しさん:2008/09/08(月) 22:45:30
>>179=>>169=>>こないだの池沼 



183 :デフォルトの名無しさん:2008/09/08(月) 22:46:16
>>181=>>179=>>169=>>こないだの池沼

184 :デフォルトの名無しさん:2008/09/08(月) 23:16:26
モーグでも行けよ池沼

185 :デフォルトの名無しさん:2008/09/08(月) 23:40:48
で、また169が暴れるのか?

186 :デフォルトの名無しさん:2008/09/08(月) 23:43:52
>>181=>>179=>>169=>>184=>>こないだの池沼

187 :デフォルトの名無しさん:2008/09/09(火) 01:33:11
XMLファイルをVBAで扱いたいんですけど、そういった方面を勉強できるような書籍はないでしょうか。
「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。
あってもPHPとかばっかりだし。。。

188 :デフォルトの名無しさん:2008/09/09(火) 08:48:08
書籍があってもバカじゃどうしようも無い
まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、
ネットの情報だけで事足りる

189 :デフォルトの名無しさん:2008/09/09(火) 10:31:32
あるセルからあるセルまでソルバーを使うということをやりたいのですが、
↓のを作ったのですが、出来ません。どうすればいいですか?
SOLVERの参照設定はやりました。


Sub Macro1()

Dim x As Integer

For x = 1 To 5
Range("Cells(x, 3)").Select
SolverOk SetCell:=Cells(x, 5), MaxMinVal:=3, ValueOf:="0", ByChange:=Cells(x, 2)
SolverSolve Userfinish:=True
Next x

End Sub

190 :y:2008/09/09(火) 19:35:50
>>177

173の後半を、もう少し具体的に書きます。
まずループ用の変数rを宣言し、ここでは例として
For 〜 Next間を5回繰り返すループを示しておきます。

Dim r as Long
For r = 1 to 5
 Sheet1.Hyperlinks.Add Anchor:=Cells(r, "a"), _
  Address:=Cells(r, "b"), _
  TextToDisplay:=Cells(r, "a").Value
Next

繰り返しのたびに、rは1, 2, 3, 4, 5と変化していくので、
上のコードでは1〜5行目に対する操作が行われることになります。
初心者の方なら、「VBA デバッグ」などで検索してみて、この過程を
一つ一つ目で確認する方法を身につけると、上達が早くなります。

For r = Inputbox("開始行?") to InputBox("終了行?")
とすれば、処理をしたい行の範囲を簡単に指定できますが、
もっと便利にしたければ、自分でも他の方法を色々調べてみてください。

質問する時は、どんなに間違っていてもいいので、とにかく何か自分なりに
調べて考えたコードを貼って、それに対するアドバイスを求めた方がいいですよ。
181のようなことを書くと、>>1の★5にあるように、「また丸投げか」と
怒りを買ってしまいます。

191 :y:2008/09/09(火) 20:01:47
>>189

マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、
どんなコードが記録されるか確かめてみてください。(>>1★5)

189のコードについては、
@単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select
A目的セルをどこにしたいのか、可変セルをどこにしたいかが不明
です。特に、Aが分からないとアドバイスができません。


192 :y:2008/09/09(火) 20:03:56
>189

>>1★6」でした。失礼しました。


193 :デフォルトの名無しさん:2008/09/09(火) 20:44:23
>>190
 ご親切にありがとうございました。
勉強になりました


194 :デフォルトの名無しさん:2008/09/09(火) 22:41:34
>>191
すみません
目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。

で、@のやつをやったら出来ました。
ありがとうございました。

195 :デフォルトの名無しさん:2008/09/09(火) 22:50:31
VBA初心者です

何か作ろうと思うのですが…自分では思いつかないので…
何か問題お願いします。

196 :デフォルトの名無しさん:2008/09/09(火) 22:57:53
>>195
このスレを集計してyの貢献度を調査せよ。

197 :195:2008/09/09(火) 23:04:59
>>196
ラジャ

198 :デフォルトの名無しさん:2008/09/09(火) 23:34:22
式を教えてください。

A列には文章が入っています。
B列には文章に含まれる単語、C列にはコード番号が入っています。
それぞれ数百〜数千行になります。
A列にはB列の単語のいずれかが含まれる場合には、
単語に対応するC列のコードをD列に表示させたいのですが、
どのような式がよいでしょうか。

VLOOLUPやFINDなどを組み合わせてみても上手くいきません。
お手数ですが、どなたか至急お教え願えますでしょうか。

199 :デフォルトの名無しさん:2008/09/10(水) 00:31:40
具体的なセルの中身教えろよ
このスットコドッコイ

200 :デフォルトの名無しさん:2008/09/10(水) 07:26:43
A列…デフォルトの名無しさん、具体的なセルの中身教えろよ、このスットコドッコイ
B列…デフォルト、セル、スットコドッコイ
C列…E46194、H23t55、342421

201 :デフォルトの名無しさん:2008/09/10(水) 07:44:07
ここはExcel VBAのスレです

202 :デフォルトの名無しさん:2008/09/11(木) 00:16:48
XPでExcel2003です

c:\aaa 配下にある全てのファイルとサブフォルダを
c:\bbb 配下に全てコピーする事は可能ですか?

また、サンプルコード等ありましたらヒントを頂けると助かります
色々と探してはいるのですが、いまいちピンとこないので
サンプルがあると助かるのですが、、、、

VBAはまだまだ初心者なので未熟者で恐縮です。

203 :デフォルトの名無しさん:2008/09/11(木) 06:12:54
>>202
>>1★3 ★4

204 :デフォルトの名無しさん:2008/09/11(木) 19:30:31
たまにmougヲチするんだけど、痛い回答者が多いのね。

205 :デフォルトの名無しさん:2008/09/11(木) 19:59:47
シートにコンボボックスを貼り付けて
AddItemで追加した後にシートを
Xボタンを押して閉じようとすると
変更を保存しますかと聞かれるんですが
このチェックを外す方法ってあります?

OSはXPでExcel2003です。

206 :y:2008/09/11(木) 20:15:03
>>198
文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。
調べてみて使えそうなら使ってください。
>199にもありますが、具体的なデータが分からないとアドバイスしずらいです...


207 :y:2008/09/11(木) 20:17:20
>>195
どんな業界で働いている方か分かりませんが、
実務に役立つ知識が増すようなテーマを選ぶと、
何かと都合がいいのではないでしょうか。

為替、株式市況、地価、青果水産物市況など、
ネット上にはたくさんの生データが公開されています。
それらを自動的に取得し、テーマに沿って演算し、
レポートを出力するマクロを組むだけでも、
相当勉強になると思います。

やるのであれば、日々刻々と変化する数字の方が面白いです。
例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを
取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。
仲買業者なら、どこの市場で買い付けをすれば一番安いか、
逆に生産者なら、どこの市場に出荷すれば一番高いか、
一目で分かるというものです。ちなみに彼は商社に勤めていますが、
似たようなことをしている人は結構いるでしょう。

Excelは基本的にデータ処理の道具なので、何を試すにしても、
まずは題材になるデータを見つけてこなければなりません。
ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。
その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。
仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、
自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている
仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい
ように感じます。

208 :デフォルトの名無しさん:2008/09/11(木) 22:02:38
あれ今日y絶好調だな

209 :デフォルトの名無しさん:2008/09/11(木) 23:07:26
>>206
×しずらい
○しづらい
◎しにくい

210 :デフォルトの名無しさん:2008/09/12(金) 01:38:18
>>195
WindowsVBAつくってよ

211 :デフォルトの名無しさん:2008/09/12(金) 03:36:31
yには、人生相談にすら答えてくれそうな勢いを感じる

212 :y:2008/09/12(金) 20:05:30
>>205
「シートを Xボタンを押して閉じようとすると」とありますが、
シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。

「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば
表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに
することで、強制的に作り出すことができます。
ブックが閉じられる直前に、その操作が自動で行われるようするためには、
ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、
その中でSavedプロパティを操作します。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 ThisWorkbook.Saved = True
End Sub

213 :デフォルトの名無しさん:2008/09/12(金) 20:44:06
うざいな

214 :デフォルトの名無しさん:2008/09/12(金) 20:51:26
>>213
お前がな

215 :205:2008/09/12(金) 22:35:11
なるほど。Savedプロパティですか。
ありがとうございました。

216 :デフォルトの名無しさん:2008/09/13(土) 00:10:19
確かにうざいわ

217 :y:2008/09/13(土) 02:54:40
・・・

218 :デフォルトの名無しさん:2008/09/13(土) 03:49:12
何コイツ

219 :デフォルトの名無しさん:2008/09/13(土) 06:49:48
煽りなんか気にすんな。

220 :デフォルトの名無しさん:2008/09/13(土) 07:14:09
未だに169が粘着してる

221 :デフォルトの名無しさん:2008/09/13(土) 08:56:37
>>217は、マジでうざいなw

222 :デフォルトの名無しさん:2008/09/13(土) 09:06:33
まぁ、2chではあまり見ないキャラであることは確かだな。
嫌ならNGしとけ。

223 :デフォルトの名無しさん:2008/09/13(土) 09:25:58
凄い粘着だな。。。おい。

224 :デフォルトの名無しさん:2008/09/13(土) 10:01:34
>>218-223をNG指定した

225 :デフォルトの名無しさん:2008/09/13(土) 11:55:22
マクロなんですけど、行挿入のマクロを作りたいんです。
だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか?

B2 = 3
3行目と4行目の間に行挿入をするようB2をつかってさせる。

226 :デフォルトの名無しさん:2008/09/13(土) 13:16:55
Dim i As Integer
i = Range("B2")
Rows(i).Insert

227 :デフォルトの名無しさん:2008/09/13(土) 13:18:30
これだけでもいけるな

Rows(Range("B2")).Insert

228 :デフォルトの名無しさん:2008/09/13(土) 14:07:04
>>226-227
助かります、ありがとうございました。

229 :y:2008/09/13(土) 16:13:47
・・・

230 :デフォルトの名無しさん:2008/09/13(土) 22:03:03
yそろそろコテにしたら?なりすましが出るくらい名が知れてきたんだからさ

231 :デフォルトの名無しさん:2008/09/13(土) 22:16:44
yがコテじゃなかったら何だと言うのだ

232 :デフォルトの名無しさん:2008/09/13(土) 22:33:41
トリップつけたら?ってことじゃね?

233 :デフォルトの名無しさん:2008/09/13(土) 23:38:26
いい加減、yの話題やめろよ

234 :デフォルトの名無しさん:2008/09/14(日) 00:06:42
うざすぎ

235 :デフォルトの名無しさん:2008/09/14(日) 03:08:08
エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか?

また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?

236 :デフォルトの名無しさん:2008/09/14(日) 05:20:37
> エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか?
「シートに画像をドラッグした時に」というイベントが用意されてないから、
「ドラッグした」ら自動で処理するってのは無理
「シートに画像をドラッグしてからボタンを押したら」なら可能だが

> また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
可能だがExcelでやるべきことじゃないな
Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし
やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな

237 :デフォルトの名無しさん:2008/09/14(日) 16:10:42
前者:できない
後者:できない


238 :デフォルトの名無しさん:2008/09/14(日) 17:37:16
EXCEL関数についてお教えください

あいうえお(abc)
かきくけ(ほげほげ)
さしすせそたちつ(nekdk)

という行がありまして、()とその中の文字列だけを全部消したいです。
()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。

239 :デフォルトの名無しさん:2008/09/14(日) 18:02:25
マッチコレクション

240 :デフォルトの名無しさん:2008/09/14(日) 18:10:17
>>238
>>1 ★2

241 :デフォルトの名無しさん:2008/09/14(日) 21:03:02
>>238

関数ではないけど
ツール→区切り位置で区切り文字を ( にすると
( の前後で別のセルに分かれるからそれではダメかな?

242 :デフォルトの名無しさん:2008/09/14(日) 22:58:50
 VBAで検索システム的なものを作っています。
行き詰ってしまったので何かアドバイスをいただければと思います。
OSはXPでエクセルのバージョンは2002です。よろしくお願いします。
 ブック内に「メイン画面」「情報A」「情報B」という3つのシートがあります。
「メイン画面」のB5セルに会員番号(K_Ban)を入力してマクロを実行すると「情報A」「情報B」から該当の会員番号に関する情報が「メイン画面」の任意のセルに代入されるというものです。
ただし「メイン画面」の形式の都合で、該当する「情報A」のうち、上から3件のみを出力させて4件目以降はカットしています。(下記コード参照)
「情報B」は「種別」という項目があり、「野菜」「肉類」「魚類」…などの分類が30種類ほどあります。
「情報B」についても、各種別毎に3件目以降はカットしたいのですが、行き詰っています。
すなわち、会員番号1について「情報B」は30件あり、野菜25件、肉類5件があるとすると
「メイン画面」には野菜3件、肉類3件分の情報を出力させたいのです。
また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。

243 :デフォルトの名無しさん:2008/09/14(日) 23:00:25
Public Sub 検索()

Dim K_Ban As String
Dim MyRange As Range
Dim MyAddress As String
Dim cnt As Integer

K_Ban = Worksheets("メイン画面").Range("B5")
Set MyRange = Worksheets("情報A").Range("A1:A50").Find(K_Ban, LookAt:=xlWhole)
MyAddress = MyRange.Address
cnt = 8

Do
Worksheets("メイン画面").Cells(cnt, 3) = MyRange.Offset(0, 0).Value
Worksheets("メイン画面").Cells(cnt, 4) = MyRange.Offset(0, 1).Value
Worksheets("メイン画面").Cells(cnt, 5) = MyRange.Offset(0, 2).Value
cnt = cnt + 1

If cnt = 11 Then
Exit Do
End If
Set MyRange = Worksheets("情報A").Range("A1:A50").FindNext(MyRange)
Loop Until MyRange.Address = MyAddress
End Sub

244 :デフォルトの名無しさん:2008/09/14(日) 23:25:44
シートの構造書くか、Bookをどこかにアップ

245 :デフォルトの名無しさん:2008/09/15(月) 08:41:27
だよな普通

246 :y:2008/09/15(月) 11:18:44
>>242

    |A列.     |B列.      |C列.      |D列.      |E列.      
01  | 0123456789|        .|        .|        .|        
02  |        .|        .|        .|        .|        
03  |        .|        .|        .|        .|        
04  |        .|        .|        .|        .|        
05  |        .|        .|        .|        .|        

シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。
「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。


247 :242:2008/09/15(月) 13:54:22
>>244-246
以下のようなシート構造で、種別→日付で並べ替えてあります。

A     B   C    D
番号 種別 データ1 データ2
1    肉類 豚肉  20080915
1    肉類 牛肉  20080912
1    肉類 鶏肉  20080801
1    魚類 その他 20080401
2    肉類 猪肉  20080905
2    野菜 その他 20080802


248 :y:2008/09/15(月) 16:03:53
>>247
Sub Sample()
 Dim K_Ban As Long: K_Ban = Worksheets("メイン画面").Range("B5")
 Dim r As Long
 Dim shubetsu As String
 Dim shubetsuCnt As Integer
 With ThisWorkbook.Sheets("情報B")
  .Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)).AutoFilter Field:=1, Criteria1:=K_Ban
  r = 2
  Do While .Cells(r, 1) <> ""
   If .Rows(r).Hidden = False Then
    If shubetsu <> .Cells(r, 2) Then
     shubetsu = .Cells(r, 2)
     shubetsuCnt = 1
    ElseIf shubetsuCnt < 3 Then
     shubetsuCnt = shubetsuCnt + 1
    Else
     .Rows(r).Hidden = True
    End If
   End If
   r = r + 1
  Loop
  .Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _
   Destination:=ThisWorkbook.Sheets("メイン画面").Cells(8, 3) '←任意のコピー先セル
  .AutoFilterMode = False
 End With
End Sub




249 :y:2008/09/15(月) 16:04:42
上のコードは、条件に合わない行を非表示にしていき、最終的に表示されている行だけを
「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、
不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。
なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで
いますね。上のコードは、そう並んでいる必要があります。

他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。

250 :デフォルトの名無しさん:2008/09/15(月) 18:09:00
先日行挿入について質問したものです。
C3で指定した値の行に行を挿入して、D3,Fj,D3で与えた値を挿入した行のHi、Fi,Iiに値を入れたいのですが、どこが間違っていますでしょうか、ご指摘お願いします。
Sub Main

Rows(Range("C3")).Insert

Dim i As Integer
Dim j As Integer
i = Range("C3")
Range("D3").Copy Destination:=Range("Hi")
j = i-1
Range("Fj").Copy Destination:=Range("Fi")
i = Range("E3")
Range("D3").Copy Destination:=Range("Ii")

END SUB
このように作ったのですが、うまくいきません。

251 :デフォルトの名無しさん:2008/09/15(月) 18:39:29
>>250
まず、Range("Hi")というセルの指定のやり方はない
Rangeを使いたいんなら、Range("H" & i )
ほかには、Cells(i, 8)、もしくは、Cells(i, "H")

解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ

252 :デフォルトの名無しさん:2008/09/15(月) 19:29:45
エクセルの使い方もロクに知らない俺が
今日これからVBAの勉強を力尽きるまでやってみるぜ。
困ったときはお前らだけが頼りだ。

253 :デフォルトの名無しさん:2008/09/16(火) 06:39:12
>>251
ご指摘、解説ありがとうございます。
出来る限り自分でやるようにしてみます。

254 :242:2008/09/16(火) 23:49:49
>>248
ありがとうございます。
(もしかしたら上級者の方には普通なのかもしれませんが)
自分には全くない発想でした。勉強になりました。
お示しいただいたコードを元に自分でも勉強したいと思います。

255 :デフォルトの名無しさん:2008/09/17(水) 00:16:06
そう考えること自体は不思議ではないと思うよ。
現によその言語ではそういうことができるものだってある(Perlとか)。
いずれにせよVBAはそういうことをしないということに変わりはないけれど。

256 :デフォルトの名無しさん:2008/09/17(水) 01:45:49
ねぇねぇみんな。
Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。
出てくるようにしたいんだけど、何かいい知恵あるかな?

257 :デフォルトの名無しさん:2008/09/17(水) 17:14:06
すいません、質問です。

1004エラーが出ます。(´Д`;
worksheet記述を加えてみたり、色々試してみたのですが消えません。

作りたいものとしては、
A列を縦にチェックして異なる文字列が出てきたら罫線(太線)を引く、
というものです。
突っ込み、お願いします。

Sub test()
  Dim i As Integer
  Dim st_flag As Byte
  Dim range1 As Range
  
  st_flag = 0
  i = 3
  Do While Cells(i, 1).Value <> ""
    If (st_flag = 1) Then
      If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
        Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
      End If
    Else
      st_flag = 1   ''最初の1セルは比較をしない
    End If
    i = i + 1
  Loop
End Sub

258 :デフォルトの名無しさん:2008/09/17(水) 19:04:30
読むのめんどいからどの行でエラーなのか教えて

259 :デフォルトの名無しさん:2008/09/17(水) 19:37:16
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium

Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium

260 :デフォルトの名無しさん:2008/09/17(水) 20:29:58
実行時エラー '1004':

Border クラスの LineStyle プロパティを設定できません。

これくらいコピペしようぜ

261 :デフォルトの名無しさん:2008/09/17(水) 20:30:38
時間の許す限りエラーの内容くらい小一時間考えよう

262 :デフォルトの名無しさん:2008/09/17(水) 20:37:01
質問者と回答者よりも講釈師の方がが多いスレ

263 :デフォルトの名無しさん:2008/09/17(水) 21:21:15
板全体に言えるわけだが
すれ違い甚だしい質問だとか煽りだとか
ここはまだまし

264 :デフォルトの名無しさん:2008/09/17(水) 21:42:26
>>262
質問者 回答者 講釈師
貴方はどれに該当しますか?

265 :デフォルトの名無しさん:2008/09/17(水) 21:43:55
ヌルポ

266 :デフォルトの名無しさん:2008/09/17(水) 21:51:22
ポルヌ

267 :デフォルトの名無しさん:2008/09/17(水) 21:52:59
>>262は煽り専門要員だよ

268 :y:2008/09/17(水) 23:26:36
>>254
念のため補足しますが、>>248のコードは決して最善の方法ではありません。
合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの
アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。

仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、
マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、
>255でも指摘をいただいていますが、普通はやらないでしょう。
(数がたくさんになると、けっこう動作が重くなってしまいます)

まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、
転記の仕方に改良の余地があります。適当な二次元配列を用意して、
取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
書き込む、というのが一般的なやり方になると思います。

>>256
TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を
実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。
ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。



269 :デフォルトの名無しさん:2008/09/18(木) 01:50:36
さすがy

270 :デフォルトの名無しさん:2008/09/18(木) 05:40:38
うぜぇ

271 :デフォルトの名無しさん:2008/09/18(木) 09:07:55
>>257っす。

>>258
申し訳ないっす。ブレークポイントで調べてみたらここらしいです。
      If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
→       Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
      End If

>>259
うぉ、できました!
罫線の種類とか太さとか、指定する先が間違っていたのですね。

>>260
そこまで親切に表示されませんでした。orz
出てきたのは、
 実行時エラー '1004':
 アプリケーション定義またはオブジェクト定義エラーです。
でした。あ、verはexcel2003です。

>>261
小一時間考えて駄目だったので聞いてみました。orzorz
Cのコンソール系しか打ったことが無いので、感覚的につかめなくて。

ともあれ、無事にできたので。
ありがとうございました。m(_ _)m

272 :デフォルトの名無しさん:2008/09/18(木) 14:26:11
>>266

!ッガ

273 :デフォルトの名無しさん:2008/09/18(木) 18:15:17
>>242をわざわざVBA使ってまでやってる理由が分からんな…
関数だけで何とでもなりそうだw

274 :デフォルトの名無しさん:2008/09/18(木) 19:42:37
>適当な二次元配列を用意して、
>取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
>書き込む、というのが一般的なやり方になると思います。

はぁ?
何でお前ごときが一般論を語れるんだよ?

275 :デフォルトの名無しさん:2008/09/18(木) 20:49:36
>>274
お前ごときがここにくんな

276 :デフォルトの名無しさん:2008/09/18(木) 22:30:24
今独学でVBAを学んでいます。
皆さんにお聞きしたいのですが、
独学で学ぶにお薦めの本はありますか?

大村あつし著 かんたんプログラミング EXCEL VBA基礎編
と できるシリーズのVBAを読んでいます。



277 :デフォルトの名無しさん:2008/09/18(木) 23:40:24
>>276
漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・
VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
便利なテクニックとかはネットで拾い集めて行く

最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから
本は全然信用してないだけだけどなw
でも1冊だけ役に立った本があったな・・・
「Excel VBA逆引き大全」とかだったかな?

278 :デフォルトの名無しさん:2008/09/19(金) 01:19:38
すいません。
VBA作成経験なく、ここを答えを求める場として
使うことに申し訳なく思っています。

複数のExcelファイルを指定する。
当該ファイルを新ブックにして保存する。
→その際、シート名が重複しても問題なし
 新ブックのファイル名はあらかじめ指定したものを

このようなマクロをつくることは可能でしょうか。
前述のとおり、まったく経験なしなので、
サンプル、たたき台程度で構いませんので、
ご教示いただけたら嬉しいです。

279 :デフォルトの名無しさん:2008/09/19(金) 01:57:51
相変わらずyきめぇw

280 :デフォルトの名無しさん:2008/09/19(金) 02:05:09
>>278
さっぱり意味がわかりません。

281 :デフォルトの名無しさん:2008/09/19(金) 02:08:42
>>277
>VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
できる奴の戯言だな

282 :デフォルトの名無しさん:2008/09/19(金) 04:03:48
>>278
簡単だよ。

283 :デフォルトの名無しさん:2008/09/19(金) 06:07:09
>>275
アホ?

284 :デフォルトの名無しさん:2008/09/19(金) 06:25:29
>>281
いや普通できると思うできないのは文盲

285 :デフォルトの名無しさん:2008/09/19(金) 06:26:23
>>283
ゆとり乙

286 :デフォルトの名無しさん:2008/09/19(金) 06:37:00
ここの奴ら「簡単」だの「出来て当たり前」だの口ばかり達者で
入門書レベルの事しか回答出来ないから笑える

287 :デフォルトの名無しさん:2008/09/19(金) 06:43:18
>>286
お前だろそれ

288 :デフォルトの名無しさん:2008/09/19(金) 07:01:00
あらあらw

289 :デフォルトの名無しさん:2008/09/19(金) 07:04:32
vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw


290 :デフォルトの名無しさん:2008/09/19(金) 07:05:18
誤爆した

291 :デフォルトの名無しさん:2008/09/19(金) 07:06:03

>>278
複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど

292 :デフォルトの名無しさん:2008/09/19(金) 08:52:57
>>278
まとめると
複数ファイルのブック内のシートを結合する
シート名は重複している場合がある
だよな?
シート数は全部でどのくらいになるんだ?
あまり多いと1つのブックに収まらないよ

293 :デフォルトの名無しさん:2008/09/19(金) 09:10:07
>>292
すいません、追加・変更があります。

○○システムの情報 ブック*2
□□システムの情報 ブック*2
(全部で5システム)

上記1ブックに1シートのみ

これをシステムごとに1ブックとして新規に保存。
なので、計5ブックができる。

これを一回でやりたいです。

下記の情報をあらかじめ指定(変更可)
- 各システムの情報ブック
- 新ブックの名前

を考えています。

294 :292:2008/09/19(金) 10:40:41
>>293
かなり手抜きだが書いてみた
コピー後のシート名は指定するように作った
マクロを入れるブックに
A列(ファイルバス)| B列(コピー後のシート名)
○○システム
C:\A1.xls| Sheet○○1
C:\B1.xls| Sheet○○2
C:\C1.xls
○×システム
C:\A2.xls| Sheet○×1
C:\B2.xls| Sheet○×2
C:\C2.xls

といった感じにデータ入れて以下のマクロを動かす
(AとBはコピー元Cがコピー先)

295 :292:2008/09/19(金) 10:41:55
Sub Macro1()
Dim wkAWorkbook As Workbook
Dim wkBWorkbook As Workbook
Dim wkCWorkbook As Workbook
Dim i As Long

For i = 0 To 1
With ThisWorkbook.Worksheets(1)
'コピー元1つ目を開く
Set wkAWorkbook = Workbooks.Open(.Cells(2 + i * 4, 1))
'1つ目を新規ブックにコピー
wkAWorkbook.Worksheets(1).Copy
Set wkCWorkbook = ActiveWorkbook
'コピーしたシートをリネーム
ActiveSheet.Name = .Cells(2 + i * 4, 2)

改行多すぎので次レスに続く

296 :292:2008/09/19(金) 10:43:09

'コピー元2つ目を開く
Set wkBWorkbook = Workbooks.Open(.Cells(3 + i * 4, 1))
'2つ目を上でコピーしたブックにコピー
wkBWorkbook.Worksheets(1).Copy after:=wkCWorkbook.Sheets(1)
'コピーしたシートをリネーム
ActiveSheet.Name = .Cells(3 + i * 4, 2)

'開いた時に見栄えが悪いので1つ目のシートを選択
wkCWorkbook.Sheets(1).Select
'名前をつけて保存
wkCWorkbook.SaveAs (.Cells(4 + i * 4, 1))
'終了処理
wkAWorkbook.Close
Set wkAWorkbook = Nothing
wkBWorkbook.Close
Set wkBWorkbook = Nothing
wkCWorkbook.Close
Set wkCWorkbook = Nothing

End With
Next i
End Sub

専ブラじゃないのでずれて見づらいかも知れんなw

297 :デフォルトの名無しさん:2008/09/19(金) 20:49:06
頭悪そうなコード

298 :デフォルトの名無しさん:2008/09/19(金) 21:05:31
変数名のつけかたって、読んだ参考書や勉強したサイトにけっこう影響されない?

299 :デフォルトの名無しさん:2008/09/19(金) 21:08:44
変数名のセンスが悪いな

300 :y:2008/09/19(金) 21:23:03
>>276

「VBAの絵本」(アンク)
アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に
伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん
多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。
概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を
持っているのであればそれで足りると思います。

「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本〜最初からそう教えてくれればいいのに」(秀和システム)
「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、
文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので
まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。

「VBAポケットリファレンス」(技術評論社)
ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。
ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、
書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに
付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので
思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です)

「逆引き」本(各社)
>276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに
用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。
「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の
コードが割と簡単に見つかったりします。


301 :y:2008/09/19(金) 21:24:04
他にも良書はたくさんあるので、上にこだわることはありませんが、ひとつだけ、初心者が解説書を選ぶ上で
ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。
ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を
早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。


302 :デフォルトの名無しさん:2008/09/19(金) 21:27:08
たいしたデバッガじゃないからヘルプで十分だよ

303 :y:2008/09/19(金) 21:56:25
>>273
Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、
それを組み合わせれば、フィルタだけで何とかなるような気がします。
ただ関数だけでやるとなると… いい方法が思いつきません。

304 :y:2008/09/19(金) 22:28:11
すみません。>>300の「>276で既に上がっていますが」は、「>277」の間違いです。
さらに内容も、結構>277とかぶってしまっています。失礼しました。




305 :292:2008/09/19(金) 23:27:08
>>297
頭悪そうなレス

>>299
センスが良いネーミングをぜひとも教えてくれ


貶すことしか知らない無能って多いな

306 :デフォルトの名無しさん:2008/09/19(金) 23:31:05
あらあらw

307 :デフォルトの名無しさん:2008/09/20(土) 00:29:08
先週金曜日あたりから突然会社のExcel2002がおかしくなった。ネットワークが切断されたかなんたらで、ファイルにアクセスできないやらなんたらというのがおきるようになった。
コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。
自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった
ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか?
解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)

308 :デフォルトの名無しさん:2008/09/20(土) 01:39:41
IDでないのにわざわざコテつけて煽るってなにこいつ

309 :デフォルトの名無しさん:2008/09/20(土) 02:37:18
初心者です、お世話になります。
他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。
セルA1とB1にそれぞれシリアル値による時間が入っています。
セルの書式設定により時間が表示されています。
ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。
A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。
Label1.Caption = Range("B1") - Range("A1").value
とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。
助けてくださいませ。

310 :デフォルトの名無しさん:2008/09/20(土) 03:58:49
>>292
ホントありがと。
まったくプログラム経験なしだけど、
書いていただいたものをもとに
勉強含め動かしてみたいと思います。

感謝します。

311 :デフォルトの名無しさん:2008/09/20(土) 08:40:23
>>309
DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、
後はそこから時分秒に分割して文字列に結合して完成、って所?

312 :デフォルトの名無しさん:2008/09/20(土) 09:24:11
>>305
一生そのままで朽ち果てろ

313 :デフォルトの名無しさん:2008/09/20(土) 10:14:55
ジョン3兄弟

314 :y:2008/09/20(土) 13:55:32
>>309

>311のやり方で可能ですが、他にこういう書き方も。
Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")


315 :デフォルトの名無しさん:2008/09/20(土) 16:18:39
>>311>>314
アドバイスどうもありがとうございます。
テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが出てしまいます。
私は知識不足なので対応がわかりません。
これは、どういうことなのでしょうか?

316 :デフォルトの名無しさん:2008/09/20(土) 16:35:45
>>311>>314
失礼しました、できました。
ほんとうにありがとうございました。

317 :デフォルトの名無しさん:2008/09/20(土) 19:35:44
hh:mm:ssでなくて?

318 :デフォルトの名無しさん:2008/09/20(土) 20:41:32
nnでもいけるんだよね

319 :y:2008/09/21(日) 00:37:26
そうですね。
書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、
分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。
ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。
逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。
そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。


320 :デフォルトの名無しさん:2008/09/21(日) 00:47:17
うざ

321 :デフォルトの名無しさん:2008/09/21(日) 03:56:03
>>320
なんでこいつこのスレに粘着してるの?

322 :デフォルトの名無しさん:2008/09/21(日) 08:47:58
Excel 2009を使用しております。

テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?

例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。

画像を見てもらったほうが早いので、説明画像も作成しました。
http://sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg

どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。

323 :y:2008/09/21(日) 09:13:13
>>322
チェックを入れたり外したりする操作を、「マクロの記録」(>>1★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。

324 :デフォルトの名無しさん:2008/09/21(日) 09:37:36
>>321
うざいからだろw

325 :デフォルトの名無しさん:2008/09/21(日) 09:42:50
>>323
ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。

「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。

  ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
    xlFilterToday, Operator:=xlFilterDynamic
  ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
    ("途中", "予定", "スキップ"), Operator:=xlFilterValues

ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。

326 :デフォルトの名無しさん:2008/09/21(日) 15:51:36
質問なのですが、
同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容
のように分割して表示することは可能でしょうか?
(ウィンドウを別々に開くのではなく)
もしやり方があるのであれば教えてください。
Excel2003を使用しています。

よろしくお願いします。

327 :デフォルトの名無しさん:2008/09/21(日) 17:20:23
スレ違い

328 :デフォルトの名無しさん:2008/09/21(日) 20:07:05
質問です。
-------------------------------------------
【やりたいこと】
(1).ファイル保存ダイアログでファイル名を選択させる。
(2).新規ファイル名を入力することも可能にする。
(3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。

【直面している問題】
・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない
・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない

【環境】
WindowsXp SP3 + Excel2002 SP3
-------------------------------------------
よろしくお願いします。


329 :デフォルトの名無しさん:2008/09/21(日) 21:06:15
>>328です。事故解決しました。
Excel.Application.GetSaveAsFilename
を使えばよかったんですね。

スレ汚し失礼。

330 :デフォルトの名無しさん:2008/09/24(水) 00:40:37
ExcelVBAって、.netよりもVB6に近いですか?


331 :デフォルトの名無しさん:2008/09/24(水) 07:22:11
うーん。その質問は難しいな。
似てるけど全くの別物と思っておいた方がいいよ。

332 :デフォルトの名無しさん:2008/09/24(水) 13:31:46
いやVB6とほとんど同じ

333 :デフォルトの名無しさん:2008/09/24(水) 15:45:03
VB6でオブジェクトブラウザ開いてみな VBAがあるでよ

334 :デフォルトの名無しさん:2008/09/24(水) 16:05:39
>>330-332
何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物

>>333
そのVBAとVisual Basic for Applicationは意味違うからw

335 :デフォルトの名無しさん:2008/09/24(水) 18:37:44
Worksheets("表").Range("A2").Select

と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、

With Worksheets("表")
  .Select
  .Range("A2").Select
End With

と記述するとエラーが出ずに問題なく実行されるのはなぜなの?

336 :y:2008/09/24(水) 21:36:05
あるセル範囲に対してSelectメソッドを実行したとき、
そのセル範囲が含まれるシートが選択されていなければ、
実行時エラーが発生する仕様になっているためです。

>335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。
上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。


337 :デフォルトの名無しさん:2008/09/24(水) 21:57:49
>Worksheets("表").Range("A2").Select
こうすればいい。
>Worksheets("表").Select
>Worksheets("表").Range("A2").Select
# って、既に歪の人が書いていたか。

338 :デフォルトの名無しさん:2008/09/24(水) 23:27:58
スレチでしたら誘導願います。
xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。
ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです?

同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、
excelとaccessのVBAは同じものですか?全く別物でしょうか??
すみません、宜しくお願いします。

339 :デフォルトの名無しさん:2008/09/24(水) 23:33:34
>>338
AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。

340 :デフォルトの名無しさん:2008/09/24(水) 23:37:41
>>338
VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない

341 :デフォルトの名無しさん:2008/09/24(水) 23:44:40
>>339>>340
レスdくすです。

つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw

342 :デフォルトの名無しさん:2008/09/25(木) 00:42:24
いらないならタダでくれればいいのにセコイ同僚だな

343 :デフォルトの名無しさん:2008/09/25(木) 15:13:33
Dim Cnt, Num As Integer
Dim Tbx As TextBox
Num = 0
For Cnt = 1 To 9
Num = Num + 1
Set Tbx = "TextBox" & Num
Tbx.Text = ""
Next

VBAは変数の型を自動変換してくれると考えて、これを実行すると、
「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。

344 :デフォルトの名無しさん:2008/09/25(木) 16:09:13
>>343
>Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?

TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる

345 :デフォルトの名無しさん:2008/09/25(木) 16:39:59
>>344
サンキュー!!!!!!!!!

346 :デフォルトの名無しさん:2008/09/25(木) 16:45:25
ちなみに余計なお節介かもしれんけど
Dim Cnt, Num As Integer と書くと cntはVariant型だぞ

347 :デフォルトの名無しさん:2008/09/25(木) 17:07:39
>>346
わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのはUserForm1のコントロールTextBox1〜9までの値をクリアすることでした。

Private Sub CommandButton5_Click()

' TextBox1〜9までのTextプロパティの値をクリアする
Dim iCnt As Integer, iNum As Integer, oTbx As Control
iNum = 0
For iCnt = 1 To 9
iNum = iNum + 1
Set oTbx = UserForm1.Controls("TextBox" & iNum)
oTbx.Text = ""
Next

End Sub


348 :デフォルトの名無しさん:2008/09/25(木) 18:48:29
ExcelVBAExpressEditionってないの?

349 :デフォルトの名無しさん:2008/09/26(金) 09:26:40
えっえっえっえっ
えっろっびっでぉー

350 :デフォルトの名無しさん:2008/09/26(金) 18:02:31
>>348
excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。

351 :デフォルトの名無しさん:2008/09/27(土) 22:33:47
Hになればなるほど、固くなるものってな〜んだ?

352 :デフォルトの名無しさん:2008/09/27(土) 22:35:18
鉛筆の芯

353 :デフォルトの名無しさん:2008/09/27(土) 22:53:05
エクセルにVBAが付いてくる…一般
VBAにエクセルが付いてくる…マ
>350は素人

354 :デフォルトの名無しさん:2008/09/27(土) 23:28:04
> VBAにエクセルが付いてくる…マ
これ、笑うところ?
あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか
それなら納得

プログラマがこんな本質を違えた愚かな発想するわけないもんなw

355 :デフォルトの名無しさん:2008/09/28(日) 00:02:57
VBAって、いわゆるスクリプトだろ?
サクラエディタにでも書けばいいじゃん。

356 :デフォルトの名無しさん:2008/09/28(日) 00:09:48
Excel 2008ではVBAサポートが廃止されました

357 :ちら裏:2008/09/28(日) 06:12:41
VBとVBA,VB.NETは共にプログラミング言語文法の名前がVisual BASICというだけで
3つとも全部違うと思って欲しい。

それぞれ用途がかなり違う。文法も基本的な部分は同じでも、
実際にコードしてみると、かなーり違うことがわかる。

例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。

DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。
VB.NETでは網羅されて使いやすいCLRが使える。
Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒

しかしExcelのVBAは
精々ユーザー定義関数の定義や、外部ファイル入出力関係の
典型処理の組み込みや、フールプルーフ目的のフォーム作成
といった補助的な利用に留めておくべきで、ExcelをVB
環境の一種として取り扱うのはやめたほうがいい。
(VBを学ぶ環境としては余り適していない)

358 :デフォルトの名無しさん:2008/09/28(日) 08:25:19
Visual Studio Tools for Applications
って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。

>>356
VBAサポート打ち切ったら、マジ売れなくね?

359 :デフォルトの名無しさん:2008/09/28(日) 12:22:40
>>357
ひどい知ったかなので、初心者は信じないように。

360 :デフォルトの名無しさん:2008/09/28(日) 12:56:22
>>359
失敗の経験も貴重だから、確かにそうだな。

361 :デフォルトの名無しさん:2008/09/28(日) 14:37:52
>>358
2008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ

362 :デフォルトの名無しさん:2008/09/28(日) 21:06:11
>>360
意味がわからん

363 :高島彩:2008/09/29(月) 15:57:37
ワークシートつかわないでVBAでRSSの値とるやり方おしえて

364 :HIRO ◆225xxx6ZSE :2008/09/29(月) 16:07:10
   , - ,----、 
  (U(    ) 
  | |∨T∨  皆さん、>>363をよろしくお願いします。
  (__)_)

365 :高島彩:2008/09/29(月) 16:12:29
       ____
      /∵∴∵∴\
     /∵∴∵∴∵∴\
    /∵∴∴,(・)(・)∴|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
    |∵∵/   ○ \| <  >>364 氏ねよ!!
    |∵ /.  ミ  | 彡 |   \_______
    |∵.|  \___|_/|    ___
     \|   \__ノ /   /     \  
       \___/    /∧      \
      /      )  | ×       | _     _
     / ,イ 、  ノ/   |●(     ―= ̄ `ヽ, _
    / / |   ( 〈 ∵. ・\  〈__ >  ゛ 、_―
   | !  ヽ  ー=- ̄ ̄=_\_(/ , ´ノ
   | |   `iー__=―_ ;, / / /   
    !、リ  -=_二__ ̄_=;, / / ,'
        /  /       /  /|  |
       /  /       !、_/ /   〉
     / _/             |_/
     ヽ、_ヽ

366 :デフォルトの名無しさん:2008/09/29(月) 21:36:04
>>363
ごく普通にやればいいだけだよ
VBやCでやるのと同じように

つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう

367 :HIRO ◆225xxx6ZSE :2008/09/30(火) 00:14:01
   , - ,----、 
  (U(    )  >>366
  | |∨T∨  ありがとうございます。
  (__)_)

368 :デフォルトの名無しさん:2008/10/01(水) 00:19:39
http://www.nicovideo.jp/watch/sm3058430
ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。

http://uproda11.2ch-library.com/src/11122054.zip.shtml

369 :368:2008/10/01(水) 00:36:04
バージョン:Excel2007
OS:Vista

私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。

370 :デフォルトの名無しさん:2008/10/01(水) 03:44:42
>>368
全く試さない上でVBA素人の俺が脊髄反射レス

・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ

・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ

・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい


371 :デフォルトの名無しさん:2008/10/01(水) 07:26:33
Private Sub CommandButton1_Click()
Randomize

Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用

hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value

ReDim hsMap(1 To hsYmax, 1 To hsXmax)

For x = 1 To 1000

Application.ScreenUpdating = False

'マップに戦闘力を設定。マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i

372 :デフォルトの名無しさん:2008/10/01(水) 07:27:04
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする
Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color
ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする
Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color
ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする
Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color
ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする
Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color
End If
End If
Next j
Next i

Application.ScreenUpdating = True

Next x

End Sub

373 :368:2008/10/01(水) 07:43:19
↑はソースのコピペです。
一応貼っときます。

戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・

374 :デフォルトの名無しさん:2008/10/01(水) 14:08:29
>>368
フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした

375 :374:2008/10/01(水) 14:08:53
Option Explicit
Sub CommandButton1_Click()
Randomize

Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim hsColor() As Long 'マップの色格納用配列変数
Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用)
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
Dim hsCells As Object
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
ReDim hsColor(1 To hsYmax, 1 To hsXmax)
ReDim hsColor_old(1 To hsYmax, 1 To hsXmax)

With Range(Cells(1, 1), Cells(hsYmax, hsXmax))
'シートから色を取得
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
hsColor(i, j) = .Cells(i, j).Interior.Color
Next j
Next i

376 :374:2008/10/01(水) 14:10:02
For x = 1 To 1000
Application.ScreenUpdating = False
'マップに戦闘力を設定
'マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
hsColor_old = hsColor
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor(i, j + 1)
End Select
End If
Next j
Next i


377 :374:2008/10/01(水) 14:10:48

'マップ(シート)に色を反映
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> hsColor_old(i, j) Then
.Cells(i, j).Interior.Color = hsColor(i, j)
End If
Next j
Next i

Application.ScreenUpdating = True
Next x
End With
End Sub



378 :デフォルトの名無しさん:2008/10/01(水) 15:41:37
どこかのセルが変更された時に処理(以下、処理A)が走るようにしています。

最初の処理(以下、処理B)でセルを変更しています。
処理Bのときだけ処理Aを走らせないようにしたいのですが、
どうしたらいいでしょうか。

379 :デフォルトの名無しさん:2008/10/01(水) 16:09:13
>>378
Application.EnableEvents = False
かな?

380 :デフォルトの名無しさん:2008/10/01(水) 16:31:03
>>379
まさにそれでした。ありがとうございました。

最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。

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

381 :368:2008/10/01(水) 22:30:32
>>370
>>374
ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。

ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・

382 :デフォルトの名無しさん:2008/10/01(水) 23:44:27
>>381
謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。

最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。

383 :デフォルトの名無しさん:2008/10/02(木) 05:20:47
Excel2000 で 255文字以上のフルパスの存在チェックで DIRでチェックしようとすると「ファイルが見つかりません。」になるんですが回避するにはどうすれば良いですしょうか?

if dir( 255文字以上のパス ) <> "" then


384 :デフォルトの名無しさん:2008/10/02(木) 05:48:56
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.fileExists(ぱす) = False Then
でいけたかも。他にあれば教えてください。

385 :368:2008/10/02(木) 07:45:57
>>382
それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。

順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・

386 :374:2008/10/02(木) 10:40:57
>>365
比較する順序ではなく色を入れ替えるタイミングの問題では?

 Select Case hsMaxPow
   Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
     hsColor(i, j) = hsColor_old(i - 1, j)
   Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
     hsColor(i, j) = hsColor_old(i, j - 1)
   Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
     hsColor(i, j) = hsColor_old(i + 1, j)
   Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
     hsColor(i, j) = hsColor_old(i, j + 1)
 End Select

と更新前の色を入れてやれば少しは改善するかもしれません

387 :デフォルトの名無しさん:2008/10/02(木) 14:59:02
マクロを実行してファイルを閉じ、再び同じウィンドウで
マクロ入りのファイルを開いても、マクロが実行できません。

VBAを使っていろいろ処理して終了させます。
処理の中では画面更新の抑制やら色々やってます。

マクロを実行したbookを閉じてから、マクロが入った
ファイルを開くと、右クリックで新規ウィンドウ等を
やらない限りは必然的に、既に開いているExcelを使って
ファイルが開かれると思うのですが、そうなるとマクロが
動かないんです。

セキュリティの問題ではなくマクロが無いファイルのような
そんな扱いです。やはり、色々標準の機能を殺しているのが問題で
それが終了しても保持され続けているのが問題なのでしょうか??

388 :デフォルトの名無しさん:2008/10/02(木) 15:20:53
>>387
セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?

389 :デフォルトの名無しさん:2008/10/02(木) 20:31:10
1行目と3行目を選択(1行目を選択してからCtrl+3行目を選択)すると、
Range("1:1,3:3").Select
と言うコードが得られますが、
変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。

よろしくお願いします。

390 :デフォルトの名無しさん:2008/10/02(木) 20:41:43
>>389
Dim a As Integer, b As Integer
Rows(a & ":" & b).Select

391 :390:2008/10/02(木) 20:45:59
動かなかった・・・orz

Dim a As Integer, b As Integer
a = 1: b = 3
Range(Rows(a).Address & "," & Rows(b).Address).Select


392 :デフォルトの名無しさん:2008/10/02(木) 21:42:23
お世話になります。
for loopの入れ子でループを抜けたいときは
gotoするのが一般的なんでしょうか?
gotoってあんまり使うなと言われているので
For intI = 3 To 65535
For intJ = 1 To 255
'条件が一致すればここからいっきに2つのループを抜けたい
Next intJ
Next intI

あとループ変数って単純にi,j,kとするか
なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか
よろしくお願いします。

393 :デフォルトの名無しさん:2008/10/02(木) 21:48:27
多重ループ脱出は数少ないgotoの出番だぞ。
(無論そのための仕組みが存在する言語なら話は別だが)

ループ変数はi, j, kとするのが単純かつ分かりやすい。
intIですらやめてくれと言うところだ。

394 :デフォルトの名無しさん:2008/10/02(木) 22:11:03
なるほど そうでしたか
ありがとうございました

395 :デフォルトの名無しさん:2008/10/02(木) 22:40:28
>>393
プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う

396 :デフォルトの名無しさん:2008/10/02(木) 23:09:51
>>395
それはプロシージャを分割した方がいいんじゃないかな

397 :デフォルトの名無しさん:2008/10/02(木) 23:23:45
クラスモジュールと
標準モジュールの違いがいまいちわからん

クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると
名前でプロシージャーを呼び出せるってことなのか?

標準だと他のモジュールのって呼び出せない?

398 :デフォルトの名無しさん:2008/10/02(木) 23:39:33
>>389
union(rows(a),rows(b)).Select

399 :368:2008/10/02(木) 23:51:05
>>374
ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。

400 :デフォルトの名無しさん:2008/10/03(金) 00:02:25
>>395
ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。

401 :デフォルトの名無しさん:2008/10/03(金) 09:05:00
>>397
VBA分野の話じゃないね、スレ違い

402 :デフォルトの名無しさん:2008/10/03(金) 09:26:22
>>392
2重ループ脱出はForとDoを併用するのが常套手段

For intI = 3 To 65535
  Do Until intJ = 255
    Exit For
  Loop
Next intI

403 :デフォルトの名無しさん:2008/10/03(金) 19:39:08
Do/Loopを使うと速度が落ちちゃうじゃないか、とか言ってみる。

404 :デフォルトの名無しさん:2008/10/03(金) 20:28:55
>>402
それは無い

405 :デフォルトの名無しさん:2008/10/03(金) 22:13:12
ループ抜けの話が出ていたので、質問をさせてください。
例えば、

for i = 1 to 100
if cells(i,1).value like "hoge" then
set cl = cells(i,1)
end if
next

のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。
上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。

406 :>401:2008/10/03(金) 23:22:31
( ゚д゚)

407 :デフォルトの名無しさん:2008/10/03(金) 23:40:02
>>405
セルをセットした後にExit For

408 :デフォルトの名無しさん:2008/10/04(土) 00:55:23
ほとんど基礎もできていませんがアドバイスお願いします

自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります
これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません

一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません
多くて40ファイルです

どうぞよろしくお願いしますm(_ _)m

409 :デフォルトの名無しさん:2008/10/04(土) 01:25:38
>>408
その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく

>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw

>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?

>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・

410 :デフォルトの名無しさん:2008/10/04(土) 01:47:52
早速のレスを有難うございます。説明が至らずすみません
おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません
見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです
そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました
目視です。一応FIND窓で捜しはします…

独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、

411 :デフォルトの名無しさん:2008/10/04(土) 02:00:03
すみません余りに眠いのでちょっと離れます

なお40種は40行の意味です

412 :デフォルトの名無しさん:2008/10/05(日) 09:52:11
>408,410
横レスします。
状況を私なりに解釈し、不足するところをおたずねします。
1 参照元ファイル(以下ブックと呼びます)は最大40個ある
 (408の下から2行目の記述から)

2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある
 (410の上から3行目の記述と411の「40種は40行」の記述から)

3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている
 (410の上から4行目の記述)

4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと?

質問
Q1 上の解釈でいいんでしょうか?
Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?


413 :デフォルトの名無しさん:2008/10/05(日) 12:46:49
レスを有難うございます
まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<)
@A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります
BC→OKです

Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ)
なおかつそのブック名もセルA4の番号をつけないといけません

15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで
頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました

まだ言葉足らずかと思いますがどうぞよろしくお願いいたします

414 :デフォルトの名無しさん:2008/10/05(日) 14:25:37
初心者にありがちなこと:
 やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに
 ぐだぐだと質問&回答を続ける。

良い質問方法:
 やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。

415 :デフォルトの名無しさん:2008/10/05(日) 15:03:16
すみません本当に初心者なもので……

やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です
セルA4に対応した番号は他のブックに見に行きます

この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします

416 :デフォルトの名無しさん:2008/10/05(日) 16:11:49
致命的に説明が下手だな。とはいえ、普通の奴はこんな感じが標準なのかもしれんが。
商品マスタ(Product.xls)と注文ブック(Order.xls)ということにして、仕様を書いてみた。

[前提]
1.Product.xlsのSheet1のA:B列に何らかのデータが入力されている
2.毎日Excel Bookが40ファイル程度できる
3.そのBook名は[12桁の文字列].xls(以降、Order Bookと表記)
4.Order Bookには1シート(以降、Orderシート)しか存在せず、そのシートのA4には[12桁の文字列]が設定されている

[やること]
1.毎日発生するOrder BookのOrderシートのA6に、Product.xlsから取得したデータを設定し上書き保存する
2.データの取得方法は、Product.xlsのSheet1!A列の中から、[12桁の文字列]を探し、適合する
  行が合った場合は対応するB列の値を持ってくる

[異常処理]
1.Order Book名とA4の内容が異なる場合は***する
2.[12桁の文字列]が見つからなかった場合は***する

[疑問]
>多くて40行2列、少ない時は10行2列
これはどのタイミングでどのような理由で変更されるのか?


417 :デフォルトの名無しさん:2008/10/05(日) 16:16:17
それから簡単、簡単言うな。
お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、
単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。

418 :デフォルトの名無しさん:2008/10/05(日) 17:42:54
はぁー言われてみたらその通りです。こういう表現をするんですね? 確かにこのように書け、と言われたらできるのかどうか

それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません

また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、
検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる…

自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる
AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存
とかが簡単に出来るのかな?のイメージでした;ω;
スミマセン

419 :412:2008/10/05(日) 17:49:34
>408,410,413,415
もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)

2 結果を求める(作業用)ブックは複数生まれる
 (413の「保存が1ブック1シートでないといけない」ということと、
  「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測)

3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元
 ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する

4 上記3を15〜40回繰り返す

これでいいのかな?

もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。
作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、
A6セルにVLOOKUP関数を書いたらいいんじゃないかな。
外部参照って言い方が正しいのかわからないけど、ヘルプで
「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。

420 :412,419:2008/10/05(日) 17:50:56
ありゃ、回答を書いているうちに質問者さんからの書き込みがあった。419はなかったことにしてください。

421 :デフォルトの名無しさん:2008/10/05(日) 18:16:27
お世話になります
3.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません

VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです

422 :420:2008/10/05(日) 18:41:03
>421
↑のことも入れて、もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)

2 結果を求める(作業用)ブックはメールにて複数送られてくる
  なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避)

3 作業用ブックのA4セルには既に12桁の番号が入力されていて、
 ・現状では  参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し)
 ・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても
        それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている
  ※作業対象のブックを指定する作業は手動か?
   (作業対象ブックが保存されているフォルダを指定できれば自動化も可能)

423 :デフォルトの名無しさん:2008/10/05(日) 18:52:53
出来の悪いSEと出来の悪いクライアントのgdgdな打ち合わせの例

424 :デフォルトの名無しさん:2008/10/05(日) 19:10:08
確かに文章だけで説明する事がこんなに大変とは!

'作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です
というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり

ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…

425 :422:2008/10/05(日) 20:00:20
>424
流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。
1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得
2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得)
3 参照元ブックを閉じる
4 上記1で取得したファイル一覧からひとつずつ処理
(1) カレントブックを開く
(2) A4セルの値を取得
(3) 配列を調べて対応する値をA6セルに書き込む
(4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい)
(5) (1)〜(4)の繰り返し
5 終了(画面更新再開)

処理がちゃんと進んでいるか確認するために、マクロを記録したブックに
A列:カレントブック名(もしくはフルパス)
B列:A4セルの値
C列:A6セルに書き込んだ値
を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。


426 :デフォルトの名無しさん:2008/10/05(日) 20:02:14
ググったのですが適切な単語が思いつかなかったので質問させてください。
関数を自作しようと思ったのですが、
その関数が代入されるセルのオブジェクトを取得することは可能でしょうか?
入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。
可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。

427 :デフォルトの名無しさん:2008/10/05(日) 20:02:53
よろしくお願いします。

OS:XP、Excel2003

Module5で、Public Sub AAA() という関数を作成して
Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。
Module1に関数を作成して、Module5使うことは出来ています。
これは、モジュール名の順番みたいなものが関係しているのでしょうか?


428 :デフォルトの名無しさん:2008/10/05(日) 20:30:01
質問です。(WinXP,Excel2003)
マルチスレッドで処理をしたいのですがうまくいきません。
以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、
エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。
どこが問題なのでしょうか?ご教示お願いします。

'----モジュール------
Public Const STILL_ACTIVE As Long = 259
Public Function testThread(ByVal n As Long) As Long
  Dim i
  For i = 1 To 10
    Sheet1.Cells(1, n) = i
    DoEvents
  Next i
  testThread = 0
End Function
'----シート------
Private Sub test_Click()
  Dim hThd, idThd, dwExCode As Long
  hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd)
  Do
    DoEvents
    If (GetExitCodeThread(hThd, dwExCode)) Then
      If (dwExCode <> STILL_ACTIVE) Then Exit Do
    End If
  Loop While True
  CloseHandle hThd
End Sub

429 :デフォルトの名無しさん:2008/10/05(日) 21:11:43
>>425
は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません

430 :デフォルトの名無しさん:2008/10/05(日) 21:36:03
作ってくださいとちゃんと言えよ、アホ

431 :デフォルトの名無しさん:2008/10/05(日) 21:37:46
>>428
ド素人がVBAでマルチスレッドを使おうとするのが問題

432 :デフォルトの名無しさん:2008/10/05(日) 22:21:52
は、はぁ、、例えばコードを書いてもらう事を作るといいますか?
作ってください!お願いします(^人^)
でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)……

何か自分の知らない簡単な方法があるような気がしてならなかったり?

433 :デフォルトの名無しさん:2008/10/05(日) 22:32:39
コード書いてもらう事は、作る事に他ならないが・・・。
作るって、何を作る事だと思う?

と言うか、作成依頼はスレ違い。

自分でやって、分からない事を聞くようにしておくれ。

434 :425:2008/10/05(日) 22:39:17
>432
このスレのbPの
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。

自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html

435 :デフォルトの名無しさん:2008/10/05(日) 22:39:41
皮肉もわからないとかw

436 :デフォルトの名無しさん:2008/10/05(日) 22:44:42
dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする
ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。

437 :デフォルトの名無しさん:2008/10/05(日) 22:46:49
>>425でわかんないなら、もうこのスレ向きの話題じゃなくなった。

438 :デフォルトの名無しさん:2008/10/05(日) 22:47:20
マァマー(´・ω・`)

439 :デフォルトの名無しさん:2008/10/05(日) 23:08:07
>>434
エクセルの学校の添付を有難うございました

私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!

440 :デフォルトの名無しさん:2008/10/05(日) 23:30:16
昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。
以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。

441 :デフォルトの名無しさん:2008/10/05(日) 23:32:35
>>426は自己解決しました。(というかバグが別の場所にあることが分かった)
で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?

442 :427:2008/10/05(日) 23:38:12
>>427
お願いします。

443 :デフォルトの名無しさん:2008/10/05(日) 23:54:28
>>427,>>442
Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている

つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ

まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ

444 :デフォルトの名無しさん:2008/10/06(月) 01:10:32
>>440
プロの人でさえ1年で!?

なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・

はぁー、、楽したい。。

445 :デフォルトの名無しさん:2008/10/06(月) 01:44:55
>>441
ttp://support.microsoft.com/kb/170787/ja

446 :441:2008/10/06(月) 02:03:42
>>445
こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。

447 :デフォルトの名無しさん:2008/10/06(月) 02:41:53
厨ばっか湧いて来やがるのはなぜだ

448 :デフォルトの名無しさん:2008/10/06(月) 05:32:26
なんかゴネてる人さあ、、、
まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら?
ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で
入力してるよりよっぽど楽になると思う。
そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの?
あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、
なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?

449 :デフォルトの名無しさん:2008/10/06(月) 09:12:10
>>444
月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ

450 :デフォルトの名無しさん:2008/10/06(月) 19:17:30
皆様お疲れ様です
>>448
それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです

もうフラフラです
皆様も季節柄お体気をつけて!

451 :デフォルトの名無しさん:2008/10/06(月) 19:30:13
えーと、このスレはVBAでプログラミングする人の為のスレだから、
Excelの使い方はよそで聞いて&愚痴ってくれ。

452 :デフォルトの名無しさん:2008/10/06(月) 20:24:01
記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……

453 :434:2008/10/06(月) 20:52:44
>408,〜,452
作ってみました。長いので2件に分けます。
' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに
処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、
丸々1行消しても動くと思うけど、こちらでは試してません。
例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、
マクロを記録しているブックに設定できるようにするとメンテがラクですね。
詳しい方には添削してもらえるとありがたいです。
Option Explicit
Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG
Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook
Dim SEARCH_PATH As String, FILE_NAME As String

Sub prog_408()
Set BK_M = ActiveWorkbook ' DEBUG
' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。
Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls"
Set BK_I = Workbooks("PRODUCT.xls")

TATE = 3 ' DEBUG
' 変更対象となる10〜40個のブックが記録されているフォルダです。
' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。
SEARCH_PATH = "D:\TEST_FOLDER\"
FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
  Call PROC_1
Loop
BK_I.Close
Set BK_I = Nothing
Set BK_M = Nothing ' DEBUG
End Sub

454 :デフォルトの名無しさん:2008/10/06(月) 20:53:51
続きです。
Private Sub PROC_1()
Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String
Dim c As Excel.Range

WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)
With BK_M.Worksheets(1)        ' DEBUG
  .Cells(TATE, 1).Value = WK_PATH  ' DEBUG A列に処理対象ブックのフルパスを書き込む
  BANGO_12 = BK_O.Worksheets(1).Range("A4").Value
  .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む
End With ' DEBUG
' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
If c Is Nothing Then
  BANGO_9 = ""
Else
  BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました
End If
BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です
BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む
BK_O.Close
Set BK_O = Nothing

TATE = TATE + 1 ' DEBUG
FILE_NAME = Dir()
End Sub

455 :デフォルトの名無しさん:2008/10/06(月) 21:37:47
y様に頼めば全て解決

はい次の方

456 :448:2008/10/06(月) 21:40:19
今までさんざんシートは1枚だと言ってたのは嘘か。
もうあきれて物も言えん、、、

457 :デフォルトの名無しさん:2008/10/07(火) 10:54:20
マンマー(´・ω・`)

458 :デフォルトの名無しさん:2008/10/07(火) 22:39:19
408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?


459 :デフォルトの名無しさん:2008/10/07(火) 22:54:35
初心者でおじゃまします。

:= ←これはどういう時に使うものですか?

本見てもよくわかりませんでした('A`)

460 :デフォルトの名無しさん:2008/10/07(火) 23:59:42
>459
詳しい人がいないようなので、未熟ながら小生がヒントを。
上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。
Workbooks.Open Filename:=WK_PATH
 →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は
  記載してないので規定値ということ)
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
 →Findメソッドで値検索を指定

VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。
省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は
改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。

こういう説明でわかりますか?

461 :デフォルトの名無しさん:2008/10/08(水) 00:02:45
一般に名前付き引数と呼ばれている。

462 :460:2008/10/08(水) 00:12:19
一部訂正
→Openメソッドでフォルダのパスを指定 じゃなくて、
→Openメソッドでファイルのフルパスを指定 だった。

463 :デフォルトの名無しさん:2008/10/08(水) 21:17:17
>>453-454さん
お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした



あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので

464 :sage:2008/10/08(水) 21:22:35
今度マクロを使って集計表を作ることになったのですが
その中でVBAという物を使うということで質問をしに来ました。

内容は集計ボタンを押すと
同フォルダ内に配置されてるエクセルのファイル名を読み取って
事前に用意されている集計表の中に概要をコピーするというものです。
集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき
数ヶ月に一度集計ボタンを実行します。

VBA、というかプログラムは全くのド素人ですが、
どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。
皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。

465 :デフォルトの名無しさん:2008/10/08(水) 21:36:56
1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました
間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり
挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ

とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、
手順のマクロを実行すると……………デバッグ

解放がいけなかったのでしょうか
記録マクロがいけなかったのでしょうか
黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)

466 :デフォルトの名無しさん:2008/10/08(水) 21:41:57
>>464
 >>1★5

ここは右も左も解らない奴が来るところじゃない
どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを
具体的に質問できるレベルになってから出直すか
急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ

車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る
その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように
金使って解決しろ

467 :デフォルトの名無しさん:2008/10/08(水) 21:48:54
指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、
453、454の中に書かれていますよ。
あと、434で紹介されたurlも参考になると思います。
文法云々ということであれば、エクセルVBAの入門書を入手するか、
ウェブの初心者向けサイトを調べてみてください。
それから、このスレのbPをよく読んでください。


468 :デフォルトの名無しさん:2008/10/08(水) 21:54:43
例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか

その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね?
いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか
自分のだけ解放しても他のマクロに影響があるのでしょうか


それだけではないのです
今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです!
こんな目に遭う人がいますでしょうか

仕事もテンパリは続き少々のアルコールでは何にもなりません
皆様もこの寒暖の激しさにはお気をつけ下さい

469 :453,454:2008/10/08(水) 22:11:56
>465
まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。
上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、
以下の説明ではマクロブックと呼びます)
あなたが仕事で扱うブックには絶対に書かないでください。
エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。
マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。
そのうえでprog_408を実行してみてください。
なお、私はWindowsXp、Excel2003で試しています。

ここまで書いたところで、468を見たので追加
465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの
マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか?
ひとつのモジュールには複数のマクロが記録されるんですよ。
壊れてしまったものは、現場で対応してもらうしかないと思います。

470 :デフォルトの名無しさん:2008/10/08(水) 22:56:33
なんなの、最近の流れ

471 :デフォルトの名無しさん:2008/10/08(水) 23:34:46
スレbP−★5を読まない初心者ばっかり。


472 :デフォルトの名無しさん:2008/10/09(木) 00:01:02
469さん、ご丁寧にありがとうございました
モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました
そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような……

なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います
これがいけなかったのかもしれません

あぁ楽をするのも大変ですね……
お先にお休みさせて頂きます。ありがとうございました。。

473 :デフォルトの名無しさん:2008/10/09(木) 07:42:16
過去スレですね?
現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!

474 :デフォルトの名無しさん:2008/10/09(木) 08:47:46
>>473
>>1の★5のことだ・・・
マジでテンプラ読めないやつ増えてるのか?

475 :デフォルトの名無しさん:2008/10/09(木) 09:51:50
そりゃ犬もションベンかけるわ

476 :デフォルトの名無しさん:2008/10/09(木) 10:17:49
>>465
どのブックにもVBAモジュールがある…だと?
あんた、「1ブックにはそれぞれ1シートしかないから、全シートを
一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。
それでどういうことになるのかわかってるのか?

あんたみたいなのは下手なことに手を出すな。
気づかない内に絶対まわりに迷惑かけてるから。
後始末する側の身にもなれ。

477 :デフォルトの名無しさん:2008/10/09(木) 11:00:15
2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・
他にVBAとか入ってるなら下手したら変数名とかかぶるし

478 :デフォルトの名無しさん:2008/10/09(木) 11:17:51
VBAを勉強する前に、「仕事のやり方」から勉強するべき

479 :デフォルトの名無しさん:2008/10/09(木) 18:06:20
Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが
この値をVBAで取得する方法があれば教えて下さい。orz


480 :デフォルトの名無しさん:2008/10/10(金) 21:21:37
2chねらならVBEオブジェクトくらい使ったことあるよな

481 :デフォルトの名無しさん:2008/10/11(土) 03:49:58
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。
【モジュール】
Private Foo As Integer
public sub Bar(Baz As Integer)
Foo = Baz
End Sub

【フォーム】
Private Sub TextBox1_Change()
On Error Goto Err
If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then
Call Bar(TextBox1.Text)
Else
TextBox1.Text = ""
End If
Err:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub


482 :デフォルトの名無しさん:2008/10/11(土) 07:15:22
いったんエラー処理はずしてどの行でエラーか書いてくれよ
まあfooかbazに入れてる値がまずいんだろう

483 :デフォルトの名無しさん:2008/10/11(土) 07:46:33
472です。その節はお世話になりました
犬に聖水をかけられた鞄は無事洗濯いたしました

ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが
なんと手順を間違えていたらしい事が昨日判明しました
そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後
例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです

恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう?
しかもそこで黄色になる訳ではないのですね??
もっと丁寧なデバッグ説明表示ならいいのに……

484 :デフォルトの名無しさん:2008/10/11(土) 07:59:35
なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません
ほんとに単純なシートなので高度なコード?ではないようです
デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました
けれど実行できればそれはそれでたいへん楽です!

なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…

485 :469:2008/10/11(土) 10:09:56
>483,484

「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。
まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか?
[42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック]

FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
  Call PROC_1
Loop

WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)

BK_O.Close
FILE_NAME = Dir()
でファイル一覧からひとつずつ開いて転記してクローズしている。
ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。
その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。


486 :481:2008/10/11(土) 12:15:07
フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。
【モジュール】
Private Foo As Integer
public sub Bar(Baz As Integer)
Foo = Baz
End Sub

【フォーム】
Private Sub TextBox1_Change()
On Error Goto Err
If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then
Call Bar(TextBox1.Text)
Else
TextBox1.Text = ""
End If
Err:
If Err.Number <> 0 Then
● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。
End If
End Sub


487 :デフォルトの名無しさん:2008/10/11(土) 12:45:27
ByRef渡しでもVBAの方でうまくやってくれたっけ?

488 :デフォルトの名無しさん:2008/10/11(土) 14:52:03
>>486
だからOn Error外せって

489 :デフォルトの名無しさん:2008/10/11(土) 16:23:17
>>485
>>483-484は、まだおまいの作ったコードは実行してないと思う
ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、
来年ぐらいじゃないかな

490 :479:2008/10/11(土) 17:48:11
キーワードを変えてググってみても見つけられなかった。
VBAからソートプロパティを取得する方法は無いのでしょうか?


491 :デフォルトの名無しさん:2008/10/11(土) 18:52:51
>>486

テキストボックスの値を関数に渡す前にVal()で数値に
変換したら。

492 :デフォルトの名無しさん:2008/10/11(土) 19:03:24
>>490
> キーワードを変えてググってみても見つけられなかった。
> VBAからソートプロパティを取得する方法は無いのでしょうか?
>

ソートの設定のこと?
これならマクロの記録でできるけど。
Range.Sort Key1:= ・・・・ Order1:= ・・・・

493 :デフォルトの名無しさん:2008/10/11(土) 19:10:50
>492
これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。
なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。


494 :デフォルトの名無しさん:2008/10/11(土) 20:58:41
>>479
単純にセルの値取得すればいいだけじゃないの??

495 :デフォルトの名無しさん:2008/10/11(土) 23:01:15
OS: WindowsXP
Excel: 2007

チャートの目盛線のスタイルを「破線」にしたいと思っていますが、
以下のようなコードを実行しても、「長破線」になってしまいます。

ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash

LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を
すべて試しましたが、やはり破線にはなりませんでした。
今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。
VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?

496 :デフォルトの名無しさん:2008/10/12(日) 00:38:29
エクセル2002 ウインドウズxp で質問!

@列を選択
AダイアログBoxに文字を入れ検索
B検索にヒットしたセルの左のセルに*を入力

具体例
@’D列・F列を選択
A’ダイアログBOXに検索したい文字 イロハ を入力
B’ イロハニホ が入力されてるセルD1の左C1と
  アイロノカニ が入力されてるセルF3の左E3に*を入力

この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。
詳しい方、コードを教えて下さい m( )m

この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。

497 :デフォルトの名無しさん:2008/10/12(日) 05:46:19
置換でいいじゃんd

498 :デフォルトの名無しさん:2008/10/12(日) 07:07:43
>>496
先に総合相談所にも謝って来いよ

499 :479:2008/10/12(日) 13:44:23
>>493
おっしゃる通り、ソートの設定状態を参照したいのです。

Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに
ソート状態を保持している筈なのです。
これを取得する方法が分かりません。


500 :デフォルトの名無しさん:2008/10/12(日) 16:54:02
>499
で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?

501 :デフォルトの名無しさん:2008/10/12(日) 17:29:28
>>500
シートAにデータがあり、
シートBがアクティブ時にはシートAの選択データからシートBを編集します
シートCがアクティブ時にはシートAの選択データからシートCを編集します
シートBやシートCを編集する時のシートAのソート条件が異なるので
編集できるかどうかを判断するためにソート状態を知りたいのです。

実際には、プログラム用ブックと上記のデータ用ブックに分かれていて
プログラム用ブック側でデータブックのイベントを拾って汎用的に処理
しています。


502 :500:2008/10/12(日) 19:23:34
>501
シートAは手動でソートするんですか? シートAのソートをマクロで実行して、
その際のパラメータをデータブックに記録しておけばどうですか?
シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように
したらいいのでは?

503 :デフォルトの名無しさん:2008/10/12(日) 22:26:40
シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて
ソートされる事も想定が必要です。

プログラムブックからデータブックを開いて、データブックに定義されている
内容によりデータブックのアクティブシートを編集しています。
データブック側にはVBAコード等の記述は不要であり、プログラムブック側に
VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を
行っています。
データブックは任意のxlsファイルが指定できます。


504 :デフォルトの名無しさん:2008/10/12(日) 23:42:02
誰か早く無理だって言ってやれよ

505 :デフォルトの名無しさん:2008/10/13(月) 00:01:29
無理です

506 :503:2008/10/13(月) 00:02:44
自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示
(Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第
です。
Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。
諦めかな...

507 :デフォルトの名無しさん:2008/10/13(月) 00:27:16
無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。

508 :デフォルトの名無しさん:2008/10/13(月) 00:35:54
二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?

509 :デフォルトの名無しさん:2008/10/13(月) 00:46:52
無理です

510 :デフォルトの名無しさん:2008/10/13(月) 01:40:17
ExcelVBAの関数のコールグラフを作成してくれるツールってある?
ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。


511 :デフォルトの名無しさん:2008/10/13(月) 14:36:23
フォルダにある複数の報告書のファイル名を変更したいのですが
方法を知っている方おられませんか?

報告書(Aさん)→済_報告書(Aさん)
報告書(Bさん)→済_報告書(Bさん)
報告書(Cさん)→済_報告書(Cさん)

上記のように
()内の名前が変わってもファイル名を

報告書()→済_報告書()

と変更できる方法を探しています。

何か良い方法を知っている方がいれば教えて頂けないでしょうか?
お願いします。


512 :デフォルトの名無しさん:2008/10/13(月) 15:12:43
ファイル名を fileName As String とすると、
まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、
fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")"
って感じ?

513 :デフォルトの名無しさん:2008/10/13(月) 16:40:36
>>511
スレ違い
ファイル名変更ぐらいならRENコマンドでできる。

514 :512:2008/10/13(月) 17:50:21
この条件だと、wsh使わないと一寸厳しいとは思う。
というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
違うの? >>511

515 :デフォルトの名無しさん:2008/10/13(月) 18:51:55
>>1

516 :デフォルトの名無しさん:2008/10/13(月) 18:58:06
>>511
Name ステートメント

517 :デフォルトの名無しさん:2008/10/13(月) 19:15:55
>>514さん
返信遅くなってすみません
レス有難うございます。

>>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。
はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。
最初は>>516さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が
ネックになって上手くいきませんでした。

>>513>>515さん
スレ違いでしたか、すみませんでした。

518 :デフォルトの名無しさん:2008/10/13(月) 20:08:55
>>506
xlsファイルフォーマットが公開されているので(英語)、
解析してソート部分の設定を読み出すコード書いたら。

519 :デフォルトの名無しさん:2008/10/13(月) 21:24:53
何がわからないのかわからなかった

520 :デフォルトの名無しさん:2008/10/13(月) 21:42:57
なんでわかってもらえないのかがわからない

521 :デフォルトの名無しさん:2008/10/13(月) 22:54:48
なんでわかってもらえると思えるのかがわからない

522 :デフォルトの名無しさん:2008/10/14(火) 10:15:24
>>506
ヘルプには「シートごとに保存される」
とは書いてあるがどうやって取り出すか書いてないな・・・

ところでそもそも「ソートの設定」で見ようとするのは危なくないか?
コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う
ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う

523 :500,502:2008/10/14(火) 13:13:28
>506
522に1票
>シートBやシートCを編集する時のシートAのソート条件が異なるので
>編集できるかどうかを判断するためにソート状態を知りたいのです。
とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか?
ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?

524 :506:2008/10/14(火) 13:22:48
基本的には保存しない前提で考えていたので、コピペは考えていませんでした。
出直します。orz


525 :デフォルトの名無しさん:2008/10/14(火) 16:26:52
なんで強制的にソートしちゃいけないのかな
Aが一定の条件でソートされてないとBやCの編集ができないのに、
ソートは人まかせってのが不思議
永遠にソートしてくれなかったらどうするんだろう

ソートされてるかどうかを何かのフラグとして扱うつもりなら、
それこそそんなの信用できないんじゃないの
気まぐれでソートして見てみただけかも知れないし

526 :デフォルトの名無しさん:2008/10/14(火) 16:57:54
私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。
文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの
があるようです。具体的な例をあげると、
"ad-02-mb.html"
"ad-02.html"
の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと
なります。マッチング処理ができなくて困っています。解決方法を
お教えください。


527 :506:2008/10/14(火) 17:42:10
>>525
説明不足でした
BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が
多めに要するという事です。
強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に
戻す必要があります。
別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ
ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。



528 :デフォルトの名無しさん:2008/10/14(火) 18:03:14
>>526
バージョン差あるかもだけど、option compare は?

>>527
ソートされなくても永遠に作業が滞るわけではないのね。ならよかった
いつの日か希望どおりにソートしてもらえるといいね

529 :デフォルトの名無しさん:2008/10/14(火) 19:03:09
>>526
その「ソート」って何の事よ

530 :デフォルトの名無しさん:2008/10/14(火) 19:35:11
>>527
だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。
そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?

531 :デフォルトの名無しさん:2008/10/14(火) 19:36:19
そぅっとしてやってくれ。

532 :デフォルトの名無しさん:2008/10/14(火) 21:16:22
早野乙

533 :デフォルトの名無しさん:2008/10/14(火) 21:58:59
>526
自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。
ヘルプから引用
一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、
ハイフンを含む文字列が後に配置されます。
引用終わり
つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。
先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も
比較に利用されるので、bd-02-mb.htmlが先になる。
文字コード(10進表記)では、"-":45 ".":46 "m":109 です。

534 :526:2008/10/15(水) 22:38:35
>533
おーっ、感動の回答!ありがとうございます。
自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。
で、どーすりゃいいのか考えないと。。。
とにかく、ありがとうございました。

535 :533:2008/10/15(水) 22:54:32
>534
レスがあるとうれしいですね。
引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。

解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか?
処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら
一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。

536 :デフォルトの名無しさん:2008/10/15(水) 23:00:23
binary

537 :デフォルトの名無しさん:2008/10/15(水) 23:03:15
ハイフンは、行末で英単語を分割する際に使われるからだな。

538 :デフォルトの名無しさん:2008/10/15(水) 23:04:22
どのような時に、なぜマッチング処理ができないのかを明記せよ

539 :デフォルトの名無しさん:2008/10/15(水) 23:08:50
>536
バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか?
エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は
あるけど、バイナリのことは書いてありません。(Excel2003)

540 :デフォルトの名無しさん:2008/10/15(水) 23:27:30
マッチング処理ってどういう処理をしてるの?

541 :デフォルトの名無しさん:2008/10/15(水) 23:35:57
比較にstrcompを使った独自ソート関数書けよ

542 :デフォルトの名無しさん:2008/10/15(水) 23:48:53
>>539
Option Compare ステートメント

543 :542:2008/10/15(水) 23:52:53
こっちの勘違いにつき、忘れてcくれ(^^;

544 :539:2008/10/15(水) 23:57:27
>542
エクセルVBAのヘルプを見てみました。
引用はじめ
Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法
である Binary モードが使われます。
引用終わり
ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、
ハイフン"-"を無視しないようにするのは無理なのでは?

545 :539:2008/10/16(木) 00:03:27
>543
リロードしてませんでした。一晩寝ると忘れますので、ご安心を。

546 :デフォルトの名無しさん:2008/10/16(木) 01:57:46
で今夜は徹夜ですっと

547 :デフォルトの名無しさん:2008/10/16(木) 03:44:56
購入日   保証年数
2006/10/05  2
2004/08/12  5
2005/04/22  3

という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、
・・・するという場合、

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then 'もし列がA(1)なら
★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then
'今日との日付差がマイナスなら

Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする
Else
Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする
End If
End If
End Sub

保証切れの場合、色をつけたいのですが、
★をどのようにすればいいでしょうか?

548 :デフォルトの名無しさん:2008/10/16(木) 05:05:36
ある日付から、 n年後 n日後などを求めたい時は dateadd
詳しくはヘルプ読んで
あとそのコードだと保証期間内の時に青になるよ
datediffのヘルプ読んで

549 :526:2008/10/16(木) 22:42:05
なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、
Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。
Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、
ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、
アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース
してマッチングする処理にしました。
ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、
=のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの
並び順が異なるために、おかしくなっていました。
みなさんのおかげで、なんとか完成しました。ありがとうございました。



550 :デフォルトの名無しさん:2008/10/16(木) 22:51:10
説明する気ないのか

551 :526:2008/10/16(木) 22:52:41
間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは
Do While マスターキー >= トランザクションキーでした。


552 :デフォルトの名無しさん:2008/10/16(木) 23:07:51
もう来なくていいよ

553 :デフォルトの名無しさん:2008/10/16(木) 23:09:30
そもそもマッチングを勘違いしてると思われる。

554 :デフォルトの名無しさん:2008/10/17(金) 01:13:46
マイッチングまちこ


てか、正規表現でも使うの?マッチングって事は。

555 :デフォルトの名無しさん:2008/10/17(金) 02:37:01
ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。
COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。

556 :デフォルトの名無しさん:2008/10/17(金) 10:56:37
ものすごくアフォな質問で申し訳ないんですが教えてください
For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、

For I = 1 To 1000
「基本作業」
a = Right(I, 2)
If a = 1 Then
「選択作業1」
ElseIf p = 2 Then
「選択作業2」

以下、0まで選択作業計10個

Else
End If
Next I

こんな感じでいいんでしょうか?
今実行環境が無いのでどなたかアドバイスお願いしますorz

557 :デフォルトの名無しさん:2008/10/17(金) 11:39:21
>>556
あくまで自分ならだが
For I = 1 To 1000
 '「基本作業」
 a = I Mod 10
 Select Case a
  Case 1
  '「選択作業1」
  Case 2, 3
  '「選択作業2」
 End Select
Next I

といった感じにする

558 :デフォルトの名無しさん:2008/10/17(金) 11:44:28
>>557
ありがとう
家に帰ったらいろいろ試してみます

559 :デフォルトの名無しさん:2008/10/17(金) 17:54:59
セルの値が1のときセルの色づけ赤,2のときセルの色づけ青
とするマクロをVBAで組んだのですが,一回実行した後,
セルの値を1から2を変更しても,実行ボタンをあらためて
押さないと色が青に変わりません。
2を入力すれば直ちにセルの色づけが青に変わるようにする
ためにはどのようなコードを入れればよいのでしょうか。
よろしくお願いします。

560 :デフォルトの名無しさん:2008/10/17(金) 18:27:43
>>559
ボタン押したら色が変わるようにしたんだろ?
だったら当然だな

入力してすぐに変えたければ
1.ボタンはやめてワークシートのChangeイベントで動かす
2.VBAをやめて条件付書式にする
どちらかだな

ところでテンプレ>>1の★5読んだか?

561 :デフォルトの名無しさん:2008/10/17(金) 19:06:41
>>560
ありがとうございます。
まったくの初心者です。場所を間違えたようです。
失礼しました。

562 :547:2008/10/17(金) 20:36:21
> ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then

なんですが、
dateaddをして、比較したいのですが、

If Dateadd("y", target.offset(0,1).value, target.value) < Date Then
と、やってみてもダメでした、

Private Sub Worksheet_Change
If Target.Column = 1 Then

に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、
上記であっているのでしょうか?

563 :デフォルトの名無しさん:2008/10/17(金) 21:38:26
>>562
ダメだった時はどうダメだったのかを書こうぜ

> 特定セルと特定セルの右隣を関数に入れて比較
そこは合ってる
で、右隣のセルに入ってるのは日数じゃなく年数でしょ?
後はもっぺんヘルプ読んで

564 :デフォルトの名無しさん:2008/10/18(土) 01:46:12
>>559
条件付書式だかそんな感じの奴でマクロなしでできる

565 :547:2008/10/18(土) 04:21:40
>>563
もう一度考えてみました。

やりたいことと、セルの値
購入日   保証年数
2006/10/05  2 ←保証切れ(青色になって欲しい)
2004/08/12  5 ←保証が切れていない(色は黒色に)

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then
  ' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較

Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If

End If
End Sub

日付を入れると「全部青になってしまいます」
ちなみに
If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then
と年数バージョンでもやってみましたが、同じ結果orzでした。

全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。
日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?

566 :デフォルトの名無しさん:2008/10/18(土) 05:47:32
>>565
おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ
今日の日付に足したら、何足したって未来になるだろw

>>562のでほぼ合ってるんだよ
オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、
おまいのにはないのか?

567 :565:2008/10/18(土) 06:29:37
ありがとうございます。
yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。
たしかにadddateで今ヘルプを見ると、

設定値 内容
yyyy yyyy
y 年間通算日

yyyy・・・内容書いていませんwww (by Office 2003)
でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。


しかし、大問題が発生しました。
xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、
worksheet_changeじゃだめなんです。

workbookが開いたとき、な方法があればいいのですが、
worksheet_activate、selectionchangeでも反応しませんでした。

Private Sub Worksheet_Change(ByVal Target As Range)
ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?

568 :565:2008/10/18(土) 06:53:58
何度もすいません、
たぶん、worksheet_activateイベントで良いと思うのですが、

activateになった時に計算させるということは、
自動的に

Private Sub Worksheet_Activate(ByVal Target As Range)

If Target.Column = 1 Then
If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then
Target.EntireRow.Font.ColorIndex = 5 '青
Else
Target.EntireRow.Font.ColorIndex = 0 '黒
End If
End If
End Sub

Private Sub部分を変えただけだと
違うシートを選んで、選択し直すと

「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」
と出ますが、すでに上の言葉が理解できません。
if文以下も変更しなければならないのでしょうか?

byヘルプ
プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。
イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。
たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。

ダメです、わけわかりませんorz

569 :デフォルトの名無しさん:2008/10/18(土) 08:23:40
>>567-568
> yyyy yyyy
ちょwマジでw
おちおち「ヘルプ読め」とも言えんじゃないか
まあそっちは解決したようで良かった

イベント変更の方だが、worksheet_activateは引数を取らないから、
そうなるのは当然だな
引数を消して、targetを自前で指定してやればOK

つか、workbook_openイベントもあるんだが
つか、今さらだけど、
色変えたいだけなら条件付き書式でもできるがw

570 :デフォルトの名無しさん:2008/10/19(日) 02:32:28
VBAにEffective C++やEffective Javaみたいなガイドラインってある?

571 :568:2008/10/19(日) 02:58:41
>>569
>色変えたいだけなら条件付き書式でもできるがw

こ、こんなのあったんですか・・。
春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。

わざわざVBAを使う必要無かったんだ・・・。
___________
   ||     
   ||     ⊂⊃
   ||    ∧ ∧
   ||    (  ⌒ ヽ でも勉強にナターヨ・・・
 ∧||∧   ∪  ノ
(  ⌒ ヽ 彡  V
 ∪  ノ  フワーリ
  ∪∪

572 :デフォルトの名無しさん:2008/10/19(日) 03:29:41
ほんとに色変えるだけなのかよwまいったw

>>559もそうだし、こういう奴、実は多いのか?
何という時間の無駄

573 :デフォルトの名無しさん:2008/10/19(日) 07:09:25
悪いけど笑わせてもらう


  ァ   ∧_∧ ァ,、
 ,、'` 。゚( ゚^∀^゚)゚。,、'`
  '`   ( ⊃ ⊂)  '`




574 :デフォルトの名無しさん:2008/10/19(日) 07:12:51
関数でできることをマクロでやろうとしたり、案外よくあるよな

575 :デフォルトの名無しさん:2008/10/19(日) 12:16:55
だんだんとワークシート関数がウザくなってくるんだよなw


576 :デフォルトの名無しさん:2008/10/19(日) 17:15:03
暇だから何か問題だしやが……出して下さい

577 :デフォルトの名無しさん:2008/10/19(日) 20:25:44
>576
Excel総合相談所74で質問が出てますよ。(レス番号325です)

578 :デフォルトの名無しさん:2008/10/19(日) 20:49:32
プログラミング初心者かつエクセルにも詳しくない奴が、
この手ので延々悩むんよね
心理的ハードルを超えさせる書式の魔力おそるべし

579 :デフォルトの名無しさん:2008/10/19(日) 21:31:47
>>576
4色問題お願いします。

580 :デフォルトの名無しさん:2008/10/19(日) 22:29:21
>>577
ありがと
解決済みだった

>>579
全ての図形が4色で塗り分けられるとかなんとかだよね
図形の形とか定義あるのかな?

セルに色塗るなら二色で出来ちゃうし

581 :デフォルトの名無しさん:2008/10/19(日) 22:33:43
二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに
格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?

582 :デフォルトの名無しさん:2008/10/19(日) 22:43:16
>>581
あります

入力規則のリストなら、マクロの記録録ればわかります
コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます
但しフォームツールのコンボボックスなら多分セル書き出し必須

583 :581:2008/10/19(日) 22:50:06
>>582
すみませんコントロールツールボックスの方です
シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…


584 :デフォルトの名無しさん:2008/10/19(日) 22:51:02
>>580
4色問題ってこんな感じのです。
ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C

585 :デフォルトの名無しさん:2008/10/19(日) 22:59:02
>>584
ありがとう

1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす

2.領域ごとに、隣り合わせ同色にならないように色IDを付ける

3.色IDが1から4で収まっているか判定


っていうアプローチでよいかなあ
アルゴリズムの問題っぽいがw

586 :デフォルトの名無しさん:2008/10/19(日) 23:36:57
セルに依存しない計算は速いのですが結果をセルに
出力するのに時間がかかります。たとえば

Dim X(10000, 10) As Double
Dim I As Integer
Dim J As Integer

'計算
For I = 1 To 10000
For J = 1 To 10
X(I, J) = Sqr(I) * Sqr(J)
Next J
Next I

' 出力
For I = 1 To 10000
For J = 1 To 10
Cells(I, J) = X(I, J)
Next J
Next I

で出力の所要時間を計算時間と同程度にすることができるような
出力の書き方があれば教えてください。


587 :デフォルトの名無しさん:2008/10/19(日) 23:51:32
For I = 1 To 10000
For J = 1 To 10
Cells(I, J) = Sqr(I) * Sqr(J)
Next J
Next I

588 :デフォルトの名無しさん:2008/10/19(日) 23:51:40
ちらつき抑制でよいかな?

forの前に

Application.ScreenUpdating = False

を入れると、シートの描画しないから早くなる
少しずつ描画見たいなら、例えばNextの間に
Application.ScreenUpdating = Tlue
Application.ScreenUpdating = False
を追加すると、Iが一つ進むごとに描画される

例えばIが100ごとに実行したいなら

J Mod 100 使ったりできる

589 :デフォルトの名無しさん:2008/10/19(日) 23:54:01
つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん

590 :デフォルトの名無しさん:2008/10/20(月) 00:20:55
>588
21秒から13秒に8秒も短縮できました。ありがとうございます。

>589
具体的に「そのまま書き出す」ってどうすればいいんですか?
よろしくお願いします。


591 :デフォルトの名無しさん:2008/10/20(月) 00:29:07
>>590
>>589じゃないけど、
range(cells(1,1),(cells(10000,10)) = X

592 :591:2008/10/20(月) 00:30:17
タイプミス
range(cells(1,1),cells(10000,10)) = X

593 :デフォルトの名無しさん:2008/10/20(月) 00:36:38
base 1 にするのはお勧めできない。
変数に+1しる。


594 :デフォルトの名無しさん:2008/10/20(月) 00:41:35
592>>

やってみました。1秒かからないんですね!ありがとうございました。


595 :デフォルトの名無しさん:2008/10/20(月) 00:42:22
base 1 にするのはお勧めできないが
変数に+1するのもお勧めできない
X(1 To 10000,1 To 10)にしる

596 :デフォルトの名無しさん:2008/10/20(月) 00:49:07
すみません
Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10)
とするとコンパイルエラーがでるんですが・・・。

597 :デフォルトの名無しさん:2008/10/20(月) 00:52:29
>>596
違う違うw
1 to 10000 とかを書くのは dim のとこ

598 :デフォルトの名無しさん:2008/10/20(月) 00:56:26

Dim X(1 To 10000, 1 To 10) As Double
でしたね。失礼しました。
みなさんどうもありがとうございました。

599 :デフォルトの名無しさん:2008/10/20(月) 02:02:50
EXCEL XP, 2000, 2003, 2007において、
VBAはクアッドコアに対応しているの?

コア4つのVBAはやはり処理が早いんだろうか・・。

600 :デフォルトの名無しさん:2008/10/20(月) 04:35:01
>>582
余談だけどフォームの方もできる

601 :デフォルトの名無しさん:2008/10/20(月) 06:43:22
すみません
文字列の入ったセルをselectした際に、単にselectにするだけではなく、
編集中の状態にまでもっていきたいのですが、
そのような方法を御存じないでしょうか。
select後、sendkeys"{F2}"で実現できるのですが、
Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。

602 :デフォルトの名無しさん:2008/10/20(月) 08:24:46
数式バーで編集じゃだめなの?

603 :デフォルトの名無しさん:2008/10/20(月) 13:42:57
Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?

604 :デフォルトの名無しさん:2008/10/20(月) 13:52:14
>>603
Sheet2以降のセルA1に、「=Sheet1!A1」と入力。

605 :デフォルトの名無しさん:2008/10/20(月) 13:54:49
+1忘れた

606 :デフォルトの名無しさん:2008/10/20(月) 14:05:48
>>604
d

607 :デフォルトの名無しさん:2008/10/20(月) 16:56:04
どこがVBAやねん

608 :デフォルトの名無しさん:2008/10/20(月) 18:13:53
春から悩んでたかも知れないじゃないか

609 :デフォルトの名無しさん:2008/10/20(月) 20:11:15
>>599
まず、複数スレッドを作ることが実質的に無理だ。
Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。

610 :デフォルトの名無しさん:2008/10/20(月) 20:17:31
依存関係ありまくりの計算だからなあ。

611 :デフォルトの名無しさん:2008/10/21(火) 15:00:07
オートフィルターがオンになっているシートの選択行について、ソートと処理を
行った後、再度元の並びに戻す方法を模索中です。

1)選択行範囲の最後(列n)に式["=ROW()"]を設定
2)列nの式を値に変更(コピぺ)
*ソートと処理を行う
4)列nで昇順にソートした後、列nを削除

この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け
の領域が違うため貼付けエラーになります。

1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター
情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。
他にもっと良い方法をご存知でしたら御教授願います。

選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが
データ量が三万件とかだとコピーにも多少時間が掛かるので...

612 :デフォルトの名無しさん:2008/10/21(火) 17:29:28
>>611
仮に、"=row()" を入れた範囲を range("G5:G10") として、
G列を非表示にして、
range("G5:G10").value = range("G5:G10").value
ってのはダメ?

613 :611:2008/10/21(火) 18:27:03
>>612
助かりました、有難うございます。orz

だけど、非表示だと何故上手くいくのでしょう?

614 :デフォルトの名無しさん:2008/10/21(火) 18:33:32
どこがVBAの問題なのか春先まで悩みそうだ

615 :デフォルトの名無しさん:2008/10/21(火) 19:41:59
>>613
わからん。なんかやってみたらできた
仕様なのかバグなのかも知らんw

616 :デフォルトの名無しさん:2008/10/21(火) 21:01:59
非表示だと pastespecial もうまくいくな
どうやら仕様くさい

617 :VBAの初心者:2008/10/21(火) 21:24:20
初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが
無くよく分らなくてもし良かったら教えて下さい。

だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな
くて困ってます。

10 for m=1 to12
20 print m
30 next m
40 stop
なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。


618 :デフォルトの名無しさん:2008/10/21(火) 21:27:30
それはVBAじゃない。VBでもない太古のBASICのプログラム。

619 :VBAの初心者:2008/10/21(火) 21:30:01
らしいです。VBAを覚えたいなぁ〜って言ったら色々言われて私が全然分からなく
なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理
なんでしょうか;

620 :デフォルトの名無しさん:2008/10/21(火) 21:50:26
もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。

VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。
敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。

そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?

621 :デフォルトの名無しさん:2008/10/21(火) 22:39:24
釣られすぎ

622 :デフォルトの名無しさん:2008/10/21(火) 23:24:21
縦読みじゃないのね。

623 :デフォルトの名無しさん:2008/10/22(水) 07:27:31
Interiorってクラス名としてはどうなんですか?

624 :デフォルトの名無しさん:2008/10/22(水) 10:00:18
激しく紛らわしいからやめた方が良いかと

625 :デフォルトの名無しさん:2008/10/23(木) 00:27:13
自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった

626 :デフォルトの名無しさん:2008/10/23(木) 19:16:21
そりゃクラスの内容に因るだろうな
個数や上限決めておらず、必要に応じて作る場合とか
1万や2万は当たり前に使ってることあるが
ちゃんと配慮してれば全然問題ない

627 :デフォルトの名無しさん:2008/10/24(金) 11:20:18
選択アドレスから重複を削除する方法はありますでしょうか?

例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス
範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。

Excelのステータスバー(右側)には重複を除いた合計値が表示されます。
これと同様の値(特定の1列のみ)をVBAで取得したいのです。


628 :デフォルトの名無しさん:2008/10/24(金) 12:06:03
>>627
unionしちゃばOK

629 :デフォルトの名無しさん:2008/10/24(金) 12:09:11
>>627
Sub test1()
 Dim rg1 As Range, rg2 As Range
 For Each rg1 In Selection.Areas
  If rg2 Is Nothing Then
   Set rg2 = rg1
  Else
   Set rg2 = Range(rg2, rg1)
  End If
 Next rg1
 Debug.Print WorksheetFunction.Sum(rg2)
End Sub

>>628
Unionは無理じゃない?

630 :629:2008/10/24(金) 12:20:32
今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・

631 :デフォルトの名無しさん:2008/10/24(金) 12:22:27
>>629
? range("$A$2:$A$5,$A$5:$A$10").cells.count
10
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).cells.count
9
? union(range("$A$2:$A$5"),range("$A$5:$A$10")).address
$A$2:$A$10

「特定の1列のみ」だそうだからOKかなと

632 :629:2008/10/24(金) 12:29:12
RangeをUnionに書き換えたらいけたような気がするw

633 :デフォルトの名無しさん:2008/10/24(金) 14:52:48
有難うございます。
Set rg2 = Union(rg2, rg1)
に変更したら上手くいきました。

もう1つ教えて下さい。
選択された範囲の行を対象に特定の列(例では8列目)を以下の様に集計して
いますが、選択範囲から集計範囲(特定列)への変換にもっと簡単なやり方が
ありますでしょうか?

Dim vals As Variant, i As Integer, c As Integer, addr As String
c = 8
vals = Split(Selection.Address, ",")
For i = 0 To UBound(vals)
With Range(vals(i))
vals(i) = Range(Cells(.Row, c), Cells(.Row + .Rows.Count - 1, c)).Address
End With
Next
addr = Join(vals, ",")
Debug.Print WorksheetFunction.Subtotal(9, Range(addr))


634 :633:2008/10/24(金) 16:24:56
列の特定と同時に重複を削除しないと駄目のようです。
>>629さんの方法に組み込むと良い様に思います。

Set r1 = Cells(rg1.Row, 8)
Set r2 = Cells(rg1.Row + rg1.Rows.Count - 1, 8)
If rg2 Is Nothing Then
Set rg2 = Range(r1, r2)
Else
Set rg2 = Union(rg2, Range(r1, r2))
End If


635 :デフォルトの名無しさん:2008/10/24(金) 16:33:53
質問です。
エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。

636 :デフォルトの名無しさん:2008/10/24(金) 19:46:01
質問です
訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから
内容を読み出してテキストファイルに起こしたいのですが、
Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで
近しい形状の通常のアルファベットに置き換えられてしまうようです。

結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが
対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと
思って書き込みさせていただきました。
なにかお知恵などありましたらよろしくお願いいたします<(__)>

637 :デフォルトの名無しさん:2008/10/24(金) 20:14:02
>>635
何を何処へコピーするのか

638 :デフォルトの名無しさん:2008/10/24(金) 20:26:20
両面コピーって両面印刷の事?プリンタの話になるんじゃないの?

639 :デフォルトの名無しさん:2008/10/24(金) 20:33:08
>636
元となるExcelファイルは、Excelのどのバージョンで作られたものですか?
あるいは、どこの国用のExcelで作られたものでしょうか?
VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに)
ペーストすることはできたのでしょうか?

↓このサイトは見ましたか?
http://www.microsoft.com/japan/office/ork/three/intd02.mspx
Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス
Unicode サポートの活用
「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。

640 :デフォルトの名無しさん:2008/10/24(金) 21:48:44
あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、
500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。
オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。
原因としてはどんなことが考えられるでしょうか?

641 :デフォルトの名無しさん:2008/10/24(金) 21:53:05
サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。
その情報だけだと、メモリかCPU?としか言えない。

642 :デフォルトの名無しさん:2008/10/24(金) 21:55:54
>>635

sub 裏表印刷()

印刷実行

Msgbox ゛用紙裏面をセットしてください゛

印刷実行

end sub

643 :デフォルトの名無しさん:2008/10/24(金) 21:56:08
>>641
メモリっぽいですね。ちょっと調べてみます。
ありがとうございました。

644 :デフォルトの名無しさん:2008/10/24(金) 22:09:55
>>640
DoEvents
http://homepage2.nifty.com/kasayan/vba/doevents.htm

645 :デフォルトの名無しさん:2008/10/25(土) 00:45:40
636です

>>639
動作環境を書くのをすっかり失念してました
この手の質問には必須なのに…申し訳ありません

OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。
現在VBA開発に使用しているxlsファイルは
Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです

紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね
(VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…)
まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので
Unicodeをサポートしていればうまく行くとは限らない気もしますが

でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。

646 :デフォルトの名無しさん:2008/10/25(土) 07:04:27
オーバーフローの意味もしらないのかVBA厨房は

647 :デフォルトの名無しさん:2008/10/25(土) 11:29:01
アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね

648 :デフォルトの名無しさん:2008/10/25(土) 14:59:26
>>633
unionでいいんなら

Sub test()
Dim rg1 As Range, c As Integer
c = 8
Set rg1 = Intersect(Union(Selection, Selection).EntireRow, Columns(c))
Debug.Print WorksheetFunction.Subtotal(9, rg1)
End Sub

649 :デフォルトの名無しさん:2008/10/25(土) 15:46:42
どなたかお教えください

マクロでたとえばですが

ActiveCell.Replace What:="*", Replacement:="x"

のように セル文字列の * の部分だけをxに変換したいのですが
アスタリスクはすべて変換してしまいますよね。

A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって
ほしいのですが。実際は x 担ってしまいます

どのようにすればよいのでしょうか。


650 :デフォルトの名無しさん:2008/10/25(土) 16:07:52
>>649
ActiveCell.Replace What:="~*", Replacement:="x"

651 :デフォルトの名無しさん:2008/10/25(土) 16:09:39
>>650

すごいですね。どうもです

652 :デフォルトの名無しさん:2008/10/25(土) 17:06:03
春先から悩んでた人多いな

653 :デフォルトの名無しさん:2008/10/25(土) 18:11:57
>>645
参考になるかも
ttp://codezine.jp/article/detail/1718



654 :デフォルトの名無しさん:2008/10/25(土) 19:10:31
しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。

655 :デフォルトの名無しさん:2008/10/26(日) 03:08:58
教えてください
VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?

656 :デフォルトの名無しさん:2008/10/26(日) 03:24:14
>>655
明日の日付はDate関数に+1すれば解る
特定の日付が日曜日か否かはWeekday関数で解る
3週目か否かは日を算術演算すれば解る
あとはそれらを条件に条件分岐してA1に値を代入すれば良い

この説明で解らなければ>>1★5なので、さようなら

657 :デフォルトの名無しさん:2008/10/26(日) 03:44:51
>>656
ありがとうございます。
算出演算ってのがよく解らないですががんばってみます。

658 :デフォルトの名無しさん:2008/10/26(日) 06:05:51
だからエクセルでやれよ

659 :デフォルトの名無しさん:2008/10/26(日) 13:35:27
だよな。数式でできるレベル

660 :デフォルトの名無しさん:2008/10/26(日) 13:40:58
 質問です。
 Excel2003を使っています。
 コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが
どなたか教えていただけませんでしょうか。
 よろしくお願いします。


661 :デフォルトの名無しさん:2008/10/26(日) 14:10:39
ちょっとは自分で調べる努力した?

662 :デフォルトの名無しさん:2008/10/26(日) 15:32:19
>>660
コマンドボックスって何ぞや?

663 :660:2008/10/26(日) 15:45:47
 聞いておいて遅レスごめんなさい。
 コマンドボタンの間違いです。
 色々調べてみたのですが、変数の定義の仕方そのものがよく理解できていなくて

 わからないなりに考えたのが↓です

Sub test_Click()
Dim h As Long
h = Range("A1").Value
If h = 0 Then
h = 1
Else
h = h + 1
End If
End Sub

 もうちょっと頑張ってみます

664 :649:2008/10/26(日) 15:48:36
 お教え願いますか

 '=A1 という文字列を =A1 という数式に変換するマクロありますか。

同かよろしくお願いします。



665 :649:2008/10/26(日) 15:50:36
舌足らずでした

 あるセルに '=A1 という文字が書かれています。
マクロコマンド使って =A1 という数式に置換したいのですが。

どうかよろしくお願いします。




666 :デフォルトの名無しさん:2008/10/26(日) 16:32:40
>>663

cells(1,1).value = cells(1,1).value + 1

>>665

Cells(1, 1).Formula = Cells(1, 1).Value

667 :デフォルトの名無しさん:2008/10/26(日) 16:33:34
>>663
Range("A1").Value = Range("A1").Value + 1


668 :デフォルトの名無しさん:2008/10/26(日) 16:43:51
こんなばかみたいな質問にいちいち答えるなよ

669 :660:2008/10/26(日) 16:47:26
>>666
>>667

ありがとうございました。
一から勉強してきます。

670 :デフォルトの名無しさん:2008/10/26(日) 17:06:11
変数の定義ができないとか、
単純な代入式も書けないレベルの奴は入門書買え
いちいち他人の手を煩わすな

671 :デフォルトの名無しさん:2008/10/26(日) 22:22:34
初めて質問させていただきます。
初心者ではないですが、レベルは低いですσ^^;

セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、
これだとなにか悪影響がありますか?

今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、
書き方が分からない時がある、ってことくらいです。

単に字数が少なくて済むからという理由で[**]形式にしているんですが、
ちょっと気になってます。
というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・

672 :デフォルトの名無しさん:2008/10/26(日) 22:45:34
他の人が見たときに分かりにくいとか
少なくとも俺はわからん

673 :デフォルトの名無しさん:2008/10/26(日) 23:19:11
動作自体には問題ない
あとは使う場面やメンテナンス性などを考えて使えば良い
複数人で扱う物には使わない方がいいし、汎用モジュールも然り
個人専用の使い捨てマクロの類なら[A1]形式でも医員で内科医

連続しない複数セルもしくは範囲を扱う場合なんかは便利なので
俺も他人が弄る可能性のないものでは使うこともある
『 [A:A,C:C,E:F].ClearContents 』とか『 [A3,C3:F10,H3:H10] = 0 』とかね

因みにうちでは『r""』のキー打ちで『Range("")』が入力され、カーソルが""の間に移動するので
Range("A1")は、『 R " " A 1 』で済む為、[A1]でもRange("A1")でも入力字数は大差ない
俺の場合RangeよりCellsの方がよく使うが、Cellsも同じく入力省略出来るようにしてある

674 :デフォルトの名無しさん:2008/10/26(日) 23:27:30
簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、
本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、
初心者のうちからcellsで指定する方が良いと思うよ。
rangeと言えば、あくまでrangeオブジェクトである訳で・・・。

何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。
タッチ数も増えるしで、良い事ない。

675 :デフォルトの名無しさん:2008/10/26(日) 23:28:39
最後の3行が言いたかっただけちゃうかー

676 :デフォルトの名無しさん:2008/10/26(日) 23:36:52


677 :デフォルトの名無しさん:2008/10/27(月) 00:10:33
[A1]なんて書き方知らなかった……。もっと精進するわ。

678 :デフォルトの名無しさん:2008/10/27(月) 02:51:46
>>671
結局は evaluate の省略記法だから、excel に渡して評価させる分、
多少処理の無駄があるんじゃないかと思う(たぶん)

[A1].value = 0
range("A1").value = 0
それぞれ10万回ループさせると数秒だが差が出る
evaluate("A1").value = 0
は、[A1]記法とほぼ同じになる

誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は
避けた方がいいかもね

679 :デフォルトの名無しさん:2008/10/27(月) 09:49:00
[A1]だと後ろにピリオド打っても入力候補が出てこねぇ。
Cells(1,1)も出てこねー。
Range("A1")だと出てくる。
どれもいったんRange型変数に入れりゃ同じだが。

680 :デフォルトの名無しさん:2008/10/27(月) 10:57:11
http://pc11.2ch.net/test/read.cgi/gamedev/1217601153/
Syntax Error.しか知らないキチガイがあらわれました

681 :デフォルトの名無しさん:2008/10/27(月) 11:57:01
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220150877

大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。
このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか?

【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23]
http://gimpo.2ch.net/test/read.cgi/owabiplus/1224789237/

ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう
http://gimpo.2ch.net/test/read.cgi/kaden/1222787235/

【店員の質】ヨドバシカメラ総合17【落ちまくり】
http://gimpo.2ch.net/test/read.cgi/kaden/1215013408/

補足
どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、
キノトロープスリーイントという会社( http://www.k-3int.co.jp/ )が請けたようです。

また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は
億単位で発生していると言われています。

キノトロープってどうよ?PART4
http://namidame.2ch.net/test/read.cgi/venture/1224762171/

682 :633:2008/10/27(月) 14:06:59
>>648
おぉー、素晴らしい限りです!
アクティブシート以外に対してIntersectは無理なのでしょうか?

683 :682:2008/10/27(月) 14:21:18
失礼しました。orz
columns(c)を修飾したら出来ました。

684 :デフォルトの名無しさん:2008/10/27(月) 16:04:05
>>682
書いた後で気づいたんだが、それ union いらないっぽいw

? selection.address
$A$1:$A$5,$A$5:$A$10
? selection.entirerow.address
$1:$5,$5:$10
? intersect(selection.entirerow, columns(8)).address
$H$1:$H$10

intersect かけた時点で重複してる行はまとめられるから、
Set rg1 = Intersect(Selection.EntireRow, Columns(c))
だけでいいようだ

685 :682:2008/10/27(月) 16:34:34
>>684
究極のリファクタリング有難うございます。orz
こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...

686 :671:2008/10/27(月) 22:41:20
みなさんいろいろご意見ありがとうございました。
RangeやCells形式も使いこなせるように、もっと勉強していきます^^

687 :デフォルトの名無しさん:2008/10/28(火) 10:08:01
もう1つ教えて下さい。

選択エリアの全行数は
For each r in Selection.Areas
rcnt = rcnt + r.Rows.Count
Next
で求めていますが、一気に知る方法がありますでしょうか?

688 :デフォルトの名無しさん:2008/10/28(火) 18:29:27
>>687
一気に知る方法は知らないがそのままだと重複している行もカウントされる
少し前で話題に出たIntersectを組み込んで
For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas
とかにしたほうがいいんじゃないか?

689 :デフォルトの名無しさん:2008/10/28(火) 21:48:43
初心者って「一気に」とか「1行で」とか好きだよな

690 :デフォルトの名無しさん:2008/10/28(火) 22:14:07
コードが長くなると理解できなくなるんだよw


691 :デフォルトの名無しさん:2008/10/28(火) 23:47:58
関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。
もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。

692 :デフォルトの名無しさん:2008/10/29(水) 01:54:25
学習が下手な奴ほど早く学習する事が1つだけある
それは「人に訊いた方がラクだ」という事だ
なんちてw

>>687
一般的なやり方じゃないかも知らんが一応これで行けそう

重複行込み
rcnt = selection.entirerow.cells.count / activesheet.columns.count
重複行抜き
rcnt = intersect(selection.entirerow,columns(1)).count

693 :デフォルトの名無しさん:2008/10/29(水) 02:45:55
ループの中で =average() の引数を可変的に指定する方法を教えてください
具体例:
(1)乱数で10個のデータを生成し,列方向に保存
(2)保存したデータから平均を計算し, 2つ下のセルに出力
(3)上記(1)から(2) を n回繰り返す(とりあえずn=3).

上記(2)がうまく計算できません(下から3行目のコード).

---------------
Sub dice_siml01()
Cells.Clear

Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim nobs As Integer

Cells(1, 1) = "試行回数"
n = 3
nobs = 10
For j = 1 To n
For i = 1 To nobs
Cells(i + 1, j + 1).Formula = "=randbetween(1,6)"
Next
Cells(nobs + 3, j + 1).Formula = "=Average(Range(Cells(2, j+1), Cells(2+nobs-1, j+1)))" Next
End Sub
---------------
【注】
randbetween(1,6) エラーの場合 rand()で置き換えてお願いします.

694 :デフォルトの名無しさん:2008/10/29(水) 03:31:17
>>693
.formula に入れるのはセルにそのまま打ち込める式
範囲指定のところが "B2:B11" とかの形式になるように、
文字列を生成すればOK

695 :デフォルトの名無しさん:2008/10/29(水) 09:46:54
>>694
どうもありがと。
できれば、具体的な変換方法もお願いします。


696 :デフォルトの名無しさん:2008/10/29(水) 10:03:37
>>695
宿題か何か?
デカい誤り指摘してヒントも出したんだから、
そこからもっぺん自分で考えてみような
じゃなきゃこんな練習問題やってる意味ないだろ

697 :687:2008/10/29(水) 10:09:55
>>688
>>692
有難うございます。

「聞くは一時の恥じ...」
なんちてw

セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう
けど速度やメンテを考えるとコードは単純な程良い。


698 :デフォルトの名無しさん:2008/10/29(水) 10:36:40
>>696
これ以上は分からん。

699 :デフォルトの名無しさん:2008/10/29(水) 10:37:47
>>697
あ、速度考えるなら intersect とか濫用しない方がいいよ
10万回ループさせると>>692より>>687の方が早いんで

700 :デフォルトの名無しさん:2008/10/29(水) 12:16:46
>>697
>けど速度やメンテを考えるとコードは単純な程良い。
これは少し間違ってる気がする
速度を考えるなら処理するデータを単純にした上でコードも単純なものにする
例えばセルのプロパティを変数に入れるとか
さらにメモリの使い方にも気を配れればいい
書くと短くても動かすと重たい処理なんてたくさんあるし

701 :デフォルトの名無しさん:2008/10/29(水) 16:48:37
コードの見た目(行数、文字数とか)が単純なのと、
実際の処理が単純なのは違うよね

あと>>699の自己フォローなんだけど、
selectionの状態に依存するわな、、、w
areasが2-3ぐらいなら>>687の方が早いってことで

702 :デフォルトの名無しさん:2008/10/29(水) 21:27:30
置換に関しての質問なのですが、

検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?

703 :デフォルトの名無しさん:2008/10/29(水) 21:39:33
hoge = "あくまで一例"
set piyo = cells.find(hoge).offset(0,2)
piyo.value = piyo.value & "1"


704 :デフォルトの名無しさん:2008/10/29(水) 21:57:52
【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 超初心者です
【4 VBAでの回答の可否】 VBAでお願いします。

行の挿入、削除を教えてください。

A B A B C A B C
1 1001 1001 1 1001 1001 1001 1 1001 1001 1001
2 1003 1003 2 1003 1003 1002 2 1002
3 1004 1004 3 1004 1004 1003 3 1003 1003 1003
4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004
5 1006 1006 5 1006 1006 1006 5 1006 1006 1006
6 1007 1007 6 1007 1007 1007 6 1007 1007 1007
7 1008 1008 7 1008 1008 1008 7 1008 1008 1008


@ AB列の数字は同じものが入っています。
A C列に数値が入ります。
B C列に合わせて、A列、B列を挿入、削除したいです。
  C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
  行の削除がされると言う具合です。

業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。


705 :デフォルトの名無しさん:2008/10/29(水) 22:01:22
丸投げはやめようぜ。

自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。
作成依頼所じゃないんで。

706 :デフォルトの名無しさん:2008/10/29(水) 22:03:28
すいません、数値がずれまくりました。
もう一度書き込ませてください。

【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 超初心者です
【4 VBAでの回答の可否】 VBAでお願いします。

行の挿入、削除を教えてください。

@            A                 B    
    A    B         A    B    C        A    B    C
1  1001  1001     1  1001  1001  1001    1  1001  1001  1001
2  1003  1003     2  1003  1003  1002    2  1002
3  1004  1004     3  1004  1004  1003    3  1003  1003  1003
4  1005  1005  →  4  1005  1005  1004  → 4  1004  1004  1004
5  1006  1006     5  1006  1006  1006    5  1006  1006  1006
6  1007  1007     6  1007  1007  1007    6  1007  1007  1007
7  1008  1008     7  1008  1008  1008    7  1008  1008  1008


@ AB列の数字は同じものが入っています。
A C列に数値が入ります。
B C列に合わせて、A列、B列を挿入、削除したいです。
  C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は
  行の削除がされると言う具合です。

業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。


707 :デフォルトの名無しさん:2008/10/29(水) 22:05:26
>>706
>705

708 :デフォルトの名無しさん:2008/10/29(水) 22:22:44
>>703さん

ありがとうございます!!

A列全部で検索かけたい場合どうすればいいでしょうか?

709 :704 706:2008/10/29(水) 22:27:40
申し訳ございませんでした。

EXCEL総合相談所で聞いてきます。
マルチになってしまいますが、ご了承ください。

レベルが上がったらこのスレに来たいと思います。


710 :デフォルトの名無しさん:2008/10/30(木) 12:42:39
>>708
2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?

711 :デフォルトの名無しさん:2008/10/30(木) 12:45:03
他のレスと混同してた・・・


712 :デフォルトの名無しさん:2008/10/30(木) 21:03:32
>>708
cells はセル全部
columns(1) は1列目

ヒントはここまで。

713 :デフォルトの名無しさん:2008/10/31(金) 03:25:08
>>706
ズリネタとして結構面白かった

714 :デフォルトの名無しさん:2008/11/02(日) 18:00:44
dim rg as range
rg=activecell
処理
この処理後に、元のアクティブセルに戻る文が書けません。
どんなだったか、教えて。


715 :デフォルトの名無しさん:2008/11/02(日) 18:07:50
もう一個、よろしく。
処理の中で範囲を指定してコピー、貼付をしている。
application.screenupdating=false を直前に入れても
画面が動くのですが、画面が動かないようにできませんか?


716 :y:2008/11/02(日) 18:36:29
>>714
rg.Parent.Activate
rg.Avtivate
ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。

>>715
CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、
一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。



717 :デフォルトの名無しさん:2008/11/02(日) 19:37:54
>>716
久しぶりなので、マクロの記録で、終わってましたorz
おかげで、思い出すことが出来ました。
サンクス。

718 :デフォルトの名無しさん:2008/11/02(日) 20:51:29
>>716
その2行目も・・・

719 :デフォルトの名無しさん:2008/11/02(日) 20:57:01
プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック
を開き、データブックのイベントに対する処理をしています。
Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様
です。
Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。
方法をご教授頂けると有難いです。

720 :y:2008/11/02(日) 22:45:44
>>718
うは ご指摘ありがとうございます。

>>719
×ボタンでBeforeCloseイベントが発生するので、
同イベントプロシージャ内に
Application.Quit
を記述します。


721 :デフォルトの名無しさん:2008/11/02(日) 23:00:30
range型変数にsetしてないってのは突っ込んじゃいけない所?
最近、微妙な空気が読めなくなってきたよ・・・。

722 :719:2008/11/02(日) 23:24:17
>>720
自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。

SnendKeys(Alt+F4)を試したら終了できました。orz

723 :719:2008/11/03(月) 00:23:33
訂正です。
SendKeys(Alt+F4)でもだめでした。

プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に
変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4
を送信するとダイアログが閉じられる事になるのでExcelを終了できません。

724 :デフォルトの名無しさん:2008/11/03(月) 00:25:16
>>722
application.quit の前にワークブックの close やってる?
後にしてみたらどうなる?2007はわからんけど、、、

725 :722:2008/11/03(月) 00:44:26
>>724
もう少し具体的に教えて下さいませんか。

2007以外は×ボタンでExcel終了が終了するようになっています。
同じブックを2007の互換モードで動かして×ボタンでExcelを終了
したいのです。
この方法が分からないのです。

726 :デフォルトの名無しさん:2008/11/03(月) 01:21:12
>>725
あ、ごめん
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html
この辺の問題のことだったの。
2007以外ではいけてるなら関係ないね。失礼した

727 :y:2008/11/03(月) 07:57:50
>>725
2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね?
一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。
VBAでのやり方は、後で職場の2007で探してみます。


728 :デフォルトの名無しさん:2008/11/03(月) 09:09:42
range型ってsetしなくても使えるの?

729 :デフォルトの名無しさん:2008/11/03(月) 10:14:59
範囲指定をしてコピー等をした後、コピーモードををフォルスにした
後のことです。
範囲指定を解除する方法は、どこかのセルをactivateやselectするしか
方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を
したくないのですが、何か方法が無いでしょうか?



730 :デフォルトの名無しさん:2008/11/03(月) 10:51:57
久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。

>>725
724は具体的に言ってるでしょ。
ダイアログが出るために終了できないのならダイアログが出ないようにすれば?
どうしてダイアログが出るの?
ブックが変更されてるのに保存されてないからでしょ?
だったら保存したら?
こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。

>>729
全体的に何がいいたいのかよくわからない気がする。

731 :デフォルトの名無しさん:2008/11/03(月) 10:54:12
どうしてもわからないので
教えていただきたいのですが、

Book1を起動して
Book1のマクロで
Book2を開くことはできたのですが

Book2の内容をコピーして
Book1に貼り付けすることができません

よろしくお願いします。



732 :デフォルトの名無しさん:2008/11/03(月) 10:59:28
>>729
ググってもすぐ見つかるし
マクロの記録でもすぐ解るようなことを何故聞く?
そのものズバリの解除法が簡単に見つかるのに

>>731
Bool2を開くと、戻り値としてBool2のオブジェクトが返る
あとは好きなようにコピーなりなんなりすれば良い

733 :725:2008/11/03(月) 11:12:00
>>730
保存するかどうかはユーザーが決める事で、プログラム側で決められる
のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。
説明不足?それとも...

734 :725:2008/11/03(月) 11:17:49
>>730
719に記述した通りなんだけど...

735 :デフォルトの名無しさん:2008/11/03(月) 11:25:31
>>734
だから?
ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。
お前さんが検証もせずそう思い込んでいるだけにすぎない。

全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。

736 :デフォルトの名無しさん:2008/11/03(月) 11:43:21
>>735
確かに、Excel2000と2007で同じブックを動作した検証で違いが出た
だけですが...

737 :デフォルトの名無しさん:2008/11/03(月) 14:48:40
API

738 :デフォルトの名無しさん:2008/11/03(月) 20:06:15
もしかして、.saved や displayalerts の値はいじらずに、
組み込みダイアログをそのまま使ってるのかな?>>733
組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、
ユーザに選ばせるなら自前でやった方が確実かも

739 :デフォルトの名無しさん:2008/11/05(水) 00:23:48
>665
たとえば、セル(4, 3)に '=A1+A2が記入してあり
その式をセル(5, 1)に書き込む場合
  Cells(5, 1) = Mid$(Cells(4, 3), 1)
でどうでしょう?

740 :デフォルトの名無しさん:2008/11/05(水) 01:33:08
いつの話だよ

741 :デフォルトの名無しさん:2008/11/05(水) 10:16:29
? ActiveSheet.UsedRange.Rows.Count
これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。
これって、仕様ですか?

742 :デフォルトの名無しさん:2008/11/05(水) 11:06:19
>>741
イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる
?1+1とかでも同じ
でもウォッチ式として使えば問題ない

743 :742:2008/11/05(水) 11:11:33
今試したらウォッチ式でもだめだった orz

744 :741:2008/11/05(水) 15:12:16
セルの選択範囲が変更になったとき、最終行を調べたいのですが
? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
だと、保護されたシートの時エラーになってしまう。
他にUndoを生かしたまま最終行を求める方法あります?

745 :デフォルトの名無しさん:2008/11/05(水) 16:17:36
>>744
?WorksheetFunction.Max(ActiveSheet.Cells(65536, 1).End(xlUp).Row,ActiveSheet.Cells(65536, 2).End(xlUp).Row,ActiveSheet.Cells(65536, 3).End(xlUp).Row)
もしくは
Dim lg(2) As Long
lg(0) = ActiveSheet.Cells(65536, 1).End(xlUp).Row
lg(1) = ActiveSheet.Cells(65536, 2).End(xlUp).Row
lg(2) = ActiveSheet.Cells(65536, 3).End(xlUp).Row
Debug.Print WorksheetFunction.Max(lg())
でどう?

746 :デフォルトの名無しさん:2008/11/05(水) 16:42:43
>>745
有難うございます。
? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row
で出来たのですが、列を特定しないと駄目なのですよね。

自分も気付いたのですが、
保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法
もありますね。

747 :デフォルトの名無しさん:2008/11/06(木) 01:26:47
超初心者なのですが、グラフ作成のところで詰まってしまいました。
B2を起点とするデータ
B21を起点とするデータ
この二つのデータのグラフを作成しようと以下のマクロを作ったのですが、
Set muSouce2 = Range("B21").CurrentRegion
のところでエラーがでてしまいました。
この場合どうすればエラーが取れるのでしょうか?



Sub Graph1()
Dim mySouce As Range
Set mySouce = Range("B2").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine

Dim mySouce2 As Range
Set mySouce2 = Range("B21").CurrentRegion
Charts.Add
ActiveChart.SetSourceData Source:=mySouce2, PlotBy:=xlColumns
ActiveChart.ChartType = xlLine
End Sub

748 :デフォルトの名無しさん:2008/11/06(木) 02:13:25
>>747
set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ

749 :デフォルトの名無しさん:2008/11/06(木) 02:51:43
>>748
なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。

対処だけでなく原因が分かりためになりました!

750 :デフォルトの名無しさん:2008/11/06(木) 10:11:14
>>749
そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい

751 :デフォルトの名無しさん:2008/11/06(木) 18:01:30
ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが
Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。

752 :デフォルトの名無しさん:2008/11/06(木) 18:14:58
>>751
Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw


753 :デフォルトの名無しさん:2008/11/06(木) 18:35:33
そうなんです
[G/標準]とかでエラーになる為、セル代入を考えたのですが...

754 :デフォルトの名無しさん:2008/11/06(木) 18:50:58
「セルの書式に合わせた文字列に変換」でいいのね
? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?

755 :デフォルトの名無しさん:2008/11/06(木) 19:12:31
TEXT関数か・・・ならば
worksheetfunction.text(x, activecell.numberformat)
これでどうかな?

756 :デフォルトの名無しさん:2008/11/06(木) 19:20:37
>>755
書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど

757 :デフォルトの名無しさん:2008/11/06(木) 19:35:05
しつこいようだけど、頼む。
セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz

758 :デフォルトの名無しさん:2008/11/06(木) 19:44:51
>>757
ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない

>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる

759 :デフォルトの名無しさん:2008/11/06(木) 19:50:15
>>757
以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明

>>758
お前頭悪そうだな

760 :デフォルトの名無しさん:2008/11/06(木) 19:56:56
>>759
質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ

761 :デフォルトの名無しさん:2008/11/06(木) 20:01:11
質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。

762 :デフォルトの名無しさん:2008/11/06(木) 20:10:08
>>761
そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ

763 :デフォルトの名無しさん:2008/11/06(木) 20:46:09
喧嘩は他所でスレ立ててやれよ
目障り

764 :デフォルトの名無しさん:2008/11/06(木) 21:18:48
自己紹介乙

765 :デフォルトの名無しさん:2008/11/06(木) 21:53:02
>>763
おまえは引っ込んでろ!
このカス。

766 :デフォルトの名無しさん:2008/11/07(金) 04:10:27
俺も >>757 の質問がよくわからないし
つか、前に質問したなら名前欄にレス番とか入れてくれ


767 :569:2008/11/07(金) 06:17:38
フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが
フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・)

Aフォルダ
Bフォルダ
○○.xls
というパターンもあれば
Aフォルダ/Cフォルダ/○○.xls
Bフォルダ/○○.xls
というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。
このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を
取り出す機能を持ったVBAを作ろうとしています。

フォルダのパスはFOを使って配列に入れてそれを
全てのフォルダパターンを使って○○.xlsを探そうとしています。
そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?

階層固定のフォルダ抽出、Excelファイルは問題ないのですが
階層実固定のフォルダ抽出で詰まっています。

例えば手抜きですが↓みたいな流れでうまく出来そうですかね?
Private Sub AAA()
今のパスを配列に格納
  if フォルダが有る時 then
call AAA
end if
End AAA


768 :デフォルトの名無しさん:2008/11/07(金) 06:18:18
すんません。上のやつ>>569さんじゃないです・・・。名前に入っちゃいました。

769 :デフォルトの名無しさん:2008/11/07(金) 08:44:46
>>767
>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?

770 :751:2008/11/07(金) 09:34:48
>>754
>>755
>>758
ありがとうございます.orz
754さんの方法でグーですね。

771 :751:2008/11/07(金) 09:47:36
ついでにもう1つ教えてください。
xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...

772 :デフォルトの名無しさん:2008/11/07(金) 10:00:12
どういうエラーでそのxが何か分からないと答えられない
セル(Range)なのか数値や文字なのか

773 :デフォルトの名無しさん:2008/11/07(金) 10:09:03
>>767
「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ

774 :771:2008/11/07(金) 10:50:19
入力したテキストxでAutoFilterの設定・解除をしています。
(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。


775 :デフォルトの名無しさん:2008/11/07(金) 12:54:09
>>769
ちょっと試せない状態だったのでとりあえず聞きました。

>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。

776 :デフォルトの名無しさん:2008/11/07(金) 13:14:43
初歩的な質問なんですが、
intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?

777 :デフォルトの名無しさん:2008/11/07(金) 13:47:26
>>776
アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?

778 :デフォルトの名無しさん:2008/11/07(金) 15:38:15
>>776
Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし

779 :デフォルトの名無しさん:2008/11/07(金) 18:04:36
膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ

780 :デフォルトの名無しさん:2008/11/07(金) 18:10:46
>>774
x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな

781 :デフォルトの名無しさん:2008/11/07(金) 18:27:19
説明が下手な奴大杉

782 :デフォルトの名無しさん:2008/11/07(金) 19:31:54
説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ

もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが
殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから
ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない

783 :デフォルトの名無しさん:2008/11/07(金) 19:45:31
>>782
よく分からない論理だな。

784 :デフォルトの名無しさん:2008/11/07(金) 21:12:21
わからんではないが、そこまで言い放つことでもない
甘え放題も困るが委縮させ過ぎるのもよくない
意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい

785 :デフォルトの名無しさん:2008/11/08(土) 07:17:57
ヒマだからスレ読み返してたらわかったw
>>757=>>729だね。たぶん>>715も同じ人っぽい

screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと

範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない

でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う

786 :デフォルトの名無しさん:2008/11/08(土) 17:49:36
>>785
ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。


787 :デフォルトの名無しさん:2008/11/09(日) 08:43:30
Enumとして宣言さている列挙型のmember名をStringとして取得できますか?

788 :デフォルトの名無しさん:2008/11/09(日) 11:32:30
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す


789 :デフォルトの名無しさん:2008/11/09(日) 11:34:07
だれのための、どういう報告なの?

790 :788:2008/11/09(日) 11:36:43
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す

そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、
xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?

791 :デフォルトの名無しさん:2008/11/09(日) 11:53:23
>>787
スレ違い
それはVBAではなくVB言語の質問だ

>>790
あるけど、それはWindowsの設定の問題だ

792 :デフォルトの名無しさん:2008/11/09(日) 12:30:57
windows弄ったら出来るのかー。

ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。

VisualStudioからEXCELのコントロールわからんしな;;

793 :デフォルトの名無しさん:2008/11/09(日) 14:49:50
できないだろ
無理にやると普通に開けなくなるだろ
バッチファイルかWSHにドロップして
引数を環境変数に設定して
xlsファイルを開き
環境変数を見る

794 :デフォルトの名無しさん:2008/11/09(日) 15:43:56
いつもそんなことやってるの?

795 :デフォルトの名無しさん:2008/11/09(日) 19:34:55
>>790
普通にアドインを作れば解決するケースに思えるけど。

796 :デフォルトの名無しさん:2008/11/09(日) 21:03:05
アドイン??

797 :デフォルトの名無しさん:2008/11/09(日) 21:16:11
>>795
教えてくれ

798 :デフォルトの名無しさん:2008/11/09(日) 21:31:57
「Excel アドイン」でググってトップのところに詳しい説明があるから
それを読んだ方がいいよ。

VBAのコードが普通に書ける人ならすぐに理解できると思う。

799 :788:2008/11/09(日) 21:34:13
>>795
>>798
まさにこれだ!!!
ありがとう!!!

800 :655:2008/11/10(月) 00:15:33
>>655
If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。

801 :デフォルトの名無しさん:2008/11/10(月) 10:07:40
>>786
書いて良かった。誰?とか言ってゴメンなw

>>790
処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、

802 :デフォルトの名無しさん:2008/11/10(月) 11:51:04
>>801
販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。

それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。

803 :デフォルトの名無しさん:2008/11/10(月) 12:55:12
>>802
>販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?

804 :デフォルトの名無しさん:2008/11/10(月) 12:58:20
>>802
なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、

805 :デフォルトの名無しさん:2008/11/10(月) 13:33:50
今までが無駄過ぎただけだな。

806 :デフォルトの名無しさん:2008/11/10(月) 14:03:48
>>803
保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz

807 :デフォルトの名無しさん:2008/11/10(月) 14:05:19
>>804

それがアドインかと思ってたorz orz

808 :デフォルトの名無しさん:2008/11/10(月) 19:24:04
>>804
そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。

809 :デフォルトの名無しさん:2008/11/10(月) 19:26:46
>>808
ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。

810 :デフォルトの名無しさん:2008/11/10(月) 19:30:27
うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?

811 :デフォルトの名無しさん:2008/11/10(月) 19:40:33
マクロが記述してあるだけのブックを用意して
そのマクロをツールバーに登録するんだよ
ネットワーク越しでも大丈夫だし

812 :デフォルトの名無しさん:2008/11/10(月) 23:38:11
初心者なので、丸投げでお願いします。

application on timeを使って、
開始したら、
a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を
やって、終わる。
というものです。
どうにも、最近、頭が回らなくなって困ってます (~.~)


813 :デフォルトの名無しさん:2008/11/10(月) 23:48:19
はい次の話題

814 :デフォルトの名無しさん:2008/11/11(火) 00:02:20
812の追記
処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と
いうことでお願いします。



815 :デフォルトの名無しさん:2008/11/11(火) 01:31:29
A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。

Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが)

abc ="08/11/11";
sscanf(abc,"%d/%d/%d",&a,&,b,&c);
printf("20%02d%02d%02d",a,b,c);

VBAで書くにはどんな関数使えばいいのでしょう。

816 :812:2008/11/11(火) 01:45:58
自己解決できましたので、
>>812 814はスルーでよろっ。


817 :815:2008/11/11(火) 02:02:40
文字列操作でこうやってみた

                tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2))
                tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2))
                tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2))
                tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d

スマートじゃねえよなーorz

818 :デフォルトの名無しさん:2008/11/11(火) 02:09:50
>>815
いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね

819 :デフォルトの名無しさん:2008/11/11(火) 19:44:30
すいません質問です
エクセルのマクロで
module1内にコード書くのと
sheet1内にコード書くのとでは
動作にどんな違いがありますか?
sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・


820 :デフォルトの名無しさん:2008/11/11(火) 19:50:39
訂正)Selection→Select

821 :デフォルトの名無しさん:2008/11/11(火) 20:51:01
>>445で解決しましたすいません

822 :デフォルトの名無しさん:2008/11/11(火) 21:15:30
こんばんは
複数のセルの値を一度に比較することってできますか?
Sheet1のA1:B5とSheet2のA1:B5のValueが
同じであるかどうか、が分かるだけでokなのですが。

823 :デフォルトの名無しさん:2008/11/12(水) 00:20:52
各シートは配列のようにアクセスできるが

824 :デフォルトの名無しさん:2008/11/12(水) 01:57:12
>>822
配列数式でできるよ

825 :デフォルトの名無しさん:2008/11/12(水) 05:52:03
Excel2003を使っています。
羅線の太さを調節する方法ってありますか?
できるだけ細くしたいのです。


826 :デフォルトの名無しさん:2008/11/12(水) 06:21:13
>>825
マクロの記録使って保存すればおk

単純に細くするだけの質問ならスレチ


827 :デフォルトの名無しさん:2008/11/12(水) 12:48:05
Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512

セルA1とA2を結合したシートに対して
下記のコードの実行時間は
1回目:13秒
2回目以降:54秒 (Pasteに変更すると29秒)

1回目と2回目以降の違いの理由は何なのでしょうか?

rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
selection.mergecells = false
selection.delete shift:=xlUp
range("A1").Select

どうやったら速度アップできるか知りたいのですが...


828 :デフォルトの名無しさん:2008/11/12(水) 12:52:09
羅線ってなんだ?
らせん?

829 :デフォルトの名無しさん:2008/11/12(水) 13:26:01
螺旋
罫線
新羅
確かに間違える人は居るかも

830 :827:2008/11/12(水) 14:59:51
やりたい事は
シート・アクティブ時にコピー挿入し編集
シート・ディアクティブ時に挿入データを削除(元の状態に戻す)
なのです。

831 :デフォルトの名無しさん:2008/11/12(水) 15:02:57
> 1回目:13秒
> 2回目以降:54秒 (Pasteに変更すると29秒)

単位、「秒」じゃなくて「_秒」の間違いだよね?

832 :デフォルトの名無しさん:2008/11/12(水) 15:15:35
秒です。

833 :デフォルトの名無しさん:2008/11/12(水) 15:17:38
セルを結合していなければ1秒未満です。

834 :デフォルトの名無しさん:2008/11/12(水) 15:20:33
いや、結合していても_秒でしょ

835 :デフォルトの名無しさん:2008/11/12(水) 15:34:39
結合云々は関係なく1秒かからんな
データは何かあるのか?

とりあえず高速化のために
Application.ScreenUpdating=False
はやってるよな?

836 :デフォルトの名無しさん:2008/11/12(水) 15:54:59
新規ブックでセルをマージし、>>827のコードを走らせただけです。
ScreenUpdating, EnableEvent, Calculation等もやってみています。

マシン・スペック(5年前)の問題でしょうか?

837 :デフォルトの名無しさん:2008/11/12(水) 16:15:36
スペックは漏れのマシンのほうが悪いくらいのはずw
計測方法の問題じゃないか?

838 :デフォルトの名無しさん:2008/11/12(水) 16:54:32
すまん、Mobile Pentium4の間違いだったorz

839 :デフォルトの名無しさん:2008/11/12(水) 17:23:09
Mobile Celeron(1200MHz)512MB RAM
Mobile云々は置いといてこっちは1.2GHzなんだよw
OSが2kだからってここまで差は出ないよな?
体感でも1秒以上かかってるのか?

840 :デフォルトの名無しさん:2008/11/12(水) 17:38:52
excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512
でセルA1とB1を結合して走らせてみたら
1回目:9秒
2回目:40秒

体感で1秒未満は、セル結合無しの場合だけ

841 :デフォルトの名無しさん:2008/11/12(水) 17:53:33
あぁA1とB1を結合かw
それなら確かに遅くなるな

842 :827:2008/11/12(水) 18:00:26
>>827のA1とA2はA1とB1の結合に訂正願います orz

843 :デフォルトの名無しさん:2008/11/12(水) 18:03:34
俺の古典的環境だと1回目20秒、2回目1分40秒w
遅過ぎワロタw

844 :デフォルトの名無しさん:2008/11/12(水) 22:23:38
>>830
どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?

845 :デフォルトの名無しさん:2008/11/13(木) 09:30:46
*)シート(A1とB1結合)アクティブ時の処理
rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
'コピー挿入した行に名前を付ける(後で削除の為)

*)コピー挿入したデータへの編集

*)シートディアクティブ時の処理(アクティブ時点の状態に戻す)
'実際にはSelectionでは無く名前で削除
selection.mergecells = false '<- これ無しだと遅くなる為
selection.delete shift:=xlUp
range("A1").Select


846 :デフォルトの名無しさん:2008/11/13(木) 09:40:02
メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?

847 :デフォルトの名無しさん:2008/11/13(木) 12:31:54
>>845
了解

多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね

オレなりに試してみた限りでは、

挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
      コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
      ( .mergecells = false もいらない)

ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる

848 :845:2008/11/13(木) 13:26:06
>>847
有難うございます

挿入処理は、
insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです

削除処理は、
ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます

849 :デフォルトの名無しさん:2008/11/13(木) 17:21:48
>>848
名前か。それは厄介だ
挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし
insert だけでも 2回目は遅くなるし

後は、編集時にシートコピーしたシートを使っといて、deactivate されたら
シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、

850 :デフォルトの名無しさん:2008/11/13(木) 17:26:26
シートのコピーから戻す方式を試したら更に時間が掛かる様になってしまった

851 :デフォルトの名無しさん:2008/11/13(木) 18:16:20
>>850
データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで>>827の条件で試しただけだし

852 :デフォルトの名無しさん:2008/11/13(木) 21:52:40
>>847の処理における名前付き範囲は、挿入時に
range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、

853 :851:2008/11/14(金) 00:13:24
とりあえず、A2:Z3000 をテキトーな数式で埋めて試して見たけど、
やっぱ>>847のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも

854 :デフォルトの名無しさん:2008/11/14(金) 21:41:28
はじめまして、こんばんは。
今日はじめて本屋にて VBA の存在を知りました。
初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか?
詳しいかた教えてください。


855 :デフォルトの名無しさん:2008/11/14(金) 22:05:58
>>854
例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか

インベーダーゲーム作ってる人もいるよ

とにかくExcelをVBAプログラムで自在に操れるって事

856 :デフォルトの名無しさん:2008/11/15(土) 19:22:40
>>854
業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。

excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。


857 :無職カス:2008/11/16(日) 02:50:07
みなさん、こんばんは、 >>854 です。
>>855
>>856  さん      返答ありがとうございます。かなり使える機能ですね。
 最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。

多々質問すると思いますが、みなさんよろしくおねがいします。

858 :デフォルトの名無しさん:2008/11/16(日) 03:45:10
下に全員の成績表があって、
そこから各部門のトップ5を上の小さい表に抽出したいんだけど、
ランクとは違う気がするし行き詰っています。
どなたかご教授願えますでしょうか?

859 :デフォルトの名無しさん:2008/11/16(日) 05:08:38
officexpのマクロと関数の処理順(と思われる事項)で知恵を貸していただきたく書き込みいたします。

セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、
セルBの書式が自身の値によって変わるようにマクロを組もうとしています。
(書式は4種類以上なので条件付き書式は使えません)

worksheet_changeで書式変更を自動実行するようにしたのですが、
マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります)
その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、
マクロ自体には問題はないようです。

おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために
マクロによる変化が見られない状況であると思っています。
(違っているなら根本から考え直さないといけないかもしれませんが)
このような構成の場合、関数による値の変更が反映された後で
書式変更などのマクロが実行されるようにすることはできないのでしょうか?

ご教示お願い申し上げます。

860 :デフォルトの名無しさん:2008/11/16(日) 10:11:55
Calculate

861 :デフォルトの名無しさん:2008/11/16(日) 10:51:08
>>860
ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。

初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。

862 :デフォルトの名無しさん:2008/11/16(日) 19:13:30
>>857
基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。

んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば>>855でゲームの話が出てたけど、確かに作る事は出来る。

けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。

ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。

何か目標持った方が良いよ。

863 :デフォルトの名無しさん:2008/11/16(日) 19:15:00
>>859
calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?


864 :独り言(ちら裏):2008/11/17(月) 01:24:05
というか、条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に
問題ありかと...
それがExcelのポリシーというのであれば、そういうアプリめいたものを
Excelで作ることが間違いだったということになるか...

865 :デフォルトの名無しさん:2008/11/17(月) 10:16:53
> 条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に
> 問題ありかと...
という意見が多いので、2007で設定数が 3 から 無制限 に、
優先順位も設定を書き直さずに変更できるようになった。

866 :デフォルトの名無しさん:2008/11/17(月) 14:02:59
ということで、Excel2007以降の購入をお勧め

867 :デフォルトの名無しさん:2008/11/17(月) 15:07:26
てゆーか、条件によって変化するセルの書式の種類は3つに留めておく
というのが無難かと

868 :デフォルトの名無しさん:2008/11/18(火) 00:50:10
>>864
selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?

869 :デフォルトの名無しさん:2008/11/18(火) 17:07:45
これのFSO(FileSystemObject)使ってテキストデータの読み込みすると文字化けします。
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?


870 :デフォルトの名無しさん:2008/11/18(火) 20:26:27
質問です。バージョンはexcel2007です。
Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
Loop

cells(a,3)から(a,15)まで同じ処理をしたい場合はどう記述すればいいですか

871 :デフォルトの名無しさん:2008/11/18(火) 21:16:34
>>869
ADODB.Stream

872 :デフォルトの名無しさん:2008/11/18(火) 21:23:24
>>870
Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
If a = 16 Then
Exit Do
End If
Loop

873 :デフォルトの名無しさん:2008/11/18(火) 21:45:15
>>870
byte型宣言はいくらなんでも無いんじゃないかな・・・。
aの使用目的が行数って分かってるんだし、そこはlongに宣言すべきだと思うんだけど。

Dim i As Long
For i = 5 To Cells(5, 5).End(xlDown).Row
Range(Cells(i, 3), Cells(i, 15)).Interior.ColorIndex = 10
Next

短い構文でも同じ処理は出来るんでないかな。

874 :デフォルトの名無しさん:2008/11/18(火) 22:07:13
870って無限ループじゃないの

875 :デフォルトの名無しさん:2008/11/18(火) 22:07:40
Range(Cells(5, 5), Cells(5, 5).SpecialCells(xlCellTypeLastCell)).Offset(, -2).Resize(, 13).Interior.ColorIndex = 10
こうか?

876 :デフォルトの名無しさん:2008/11/19(水) 00:36:24
>>874
255行でオーバーフローで止まる方式

877 :デフォルトの名無しさん:2008/11/19(水) 08:47:21
>>874の説明でなぜかものすごく納得してしまったw

878 :877:2008/11/19(水) 08:48:08
安価ミス>>876だった

879 :デフォルトの名無しさん:2008/11/19(水) 10:18:22
>>871
どうもありがとう^^
メモリ不足で四苦八苦してたけど.LineSeparator追加で何とか出来た。ヽ(´ー`)ノ
ttp://www.cocoaliz.com/excelVBA/index/41/

880 :デフォルトの名無しさん:2008/11/19(水) 10:30:40
Const adLF = 10 宣言しなくても出来ちゃったんだけど問題ないのかな?

881 :デフォルトの名無しさん:2008/11/19(水) 13:46:56
参照設定したんならいらないでしょ

882 :デフォルトの名無しさん:2008/11/20(木) 10:23:07
どうして?

883 :デフォルトの名無しさん:2008/11/20(木) 11:21:57
参照先で宣言されてるから

884 :デフォルトの名無しさん:2008/11/20(木) 13:59:13
なるほど、
ADODB.Streamが良く分らなくても動いて良かったです^^

885 :デフォルトの名無しさん:2008/11/22(土) 00:09:26 ?2BP(1028)

automation error
The object invoked has disconnected by the client

これ、どうやって解析したらいいの?
ユーザフォームからFiledialogでファイルを開くと 出るんだけど・・・
で、そのうちFM20.dllでメモリアクセスバイオレ〜ションになる

886 :デフォルトの名無しさん:2008/11/22(土) 20:17:54
CreateObjectでIEのフォーム送信を操作して、
帰ってきたページのリンク先の情報を取得したいと思ってます

Debug.Print objIE.Document.Links.Length で見ると値は4なので
フォーム送信前のリンク先の総数は4だと分かるんですが、
送信後に帰ってきたページのそれの総数(その他もですが)の取得ができません

set objIE = Nothing で一度解放してから再度
CreateObject("InternetExplorer.application") でバインドするだけでは駄目なのでしょうか
"システムエラーです: &H800004005 (-214767259) エラーを特定できません"
というエラーが出てしまいます

あともうちょいの様な気がしますので、どなたかご教示お願いします

887 :デフォルトの名無しさん:2008/11/22(土) 21:39:47
なんでわざわざ解放するの?

888 :886:2008/11/22(土) 21:43:56
>>887
きちんと取得できるのであればわざわざしないので、
取得方法を教えて頂きたいのですが…

889 :デフォルトの名無しさん:2008/11/22(土) 22:16:44
>>888
読み込み終わるまでウェイトは入れてる?

890 :886:2008/11/22(土) 22:30:48
>>889
一応前後に1回ずつ入れてます。こんな感じでしょうか
READYSTATE_COMPLETE = 4 をWhie〜Wendでループさせて待ってるので合ってると思いますが…

Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←リンクの数(=4)
Call WaitBrowserResponce ←ウェイト
With objIE.Document.Forms("SQL_FROM") 'フォームにSQLのコマンド(WSQL)をぶち込む
.Item("SQL").Value = WSQL
.submit
End With
'ここでフォーム送信されます
Call WaitBrowserResponce ←ウェイト
Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←こいつが4のまま

ここでリンクの数を再取得(前のページのでなく新しいページのが欲しい)したいのです

891 :886:2008/11/22(土) 22:32:45
念のためIEのウェイト処理をば

Private Sub WaitBrowserResponce() 'IEの処理が終わるまで待機

While objIE.ReadyState <> 4 'READYSTATE_COMPLETE = 4
Debug.Print ".ReadyState = " & objIE.ReadyState
Debug.Print ".Busy = " & objIE.Busy
While objIE.Busy = True
DoEvents
Wend
Wend
Debug.Print "------------------------" ←単なるイミディエイト窓の区切りです

End Sub

892 :デフォルトの名無しさん:2008/11/22(土) 23:41:05
他のxlsファイルを開きたいんだけど、想定されるフルパスが特定できないので、今開いてるxlsからの相対参照したいんだけど、マクロの記録でやると絶対参照で記録されるよね;;
相対参照ってどう記述すればいいんでしょう

893 :デフォルトの名無しさん:2008/11/23(日) 06:31:45
>>892
まず、chdir thisworkbook.path で今開いてるブックのフォルダに移動してから

同じフォルダ内なら workbooks.open filename:="Book1.xls"
下のフォルダ内なら filename:="\Folder1\Book1.xls"
上のフォルダ内にある別のフォルダの中にあれば filename:="..\Folder2\Book1.xls"
ふたつ上のフォルダ内なら filename:="..\..\Book1.xls"

んな感じで

894 :デフォルトの名無しさん:2008/11/23(日) 07:28:29
>>893

すげーーーー!
書き込んだあと、いろいろ探してそれっぽいのは見つけたんだけど、このソースが一番短い!!!ありがとう!!

895 :デフォルトの名無しさん:2008/11/23(日) 10:14:32
>>886
URLリンク先取得
ttp://www.google.co.jp/search?hl=ja&q=VBA+URL+%E3%83%AA%E3%83%B3%E3%82%AF&lr=
>>892
ファイル検索
ttp://www.google.co.jp/search?hl=ja&q=VBA+File+%E6%A4%9C%E7%B4%A2&btnG=%E6%A4%9C%E7%B4%A2&lr=

896 :デフォルトの名無しさん:2008/11/23(日) 15:47:12
>>891
ちゃんとループ内に入ってることは確認済?
.readystate が変更される前に飛んで来てたりしてないよね
.document.readystate とか、document_completeイベントとかでのチェックはもう試した?
IE が値を返すタイミングはあんまり信用できないから、いろいろ試した方がいいかも

897 :デフォルトの名無しさん:2008/11/23(日) 19:12:41
RANGE("A1")の

1を変数にしたい場合⇒RANGE("A" & format(i))というのを見つけたのですが、
Aを変数にしたい場合はどうすればよいでしょうか?

898 :デフォルトの名無しさん:2008/11/23(日) 20:06:38
>>897
普通に変数を & で繋げばOK

dim a as string: dim i as long
a = "A": i = 1
debug.print a & i      ' ←これでも行けるけど
debug.print a & cstr(i)   ' ←ちゃんと型を揃えたければこっち

つか、cells 使った方が効率いいよ

899 :デフォルトの名無しさん:2008/11/23(日) 21:01:42
>>898
ありがとうございます
とりあえず、a="A"(列名)を列番号からmid関数で取得して、使ってみます。

900 :886:2008/11/23(日) 22:24:38
>>896
ようやく仕事から帰りました

ループの囲みや最初のreadystateのチェック自体はOKだったのですが、
どうやら2回目以降のループで実際は読み込みが間に合ってなかった模様です

Do
 Do
  Application.Wait Now + TimeValue("0:00:01")
  DoEvents
 Loop Until objIE.Busy = False
Loop Until objIE.ReadyState = 4

として、最低1回以上のウェイトを挟んだ上でreadystateの値が4になるまで
ループを回す事で、きちんと最後まで読み込めるようになりました


901 :デフォルトの名無しさん:2008/11/23(日) 22:57:44
>>899
なんか回りくどいことするんだね、、、いいけどさ

>>900
オレなら外側のループにも doevents 入れたくなるんだけど、
動いたんならいっかw

902 :デフォルトの名無しさん:2008/11/24(月) 07:27:53
>>899
cells(1,1).select
ってやってみ。

903 :デフォルトの名無しさん:2008/11/24(月) 19:35:43
2007を持ってる人に聞きたいんだが、2007のFindメソッドのヘルプの使用例は2003同様間違ってる?

904 :デフォルトの名無しさん:2008/11/25(火) 01:56:12
VBAでHTML形式のメール送信する場合に使用可能な
フリーのオブジェクトって何があるか教えてくださいエロイ人

BASP21なんかフリーだけど、送れるのはテキストだよね
試しにBodyにHTML書いてみたら、そのままテキストで着ちゃったよママン

905 :デフォルトの名無しさん:2008/11/25(火) 04:26:56
>>904
basp21 でできるはず
ttp://www.hi-ho.ne.jp/babaq/faq.html#M002

906 :デフォルトの名無しさん:2008/11/25(火) 08:00:48
>>905
即レスありがとう

ありゃ?これは有料じゃなくて無料でもできるのですか?
ちょっと読んでみても区別がつかなかったので、あとでじっくり読んで見ます。

907 :デフォルトの名無しさん:2008/11/25(火) 09:34:06
>>903
どっちも同じ。

908 :デフォルトの名無しさん:2008/11/25(火) 14:17:31
あるwebページをIEオブジェクトで操作して、リンクをクリックさせたら別窓でリンク先が表示されました
今後この別窓のIEオブジェクトを掴んでアクティブにして操作するにはどうすればいいのでしょうか?
文系のなけなしの知識でウィンドウハンドルを取得すればいいと思い当たり、
For Eachで各ウィンドウのそれの取得だけはできました(たぶん)

Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long)
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
(中略)
hWnd = GetForegroundWindow
Set objShell = CreateObject("Shell.Application")
 For Each objIE In objShell.Windows
  Debug.Print objIE.hWnd
 Next

ウィンドウハンドルの値は取得できても、アクティブにしたい(操作したい)ウィンドウの
それだと判別する方法が解らないので、どなたかご教示&ご解説お願いします

909 :デフォルトの名無しさん:2008/11/25(火) 14:55:04
>>908
>>1★3,★4
お引き取り下さい

910 :903:2008/11/25(火) 22:02:32
>>907
そっか、相変わらずか。
報告は山ほど行ってるはずなのに。

911 :デフォルトの名無しさん:2008/11/26(水) 02:07:41
>>910
俺も勉強してる時、ヘルプの使用例には

何度も泣かされたよ。

912 :デフォルトの名無しさん:2008/11/26(水) 08:19:57
10日で覚えるシリーズの入門編を読んだけど、
次ぎは、どの様な本がお勧めですか?

913 :デフォルトの名無しさん:2008/11/26(水) 19:41:47
本屋に行って自分の好きなん選べ

914 :デフォルトの名無しさん:2008/11/27(木) 10:36:04
>>909
日本語わかる?

915 :デフォルトの名無しさん:2008/11/27(木) 10:49:20
Excelを使う必要はないわな。

916 :デフォルトの名無しさん:2008/11/28(金) 01:40:51
>>914
教えてもえらなかったからって逆切れですか?

917 :デフォルトの名無しさん:2008/11/28(金) 09:55:34
VBAのクラスやデザイン・パターンを解説している書籍やサイトは
ありませんでしょうか?


918 :デフォルトの名無しさん:2008/11/28(金) 22:31:45
OOP

919 :デフォルトの名無しさん:2008/11/28(金) 22:32:16
酔ってるから間違えた

OOP極めてるオレに聞け

920 :デフォルトの名無しさん:2008/11/28(金) 23:54:44
vbaでデザパタとかw

921 :917:2008/11/29(土) 00:15:40
すいません、自分で調べたら結構ありました。

VBAとdesign patternで検索したら沢山ヒットしました。
http://www.google.com/search?client=safari&rls=en-us&q=VBA+design+pattern

書籍だと、VB+design patternってのは沢山あるのですが、
VBA専門となると見つかりませんでした。

922 :デフォルトの名無しさん:2008/11/29(土) 08:07:51
エクセルVBAでユーザーとパスワードで制限されたネットワークドライブのディレクトリにあるファイルの
タイムスタンプとファイルサイズを取得することはできませんでしょうか?

923 :デフォルトの名無しさん:2008/11/29(土) 08:38:15
ネットワークドライブとは?

924 :デフォルトの名無しさん:2008/11/29(土) 09:27:04
>>923
社内LANで繋がれたネットワーク上のドライブですよ。
VB.netでやった方がいいのかな。

925 :デフォルトの名無しさん:2008/11/29(土) 09:29:22
別にどっちでやってもいいけど、Excelに関係ないことはここでは聞かないでね>>1★3,★4

926 :デフォルトの名無しさん:2008/11/29(土) 10:11:34
EXCEL VBAで将棋とか囲碁とかオセロって作れますか?

927 :デフォルトの名無しさん:2008/11/29(土) 10:36:38
>>926
作れます。でも>>1

928 :デフォルトの名無しさん:2008/11/29(土) 12:07:56
>>924
「ドライブ」って何?

929 :デフォルトの名無しさん:2008/11/29(土) 12:42:28
http://e-words.jp/w/E3838DE38383E38388E383AFE383BCE382AFE38389E383A9E382A4E38396.html

930 :デフォルトの名無しさん:2008/11/29(土) 13:45:58
FormulaR1C1って何?
Range("A1").FormulaR1C1 = "hello"

Range("A1").Value = "hello"
だと何が違うの?

Range("A1").FormulaR1C1 = "=R[1]C + R[2]C"

Range("A1").Value = "= A2 + A3"
も同じ結果になるね。

FormulaR1C1はダブルコーテーションの中をパースして「あ!RとかCがあるからこれはセルだな!」とか
独り言をつぶやきながらR[1]CをA2に置き換える作業をするところがValueへの代入と違うトコなの?




931 :デフォルトの名無しさん:2008/11/29(土) 14:56:42
>>929
で?

932 :デフォルトの名無しさん:2008/11/29(土) 14:57:34
>>930
a = 1とa = 1; b = aと何が違うの?

933 :デフォルトの名無しさん:2008/11/29(土) 15:38:07
>>929
記法の違い

934 :デフォルトの名無しさん:2008/11/29(土) 16:03:19
VBA BrowseForFolder この引数について、詳しく
書いてあるサイトありませんでしょうか。

935 :デフォルトの名無しさん:2008/11/29(土) 17:07:52
あまりの酷さに涙が出てきた・・・。

936 :デフォルトの名無しさん:2008/11/29(土) 18:49:18
たしかにムンバイのテロは酷かったなあ。
死者が200人を超えるとも言われてるし。

937 :デフォルトの名無しさん:2008/11/30(日) 10:08:03
Vista 2007です。
VBAって参考本みると簡単な操作で
いかにも思考ルーチンなんか作れなさそうなんですが
そんなことはないのですか?

VBAって入門書が多くて上級本がないように思うのですが

938 :デフォルトの名無しさん:2008/11/30(日) 10:09:09
なに思考ルーチンって
オセロとか将棋か?

939 :デフォルトの名無しさん:2008/11/30(日) 10:10:29
VBAで行う必要はありません。

940 :デフォルトの名無しさん:2008/11/30(日) 16:10:21
入門書いらないレベルなら自分で考えればいいじゃん

941 :デフォルトの名無しさん:2008/11/30(日) 17:57:52
>>937
言語の能力としては可能だが、VBAで組む必然性がない


942 :デフォルトの名無しさん:2008/12/01(月) 00:16:33
複雑なアルゴリズムならVBAでやらないほうがいい。
言語としての記述力に欠ける。

943 :デフォルトの名無しさん:2008/12/01(月) 00:21:26
あんな入力中にいちいちエラーだとか騒がれたんじゃ
落ち着いて作れないしな。


944 :デフォルトの名無しさん:2008/12/01(月) 14:01:57
Cとかで書いておいたアルゴリズムをモジュールとして
VBAに取り込む方法があるんですか?

945 :デフォルトの名無しさん:2008/12/01(月) 14:36:08
>>944
APIが使えるから似たような感じでなら使えるんじゃないかな?
自作DLLではやったことないけど

946 :デフォルトの名無しさん:2008/12/01(月) 16:53:26
Cの関数でDLLを作ってDeclareで取り込むか、ActiveX(COM)コンポーネントとして作って
「参照」で取り込むかのどちらか。
前者の方が簡単。

947 :デフォルトの名無しさん:2008/12/01(月) 17:37:53
VBから逃げたいだけなら、
JavaScriptを使うか(もちろんScriptのCOMを使って)、
WSHでXML書いてCOMオブジェクトに仕立てあげるか。

948 :デフォルトの名無しさん:2008/12/01(月) 20:13:06
VBAは専門家の人から見ると、エクセルの補助的なものに使用するという認識ですね。

949 :デフォルトの名無しさん:2008/12/01(月) 20:15:46
>>943
チミプログラム書いたことないでしょ?w

950 :デフォルトの名無しさん:2008/12/01(月) 20:41:52
エラーチェックはオプションで切れる

951 :デフォルトの名無しさん:2008/12/01(月) 22:06:24
XP&Excel2003で、フォーム上にコンボボックスを作りました。
コンボには複数のアイテムを入れるんですが、
その中で最も長いアイテムを表示できるよう、
最初に表示する時点で自動的にサイズ調整はできるでしょうか?


952 :デフォルトの名無しさん:2008/12/01(月) 22:24:33
VBAのコントロールなんてただでさえ標準コントロールのサブセットみたいな
扱いなのにそんな妙なところだけ親切(いや俺にはそんな機能が親切とは思えんが)
だったりするわけないだろう常識で考えて。。

953 :デフォルトの名無しさん:2008/12/02(火) 01:03:47
>>948
だってそれが主目的じゃん。
photo shop持ってるのに、paintでレタッチするようなもんだ。

954 :デフォルトの名無しさん:2008/12/02(火) 01:43:30
>>948
別にExcelにひっつける必要はないと思うよ。
MSXMLでXMLをいじくったりしてるし。適当なVBのメモパッドだと思えば。

Excelだとデータをそのままシート上で
表現できるからいろいろとぬるぬる処理できて便利なんだよね。

>>951
自分で文字列の長さ測って適当なサイズ設定してあげるしかないんじゃないかな。
プロポーショナルフォントはもちろん解除してね。

955 :デフォルトの名無しさん:2008/12/02(火) 10:36:10
>>951
自動で調節する方法はない。
どこか作業列にアイテムを入れてセル幅を自動調節して結果をチェックするのが一番簡単。
完璧にやるならWin32APIのGDI関数で文字列の幅を取得。

956 :デフォルトの名無しさん:2008/12/02(火) 21:22:57
Excel VBAの良書ありませんか?

業務でたくさんの仕様書を書いたりしているわけですが、
作った大量のブックの書き方が間違っていた場合など、
これを一つ一つ開いて、手で同じセルに同じ文字を打ち込むわけです。
これがバカらしいのでマクロを作りたいです。
当然必要になるであろう機能といえば、マクロでブックを開くとか、上書きするとか、閉じるとか、上書きで閉じるとか。。
つまりこういうことをするのに便利なリファレンスマニュアル的な本が良いです。
三角関数だの、キューブだの、そんなものはどうでも良くて。
で、逆引き系で、「ブックを閉じるには」っていう一見気の利いた見出しが合って
開いてみると、実はブックの閉じ方だけが載っていて、関連するであろう
「保存して閉じる」とか「上書きで閉じる」とかそういう機能はまったく触れてないような
やっつけハウツー本はいらないです。

m(_$_)mよろぴこ


957 :デフォルトの名無しさん:2008/12/02(火) 21:28:20
最近VBA本の質問多いけど、本見るよりもググった方が早いと思うけど

958 :デフォルトの名無しさん:2008/12/02(火) 21:37:27
ああ。そうだよねぇ。普通そうだよね。そうなんですよ。
でも客先だとグーグル禁止なの。・゚・(ノД`)・゚・。

959 :デフォルトの名無しさん:2008/12/02(火) 21:59:55
>>958
VBAのヘルプ以上のことが書いてある本はまずない気がする。
というか、VBAなんてヘルプがあれば当たり前の作業は当たり前にできるでしょ。
Win32API使わないとできないようなこと(まあ普通に多い)が書いてある本はまずない。

まず客を説得することを考えるべきだろうね。
客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。

しかし、そんなレベルの人を使ってる「客先」が気の毒になるな。

960 :デフォルトの名無しさん:2008/12/02(火) 22:08:11
グーグル禁止どころかネット禁止の職場なんていくらでもあるが

961 :デフォルトの名無しさん:2008/12/02(火) 22:12:00
合理性の話をしているのであって「ある/ない」の話なんぞした覚えはないが。
しかし、なんて馬鹿って得意げなんだろう。
20年30年生きてりゃ自分の知能が如何程かわからんわけでもあるまいに。

962 :デフォルトの名無しさん:2008/12/02(火) 22:15:05
> まず客を説得することを考えるべきだろうね。
> 客が余程の馬鹿か君の説明能力が欠如してなきゃweb閲覧ぐらい許可するでしょ。
許可するしないとか問題外なの
どうやっても"できない"職場なの

963 :デフォルトの名無しさん:2008/12/02(火) 22:17:34
俺はエスパーじゃないからそんなこと知るかよ。
>>958になんて書いてあるんだよ。
久々に見たわこんなトンチキ。

964 :デフォルトの名無しさん:2008/12/02(火) 22:19:19
久々に見たわこんな上から目線のやつ。

965 :デフォルトの名無しさん:2008/12/02(火) 22:21:30
禁止というか、そもそもそこにネット回線が引かれてないとかね。

966 :デフォルトの名無しさん:2008/12/02(火) 22:22:09
>>962
その通り。

そしてWebの許可をもらうとかそういうことは論点でもない。>なんかやたら威勢の良い世間知らずの方

967 :デフォルトの名無しさん:2008/12/02(火) 22:22:58
ExcelVBAでユーザーコントロールって作れる?

968 :デフォルトの名無しさん:2008/12/02(火) 22:37:57
>>966
>>958本人かどうか知らないが、そういう台詞は状況を正確に書いてから言ったらどうだ。
まあこの手の馬鹿に何いっても無駄だろうけど。

969 :デフォルトの名無しさん:2008/12/02(火) 22:40:09
まあこの手の自意識過剰で偉そうぶった馬鹿は何いっても無駄だろうけど。

970 :デフォルトの名無しさん:2008/12/02(火) 22:46:38
Excelに付属のオフラインヘルプだとちょっと足りないんだよなあ。
昔はMSDNのCDに詳しい追加のヘルプファイルが入ってたけど、今でもそういうのはあるんだろうか。
VBとWIN32のヘルプをノートパソコンに入れて持ち歩いてたよ。

とりあえず持ち歩くなら技術評論社のポケットリファレンスが小さくてオヌヌメ。内容はちょっと薄いけど
ちょっとセルにデータを入れたいとか簡単なプログラミングならこれで十分。
ttp://www.amazon.co.jp/dp/4774135674

971 :デフォルトの名無しさん:2008/12/02(火) 22:47:20
本の有無を質問するのにネットワーク環境まで書きたくないです。もう良いです。

972 :デフォルトの名無しさん:2008/12/02(火) 22:48:25
と、思ったら>>970
ありがとうございます。早速チェックします。

973 :デフォルトの名無しさん:2008/12/02(火) 23:16:01
よく書店に売ってる分厚い本でいいと思うんだけどなあ。
正直、必要な記憶つったって仕様書とか扱うだけならごくごくわずかだし、
リファレンスが必要とは思えない。
分厚い本の最初だけ懇切丁寧にやって
後は興味のあるプロパティとメソッドだけおぼえりゃしたいこと出来る。

974 :デフォルトの名無しさん:2008/12/02(火) 23:35:46
モバイル持ち込むか、ダメなら携帯でググれよ。
馬鹿か?

975 :デフォルトの名無しさん:2008/12/02(火) 23:39:41
俺秀和システムの「〜大全」の本、仕事半分趣味半分で10冊以上は持ってるけど、
いざって時にピンポイントで役立つのはやっぱネットの情報だなぁ
先人はみな自分が考えるような疑問や壁に既にブチ当たっているものであり、
自分が天才か途方も無いアホでない限り、そこには大体たどり着けるしね

でもそれ専門で食ってでもない限り、少しずつ腕は錆びるものだし
覚えた知識もすぐに薄れていくから、それを繋ぎとめるためにも書籍はやっぱ必要
俺は自宅のトイレで本読む癖あるから、半書斎化してるよ


976 :デフォルトの名無しさん:2008/12/02(火) 23:41:02
>>974
ネットが駄目というくらいだから、持ち込み制限とかありそう。

977 :デフォルトの名無しさん:2008/12/02(火) 23:43:09
持ち込みとか当然無理に決まってるだろう。
携帯は仕事中にいじるのは良くおもわれないからひかえてる。
いちいち「VBAの文法調べてるんですよ」とか弁護しながら使うのは嫌だw

978 :デフォルトの名無しさん:2008/12/03(水) 00:10:24
無能だと思われるのは気にしないんだ。
好きにすれば?

979 :デフォルトの名無しさん:2008/12/03(水) 00:11:16
>>977
間違いなくお前さんが勝手に思い込んでるだけ。
いや正確に言うと、「そう思い込むことにした」だけ。
自分のコミュニケーション能力の欠如を直視する代わりに、ね。

だから余程馬鹿な客でもなければ、「自分が雇ってる人間の生産性の向上に繋がること」
=「自分が得すること」を拒否なんかするかよ。

本当最近こういう社会人として最低限のコミュニケーション能力が欠如してる奴が多くて困るんだよ。

980 :デフォルトの名無しさん:2008/12/03(水) 00:16:27
日本国内でラボに携帯電話、ノートパソコン、USBメモリなど一切持ち込み禁止の会社なら知ってるけど、
書籍の持ち込みまで禁止ってのはちょっと聞いたことがない。
たぶん俺が知らないだけなんだろうけど、世界は広いんだなあ。

981 :デフォルトの名無しさん:2008/12/03(水) 00:20:31
俺の職場は入館するときに金属探知機通るんだぜ

982 :デフォルトの名無しさん:2008/12/03(水) 00:21:03
>>979
また上から目線w

983 :デフォルトの名無しさん:2008/12/03(水) 00:58:35
勝手に下にいるだけだろ

984 :デフォルトの名無しさん:2008/12/03(水) 01:17:07
>>979
ここは社会人指南スレッドじゃありませんので、
いい大人が説教こくのはやめてください。

985 :デフォルトの名無しさん:2008/12/03(水) 01:20:17
http://q.hatena.ne.jp/1216705790

こちらの質問者と同じことをしたくて
マクロをいじっているのですがうまくいきません。
どなたか助けていただけないでしょうか?

986 :デフォルトの名無しさん:2008/12/03(水) 01:26:13
>>985
hatenaを読んでも判らないのならhatenaで聞くか諦めるのが宜しいかと。

987 :デフォルトの名無しさん:2008/12/03(水) 01:34:27
メモ帳に張る必要はないんじゃ?
ただ単にセルにある値を順に.txtで保存するだけでしょ。

988 :デフォルトの名無しさん:2008/12/03(水) 01:38:42
実はデータが2000ほどあってとても手作業では・・・

.write Replace(ActiveSheet.Cells(i, 2).Value, vbLf, vbCrLf)

の部分で引っかかってしまって。

989 :デフォルトの名無しさん:2008/12/03(水) 01:56:00
>>988
Sub a()
  F = "c:\data1\"  'フォルダ指定
  r = 1
  While Cells(r, 1) <> ""
    Open F & Cells(r, 1) & ".txt" For Output As #1
    Print #1, Cells(r, 2)
    Close #1
    r = r + 1
  Wend
End Sub

990 :デフォルトの名無しさん:2008/12/03(水) 02:03:26
>>989さま

本当にありがとうございます。
助かりました!

991 :デフォルトの名無しさん:2008/12/03(水) 08:03:12
入門書を読んだだけの私にはサッパリ・・・

992 :デフォルトの名無しさん:2008/12/03(水) 08:24:40
>>984
いい大人じゃないだろ。社会経験ほとんどない青二才丸出しだろ。


993 :デフォルトの名無しさん:2008/12/03(水) 09:09:28
>>979
Web閲覧を許可した場合のリスクとメリットの比率の問題だろ
メリットのほうが大きく上まれば許可するかも知れんが
そんなことはまずないなw

ところで誰か次スレを・・・

994 :デフォルトの名無しさん:2008/12/03(水) 19:54:07
てか、その程度の事が出来ないような奴に仕事頼むなよ。
マジで。

995 :デフォルトの名無しさん:2008/12/03(水) 20:28:08
>>975
excelで判らないことがあるとトイレに駆け込む姿を想像した

996 :975:2008/12/03(水) 20:32:08
>>995
便意を催すとExcel本掴んですごい勢いで入る事は結構あるよw
まぁExcelに限らず専門書の類なら何でもだけど

997 :デフォルトの名無しさん:2008/12/03(水) 22:36:51
>>993
言っても無駄な相手だからw

998 :デフォルトの名無しさん:2008/12/03(水) 22:38:57
次スレをVBAを駆使して立ててください。

999 :デフォルトの名無しさん:2008/12/04(木) 08:43:49


1000 :デフォルトの名無しさん:2008/12/04(木) 09:07:58
1000なら次はなしw

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

292 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)