1 名前:デフォルトの名無しさん [2007/05/27(日) 00:06:58 ] ・まじめにExcelの機能を追及してみようと思う奇特なひと ・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと ・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと ・とにかく漏れにこんな仕事まわすなと怒っているひと そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです 前スレ pc11.2ch.net/test/read.cgi/tech/1168308855/
331 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:44:56 ] 初心者なのですが、質問させて下さい。 環境はWinXP+Excel2003です。 VBAでFor文を使ったネスト構造を作っています。 3階層のネスト構造の場合、 各変数x,y,zとして以下のロジックを作ってみました。 For i = 1 to 3 For j = 1 to 3 if i = j then exit for For k = 1 to 3 if j =k then exit for if k=i then exit for <処理> Next k Next j Next i 期待としては、同じ数が出たときだけスルーするロジックになって欲しかったのですが。 実際には、そうはならず、9パターン中、1-2-3と1-3-2と2-1-3と2-3-1と3-1-2と3-2-1の 6パターン処理されるつもりだったのに、2-3-1と3-2-1の2パターンしか処理されませんでした。 ロジックのどこがおかしいのでしょうか。 おそらく、exit for の設定を私が判っていないせいの様な気がするのですが…
332 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:03:30 ] そりゃぁ、exitでforから抜けちゃってるからねぇ。
333 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:06:37 ] うすうす気付いてるようだけど、ループのスキップではなく、ループの終了(Exit For)をしてるから 1=1でExit Forすると、以後の2〜3は処理されない For i = 1 To 3 If i = 1 Then Exit For Debug.Print i Next i で、2と3が出力されませんと言ってるようなもの 一致条件でExitではなく、不一致条件内に内部ループや処理を置けばいい
334 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:32:36 ] >>332 >>333 迅速なレスをありがとうございました。 やはり、Exit Forが悪いと言うことで、 当該部分を削除し、以下のように変更したところ、期待通りの結果が出来ました。 if i = j then elseif j = k then elseif i = k then else <処理> endif 適切なヒントを下さり、本当にありがとうございました。
335 名前:>326 mailto:sage [2007/07/08(日) 01:15:38 ] 引数に"TRUE"を使うからそうなる。 "TRUE"だと完全一致しなくてもデータを読んでしまうので "FALSE"(完全一致必須)にするのが一般的 蛇足すると、Sheet2がデータ専用なら行数を限定する必要は無い VLOOKUPのデータ元参照式には、参照範囲のズレを防ぐため普通$を付ける。 てことでこんなんが妥当かな。 =VLOOKUP(A1,Sheet2!$A:$B,2,FALSE) ところでここVBAスレなんだけど…
336 名前:321 mailto:sage [2007/07/08(日) 02:56:27 ] >>335 詳しく解説していただき本当に感謝です。 正直、TRUEやFALSEの意味もろくに分かっていなかった自分です。 スレタイだけ見てここで質問してしまい、大変お邪魔しました。
337 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:08:08 ] >>335 ExcelとVBAの質問スレらしいよ
338 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:55:16 ] ×ExcelとVBAの質問スレ ○ExcelのVBAの質問スレ 例えスレ立て主の意図が前者だろうと、2chの規則的には プログラム技術板でExcelのVBA以外の話は板違いになるからね
339 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 11:08:17 ] すこしスレ違いだが、皆さん大丈夫? ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070620/275328/ Excelレガシー問題
340 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 12:02:44 ] SOXで大変なのは全体最適を考えてこなかった その記事で言う情報システム部門の方なんじゃね? 未だ運用もはっきりしないのにあと半年少々でどうするんだろ。
341 名前:デフォルトの名無しさん [2007/07/08(日) 15:40:12 ] 80以下なら赤 90以下なら黄色 100以下なら緑 といったようにセルに入力された値によって 背景色が変わるという列を作りたいのですが どうすればいいのでしょうか?
342 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:35:29 ] それをVBAでしたいの? そうでなければスレ違い。条件付き書式ググれ。
343 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:57:28 ] 現在、Excelファイルが60,000ファイルほどあります。 その全ファイルから、一部分(一番上の5行ほど)だけ別のエクセルファイルにコピーするロジックを作りました。 ロジックの概要は以下の通りです。 処理の内容としては、すでに開いているブックから他のブックを開いて、必要な部分をコピー後にクローズさせています。 Set wb2 = Workbooks.Open(Filename:="aaa.xls") Set ws2 = wb2.Worksheets("Sheet1") <処理> ActiveWorkbook.Close saveChanges:=False Set newbook = Nothing 上のロジックでコピーを行っていると、最初の1,000ファイルぐらいはサクサクオープン/クローズの処理が出来るのですが、 段々オープン/クローズの時間が遅くなってきて、最期は「xxx.xlsはファイルが読み取り専用か、読み取り専用フォルダにあります(略)」 と表示され、ファイルオープンが出来なくなります。 なお、エラーが出るファイルも、一回Excelを閉じると、正常に表示できるので、ファイルが壊れているわけではなさそうです。 この場合、問題の原因がVbaなのか、ハードウェアなのか、OSなのかよく分かりません。 もし何かご存じのことがありましたら、教えていただけませんでしょうか。
344 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:15:00 ] 問題の原因はおまえのプログラム
345 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:04:23 ] >>343 お望みのことでなくて、恐縮ですけど、 60,000個のファイルから、それぞれ5行を別のエクセルファイルに コピーしていくと、300,000行になりますよ。 エクセルって、65,536行までないですけど... それに、何万行もあるファイルの操作は、それだけで、 処理がのろのろ...になるのは、避けようが無いと思ふ...
346 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:41:41 ] 大丈夫、今のExcelはもっと長い。 それはさておき、5行ずつ選択して選択範囲だけcsvで保存して、後でまとめてマージってのはどうだろう。
347 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 00:32:33 ] >>344 その可能性が高いとは思うのですが、どうも納得できない部分もあります。 具体的な原因をお教えいただけますか? >>345 私の説明が悪くて申し訳ないです。 実際には、5行分の内容を配列でまとめて、1行に流し込んでいます。 そのため、実際には1ファイル1行のサイズでコピーをしています。 ご指摘のあったとおり、確かに全てをコピーすると行が足りなくなる可能性が有ります。 私が欲しいデータは、全データ中の一番上と一番下の部分だけなので、 レスを頂いた後で、if文で一番上と一番下だけコピーするようにしたら、コピー行はほとんど無くなりました。 けれど、やはり1000ファイルを超えた当たりから、読み込みが遅くなり、 最期に読み込みエラーが出てきてしまいます。 >>346 おっしゃられるとおり、CSVにした方が良いのかも知れません。 とはいうものの、気になる問題が二つあります。 一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、 もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、 また、数千ファイルを読み込んだ時点でエラーが発生するかも知れないという不安です。 難易度はどれくらいでしょうか?
348 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:23:02 ] >>347 ひとつのsheetにまとめるかわりにcsv形式でまとめる openとwrite使えばOK エラーの原因はリソースを食いつぶすからだろ おそらくこれでだいぶリソースの使用が減ると思うが 全部処理できるかはわからない
349 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 07:11:07 ] > 一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、 知らなければ勉強すればいいだけ。生まれたときからこの世の全てを知ってる人間なんて居ない。 > もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、 問題ない。 以前約 6'140'000 個のcsvを扱ったことがある。(時間は掛かったけど、放置して置いたらエラーも出ずに無事完了) キミが扱う 60,000 個程度ならなんてことないはず。 当然csvはExcelにブックとして開かせるんじゃなくて、348も言ってるように直接ファイルにアクセスすること。 それについても解らなければ勉強しよう。 難易度は「入門者→初心者」の移行レベルくらい これが出来たら、VBA入門者(門を潜っただけ)ではなくVBA初心者(初歩的なことなら出来る)を名乗っても良い
350 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 10:13:29 ] >>343 newbookは開放してるけど、wb2やws2は開放しないのか?
351 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:34:56 ] Excel2003でユーザフォームをもちいて抽出フォームを作成しているのですが コマンドボタンを押すと 配列(多次元)のデータをユーザフォーム上に表示させるには どのパーツを使えばいいのでしょうか?
352 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:59:27 ] >>351 Grid系
353 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:42:18 ] >>352 Webで検索してもあまり情報が出てこないのですが オススメな参考書とかありますか?
354 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:01:16 ] >>351 listbox
355 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:21:22 ] >>348 >>349 レスをありがとうございました。 今日、超巨大書店でVBAの辞典を買って来て、OPENとかCSV形式での保存方法を勉強しました。 おかげさまで、今バックグラウンドでエクセルファイルをCSVファイルに変換するマクロ流してます。 23:15の時点で5,000ファイルほど変換できました。 変換スピードはあまり落ちていないので、余計なリソースを食うアプリを立ち上げないようにしておけば、 何とか最期まで行けるかも知れないと思い始めました。 で、今気がついたんだけど、エクセルのファイル数が実は600,000ファイルだったw ぶっ続けで処理を流しても4日位、電源OFFの時間を考えれば1週間位かかりそうです。 CSVファイルを読み込むのも出来ましたので、まだ問題はいくつか残ってますが、 何とか頑張れば出来そうな光明が見えてきました。 プライベートPC上でやっていると(今はホットゾヌ上から書いていますが)あちこちのアプリも重くなるので、 折を見て、変換&計算処理専用のマシンを購入した方が良いのかも知れないと思い始めました。 色々とヒントを下さって、ありがとうございました。
356 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:45:14 ] VBAはvariant使わずにきちんと宣言するのとしないのでは実行時間がかなり違ってくるよね。 膨大な処理をするときは1ファイルあたりの処理時間をきちんと計ってコードを組むとかなり早くなったよ。 10倍ぐらいは変わった。
357 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:06:57 ] Sub JoinTime() Cells(2, 3) = Cells(2, 1) & Text(Cells(2, 2), "hh:mm:ss") End Sub これを実行すると、 「コンパイルエラー::Sub またはFunctionが定義されていません。」 とエラーが出てしまいます。 どう対処すればよろしいでしょうか?
358 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:17:06 ] >>357 ↓を付け足す Function Text(a, b) Text = Format(a, b) End Function
359 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:25:40 ] >>358 できました。 すばやい、レスありがとうございました。
360 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:34:50 ] 超初心者の質問で申し訳ないです。。 VBAを使って、画面に表示された方向キー(↑↓←→)を押して、1分間にどれだけ成功できるか・・・ のような感じのゲームを作ることはできないものでしょうか? 頭の中でふと浮かんだのですが、プログラムを組もうとすると進めなくて困っています。 もしわかる方おりましたら、可能か不可能かだけでも結構ですので教えてくださいm(_ _)m
361 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:42:30 ] >>360 cgi30.plala.or.jp/chikada/vba/acd.shtml
362 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:48:41 ] >>361 誘導ありがとうございます。 スレ違いでした。失礼しました。
363 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:57:18 ] >>361 スレチだが、そこのCell雀の完成度の高さにびっくりした。
364 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:35:57 ] ExcelとVBAでマインスイーパー作ったりできますか
365 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:39:42 ] やる気と根気があればできるはず がんばれ
366 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:20:05 ] 暇で作った事あるけど同等のゲームならすぐ出来るよ。 UIまでコピーしようと思うとそれなりに大変だろうけど。
367 名前:デフォルトの名無しさん [2007/07/11(水) 00:10:18 ] >>339 excelをそのまま基幹で使う会社 なぞ、どうぞ逝ってくれ
368 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 18:47:02 ] medianをVBAで使ってたら特定の数列で無限ループしやがるorz しかも同じ数列単体で検証しても問題なし しょうがないからロジックくんだがこんな経験したことある人いる? XPでも2003でも再現した 数列ったってこんなんだぞ。0, 0, 0.6, 0
369 名前:デフォルトの名無しさん [2007/07/11(水) 21:55:59 ] 携帯から失礼します。 VBAはユーザーフォームを勉強し始めたレベルなのですが Win32 API の存在を知り、エラー音とかに使ってみたくなりました。 具体的にどのように記述すれば良いでしょう? ご教授いただけますか?
370 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:31:45 ] >>369 スレ違いもここまで来るか… pc11.2ch.net/test/read.cgi/tech/1181645965/ 嫌味ではなくVBAを勉強し始めたレベルでは意味不明だと思われ。 ざっと教授するだけで数百ページの本になる。
371 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:48:02 ] mciくらいならVBAでもすぐできるだろうに
372 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:10:39 ] ハマりました〜どなたか助けてください〜(´Д`;) 開発環境: Windows 2000, Excel 2000 要件: ダイアログ(フォーム)を使い、フォルダ名で、または新しいファイル名で、 後に使うファイル保存先パスを取得、変数に格納しておきたい。 追加事項: 保存先を指定してパスを取得するだけで、その時点ではファイルを開かない。 そこで、DialogオブジェクトやFileDialogについて調べているのですが… ・今一般的で情報の多いApplication.FileDialogは、2000にはないっぽい。 ・MSDNでは、Dialogオブジェクトについての説明が極端に少ないっぽい。 ・xlOpenFileでは、実現できないっぽい。xl〜定数は使えたり使えなかったり。 等などで、どっぷりハマッてしまいました。 タスケテー
373 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:28:36 ] >>372 ちょっと邪道だけどこんなのでどうかな? 動いたらBrowseForFolderのオプションは調べてくれ。 Dim Shell Dim Ret Set Shell = CreateObject("Shell.Application") Set Ret = Shell.BrowseForFolder(0, "選ばないか", 0) If Not Ret Is Nothing Then Debug.Print Ret.Items.Item.Path End If
374 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:54:13 ] ごめん 範囲Aと範囲Bの重なっているセルの取得って どうやるんだっけ? プロパティかなんかであった気がしたんだけど ヘルプ見てもみつからなかった(´・ω・`)
375 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 13:22:36 ] >>374 Intersect(範囲A,範囲B)
376 名前:374 mailto:sage [2007/07/12(木) 13:38:04 ] >>375 おぉありがとん(`・ω・´)
377 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:58:16 ] >>373 遅ればせながらレスありがd(・∀・) なんか、GetSaveAsFileNameっていうまんま直球どストレートな メソッド発見しますた〜お騒がせしました〜
378 名前:デフォルトの名無しさん [2007/07/12(木) 23:35:57 ] Sub Bound() ActiveSheet.UsedRange.Clear Columns("A:AO").ColumnWidth = 2 n = 1 Range("A1").Select Do While IsEmpty(ActiveCell.Offset(n, 0)) x = ActiveCell.Offset(n, 0).Row If x < 2 Or 30 < x Then n = -n For chien = 1 To 30 ActiveCell = "" ActiveCell.Offset(n, 0) = "○" Next chien ActiveCell.Offset(n, 0).Activate Loop End Sub 上下運動を2回繰り返して止めるにはどうしたらよいでしょうか? ご教授願います。
379 名前:デフォルトの名無しさん [2007/07/13(金) 00:11:06 ] exit do
380 名前:デフォルトの名無しさん [2007/07/13(金) 00:36:18 ] 378です。 どういう風に入れたら良いでしょうか? すみません、宜しくお願いいたします。
381 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 02:19:26 ] >>378 なにげに試したら楽しくなってきたので俺も適当に作ってみた 'API Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Const UpperBound As Long = 2 '1以下はエラー Const LowerBound As Long = 30 Const SleepTime As Long = 50 Const ico As String = "○" 'バウンドさせる文字 Const Col As Long = 1 '列(この辺は定数にしない方が斜めとかいけるから指定しない方が良さげ) Private Sub Down(ByVal Speed As Long) Dim r As Long For r = UpperBound To LowerBound Cells(r - 1, Col) = "" Cells(r, Col) = ico DoEvents Sleep SleepTime + Speed Next End Sub Private Sub Up(ByVal Speed As Long) Dim r As Long For r = LowerBound To UpperBound Step -1 Cells(r + 1, 1) = "" Cells(r, Col) = ico DoEvents Sleep SleepTime + Speed Next End Sub
382 名前:381の続き mailto:sage [2007/07/13(金) 02:33:11 ] Private Sub bound2() Dim BoundCount As Long For BoundCount = 1 To 10 Down -(BoundCount * 4) 'Downで表示されっばなのを削除 Cells(LowerBound, Col) = "" Up -(BoundCount * 4) 'Downで表示されっばなのを削除 Cells(UpperBound, Col) = "" Next End Sub updownの引数で加速と減速可能にっ! この調子でいけばブロック崩しとかできんのかね? で、378の質問に全く答えない俺w なんてのは可愛そうなんで、 >>380 上下した時に「1回上下したとカウント」して カウントが2になったらExit Doすればok どこで1回上下したかを判断する場所は 自分でコード組んだならわかるっしょ?
383 名前:デフォルトの名無しさん [2007/07/13(金) 09:46:41 ] >>381 さん・・・ >378です。 学校の課題で・・・ for nextを使用して動いたマス目で2回動いた事にしていたのですが、 それでは不十分と言う事で・・・(TT) 試行錯誤して早7日目・・・ どうしようもなく、皆様にお知恵を拝借しようとした次第です。 宜しければ教えて下さいませ。
384 名前:デフォルトの名無しさん [2007/07/13(金) 10:30:54 ] 不十分の意味がわからない、どうしたいんだ
385 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 11:28:40 ] >>383 >If x < 2 Or 30 < x Then n = -n 反転の判定をしている、ここで処理してもらいたかったんじゃないのか?
386 名前:384 [2007/07/13(金) 14:36:56 ] 俺は>>381 じゃないが、そういうことならこれで If x < 2 Or 30 < x Then n = -n: i = i + 1 If i > 3 Then Exit Do
387 名前:デフォルトの名無しさん [2007/07/13(金) 20:01:34 ] 会社での昼休み、 ウイルスバスターが動いててすごく重いけど、 どうしても直したいマクロがあって、開いていじってた。 PCがフリーズした。 PCの電源を切って再起動したら、マクロもろともExcelファイルが破損してた。 「アプリケーションの回復」でも回復できない、深刻な破損との事。修復不可能。 こういう時に限ってバックアップとってない。 マクロもエクスポートしてない。 仕方ないので、いちから作り直した。 バックアップは、きちんと取りましょうという教訓でした…
388 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 21:53:28 ] 教訓というか初心者以外では常識だよね というか、うちでは世代別バックアップを取るマクロをExcel起動と同時に自動で回しっぱなし \backup\yyyy_mm_dd\FileName\[yyyy_mm_dd-hh_mm__ss]FileName.xls にバックアップが自動保存され、前日以前の物があれば日付単位で個別圧縮(cab)して 退避ディレクトリにコピー、更に1週間以上前の物は退避ディレクトリの書庫は残して バックアップディレクトリのファイルは削除 ここまでは自動で、退避ディレクトリの書庫を定期的にメディアに焼くのだけは手動 まあメディアに焼いたところで、トラブル時もHDD上の1週間分だけで復旧は事足りることがほとんどだけどね
389 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 21:55:37 ] FolderShareをつかって他のパソコンと同期させておくだけでも最低限のバックアップにはなると思う。
390 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 22:24:26 ] 俺はソフトで差分バックアップしてる 重要なデータExcelだけじゃないし楽だし早い
391 名前:デフォルトの名無しさん [2007/07/13(金) 23:27:17 ] >>381 さん >>386 さん >378です。 ご教授頂き有難うございます。 >>386 さんのを使用して出させて頂きました。 有難うございました!
392 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 09:54:31 ] >>390 外部からだと作業の途中経過のバックアップは取れないからな 問題が起きたときに前回保存時まで戻されるのは勘弁してほしいってデータは 外部の汎用バックアップソフトではなく、内部のマクロで途中経過のバックアップを取った方がいい
393 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 12:56:32 ] バックアップとは言え、マクロ動かしっぱなしにしてたらメモリ食わない?
394 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 13:32:56 ] >>392 俺の使ってるソフト、圧縮機能はない www.forest.impress.co.jp/lib/sys/file/syncbackup/bunbackup.html 開いているファイルでもバックアップできるし作業途中で保存していればその分更新される Officeのように自動保存機能があるソフトならより万全 途中経過が保存される前にPC固まったら駄目だけど、そのマクロも同じだろ?
395 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 18:04:44 ] >>393 当然食うよ 搭載メモリ量の10000分の1以下だから気にならないけどね >>394 マクロの場合 > 作業途中で保存していれば なんて条件は付かない 保存もマクロでやるからね Officeの自動保存機能はバグあるし
396 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 10:15:02 ] VBA画面だとスクロールボタンが使えなくて不便だな。 ぐぐったら「Intelipoint 4.1を入れると直る」と出てきたけど、 うちのMicrosoftマウスはこのバージョンに対応してないしな。
397 名前:デフォルトの名無しさん [2007/07/16(月) 12:01:06 ] Excel2000のVBAプログラミングでウィザード形式のユーザーフォームって つくれますか? StarSuiteのBasicにはその仕様があるのですが、 VBAに関してはググってもなかなか直に解説してあるページがみつからなくて。 現在、同じサイズのユーザーフォームをいくつか用意してそれを順番に表示させる ことで「ウィザードもどき」にしているんですが・・・・
398 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 20:33:23 ] >>397 コンテナになるコントロール使えば良いだけの話 これで解らなければあとはVBAではなくVBの分野なので そっちの方向で勉強してね
399 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 00:11:19 ] >>398 どうも有難うございます。調べてみます。
400 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:11:14 ] 学校の課題で、セルA1〜A10 にそれぞれ10,20,30……100と表示し、その和をB1に表示するプログラムを作成せよ。 という課題が出て、試行錯誤してたのですが、詰まってしまいました。 ヒントとして、↓が出ていて、その通りにやったつもりなのですが、セルA1〜A10にはゼロしか出てこなくてorz 1.次元数10の配列を宣言し、Forループを利用して数値(10~100)を作成する。 2.Forループを利用して和を計算する 3.Forループを利用して数値(10〜100)を表示する。 4.和を表示する。 ↓がいま現在のプログラムです。 Sub 課題1() Const N = 10 Dim A(N) For T = 1 To 10 A(N) = A(T) * 10 Next T S = 0 For j = 1 To N S = S + A(j) Next j For C = 1 To 10 Cells(C, 1) = A(N) Next End Sub どなたかご教授願います。
401 名前:A(T) * 10じゃなくてT * 10 mailto:sage [2007/07/17(火) 10:40:03 ] >>400 それのどこがVBAの質問なのかと。basicの基本以下のレベルジャマイカ。
402 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 11:21:45 ] >>400 debug.printから出直せ。その方が君の為だ。
403 名前:>>401 それを指摘するならA(T) = T * 10だな mailto:sage [2007/07/17(火) 11:27:02 ] >>400 ループ制御変数と個数の定数が混在しているぞ。
404 名前:デフォルトの名無しさん [2007/07/17(火) 14:52:21 ] 最近の学校の課題はエクセルVBAをやらせるのか…。 >セルA1〜A10にはゼロしか出てこなくてorz ↑当たり前だ。403の名前欄を参照。 >Cells(C, 1) = A(N) ↑全部のセルに同じ値が出るに決まってるだろ。 まさかプログラマを目指してるとか言わないよな?
405 名前:400 mailto:sage [2007/07/17(火) 18:14:05 ] 400です。皆さんのレスを参考に17:00から試行錯誤し直してやっと完成したので報告します。 下のプログラムで表示させることができました。本当、ありがとうございました。 Sub 課題1() Const N = 10 Dim A(N) For T = 1 To 10 A(T) = T * 10 Next T S = 0 For j = 1 To N S = S + A(j) Cells(j, 1) = A(j) Next j S = 0 For c = 1 To N S = S + A(c) Cells(1, 2) = S Next c End Sub
406 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 18:19:26 ] Dim a(10) For i = 1 To 10 a(i - 1) = i * 10 Next s = a(0) For i = 2 To 10 s = a(i - 1) + s Next For i = 1 To 10 Range("A" & CStr(i)) = a(i - 1) Next Range("B1").Value = s
407 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:54:41 ] >>405 どう見てもこの後ループを纏めることになるので、先回りしておけ。
408 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 13:21:11 ] 開いていないファイルのセルデータをVBAで直接取得する方法ってありますか? 現状はセルに式を入力してから変数に代入、セルを削除 または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
409 名前:デフォルトの名無しさん [2007/07/18(水) 13:27:58 ] バイナリ解析して直接描くならひらかずにどうぞ
410 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 13:44:57 ] >>408 そのファイルがCSVならそれほど難しくないでしょう。
411 名前:408 mailto:sage [2007/07/18(水) 14:12:48 ] >>409 難しくて私には分かりません >>410 ファイルはCSVではなくEXCELブック形式です ファイルを開けば A = Workbooks(ファイル名).Sheets(シート名).Range(範囲) で取得できるのでどこかを少し弄ればどうにかなるのかなと思ったんですけど・・・
412 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 14:21:39 ] 内部的に開いていいなら(表示はしない)簡単だけど、全く開かずとなると無理っす バイナリ解析するにも先ずはファイルをOpenしないと始まらないし
413 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 16:03:15 ] >>412 どうやら無理そうですね 開かずに済むセルに入力して・・・ の方法で処理しようと思います ありがとうございました
414 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 18:48:05 ] >>408 VBAじゃないけど参照で良ければ。 ='c:\Documents and Settings\hoge\My Documents\[book1.xls]Sheet1'!a1 とか
415 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 20:21:15 ] >>413 VBA以前のExcel4マクロ(だっけ)なら簡単にできるはず。 Excelの関数と同じくVBAから使用することも可能 ヘルプは英語版ならMSから無料で落とせる。
416 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 20:29:52 ] とりあえずサンプル見つけたので>Excel4マクロ Cells(1, 1) = Application.ExecuteExcel4Macro("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") ttp://oshiete1.goo.ne.jp/qa373903.html
417 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 21:21:50 ] そのExecuteExcel4Macro使う方法が>>412 も言ってる > 内部的に開いていいなら(表示はしない)簡単だけど の方法でしょ。でも、これだって開いてないわけではないので、この方法では嫌なんだとさ。 内部的に開いて良いなら他にもいくつか方法はあるんだけどね。 因みにExecuteExcel4Macroを使ってセルの値を取得する方法は かなり有名で解説サイトはいっぱいあるから英語版ヘルプなんて必要無いが 空セルを取得すると空文字やEmpty値ではなく0が返ってくるという不都合がある。 つまり、数値の0が入ってるセルと何も入ってないセルを区別出来ない。
418 名前:デフォルトの名無しさん [2007/07/18(水) 22:05:36 ] 皆さん、MSOfficeのスキル高そうですけど、関係する資格などはお持ちですか? 私の勤める会社は、持っている資格を全て棚卸して一覧にまとめよ、なんて御触れが出ました。 ひけらかしたい奴は全部書くし、変なプロジェクトに引っ張られたくない人は応分に隠し、 こんなに資格もってんならウチにいなくてもなんとかなるだろう、とリストラの対象になりたくない人は適当に描いていました。 スキルを保有するのはいいが、ヘタに見せると悪影響があるなんて、初めて知った2007年の夏でした。
419 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 22:11:08 ] >>417 > この方法では嫌なんだとさ。 たぶん内部的に開くの意味よくわかってないだけだと思うが >または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです これが嫌なんだろう
420 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 00:00:30 ] VBAで配列の宣言時に初期化ってできないのですか? 下のようにできると聞いたのですが、実際やってみると「=」が駄目なのか コンパイルエラーになってしまいます。 Dim Moji() As String = {"ABC", "DEF", "GHI"}
421 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 00:37:15 ] VBならできるけどVBAは駄目です
422 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:03:09 ] そんなことはない
423 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:06:18 ] 正確にはVBの2002以降ね VBでもVB6では出来ないし、当然VB6準拠のVBAでも出来ない VB6で出来ることはコントロールと特殊なオブジェクト絡み以外ほとんどVBAでも出来るから問題ないが VB2002で大きく変わったので、VB2002以降用の解説読んでそれをVB6やVBAでやろうとして 出来なくて混乱しちゃう奴って結構居るみたいだね
424 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:13:42 ] Dim Moji() As Array("ABC", "DEF", "GHI")
425 名前:デフォルトの名無しさん[ mailto:sage [2007/07/19(木) 21:44:55 ] VB6でもArray使えば、配列の初期化できるのか。でも、多次元は無理なのかな
426 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:25:34 ] VBAでSub プロシージャでは値渡しも参照渡しもできるのですが Func プロシージャでは値渡ししかできません。参照渡しのやり方ってどうやるのでしょうか。
427 名前:デフォルトの名無しさん [2007/07/19(木) 23:29:02 ] ByVal?
428 名前:デフォルトの名無しさん [2007/07/19(木) 23:29:40 ] ごめんちがた
429 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:00:33 ] >>426 普通にできるだろ
430 名前:426 mailto:sage [2007/07/20(金) 00:25:26 ] ↓こんな感じの作ってやってみたけど、表示されるのは"A" ちなみにFunction→Subに変えたらちゃんと"B"が表示されます。 使い方がまずいのでしょうか? Sub test() Dim tmp As String tmp = "A" func1 (tmp) MsgBox tmp End Sub Function func1(ByRef tmp As String) tmp = "B" End Function
431 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:31:45 ] Sub test() Dim tmp As String tmp = "A" c=func1(tmp) MsgBox tmp End Sub Function func1(ByRef tmp As String) tmp = "B" End Function